目 录
前 言 1
第1章 系统总体方案设计 4
§1.1 系统任务描述 4
§1.2 控制系统要求 4
§1.3 方案设计与论证 4
§1.3.1 小车载体选择 4
§1.3.2 主控制器选择 5
§1.3.3 传感器选择 5
§1.3.4 电机驱动选择 6
§1.3.5 稳压电源选择 7
§1.3.6 智能小车系统最终方案 7
§1.4 系统总体设计 8
§1.4.1 系统组成 8
§1.4.2 系统工作原理 8
§1.5 本章小结 9
第2章 硬件设计 10
§2.1 主控电路设计 10
§2.1.1 FPGA硬件结构简介 10
§2.1.2 最小应用系统设计 12
§2.2 电机驱动电路的设计 15
§2.2.1 智能小车系统驱动电机的要求 15
§2.2.2 直流电机调速原理 16
§2.2.3 L298N电机驱动原理 17
§2.3 障碍物检测电路设计 22
§2.4 报警电路设计 23
§2.5 稳压电源电路设计 24
§2.6 系统整体电路设计 25
§2.7 本章小结 26
第3章 软件设计简介 27
§3.1 主程序模块 27
§3.1.1 程序控制设计 27
§3.1.2 主程序流程图 27
§3.2 初始化模块 29
§3.3 延时模块 29
§3.4 中断模块 29
§3.5 报警模块 29
§3.6 驱动模块 29
§3.7 本章小结 30
第4章 系统的仿真与调试 31
§4.1 仿真步骤 31
§4.2 系统调试 31
§4.2.1 硬件调试 31
§4.2.2 软件调试 32
§4.2.3 联合调试 32
§4.3 本章小结 32
结 论 33
参考文献 34
致 谢 35
附 录 36
第1章 系统总体方案设计
§1.1 系统任务描述
该系统的任务就是让智能小车在行进的过程中,能够自动检测存在的障碍物、并且采取有效的措施。
§1.2 控制系统要求
该控制系统要满足以下几点要求:
(1)能对车体四周的环境进行探测以获得障碍物的存在情况。
(2)实时性要求。
(3)交互功能。主要是设定小车正常行进、转弯时驱动电机的速度;初始化系统时的一些参数设定。
(4)驱动电机稳速运行要求。
(5)控制系统工作可靠、耐用,抗干扰能力强。
§1.3 方案设计与论证
§1.3.1 小车载体选择
由于水平有限无法制作出双足行走小车,因此本设计选择小车作为智能小车系统的载体。
方案一:自己设计制作车架
自己制作小车底盘,用两个直流减速电机作为主动轮,利用两电机的转速差完成直行、左转、右转、左后转、右后转、倒车等动作。减速电机扭矩大,转速较慢,易于控制和调速,符合小车的要求。而且自己制作小车框架,可以根据电路板及传感器仿真需求设计空间,使得车体美观紧凑。但自己制作小车设计制作周期较长,且费用较高。
方案二:购买玩具电动车
玩具电动车价格低廉,有完整的驱动、传动和控制单元,其中传动装置是本设计所需的,缩短了开发周期。但玩具电动车采用普通直流电机驱动,带负载能力差,调速方面对程序要求较高。同时,玩具电动车转向依靠前轮电机带动前轮转向完成,精度低。
综合考虑到制作周期和精度问题,最终选择了在淘宝购买小车车体零部件自己组装。这样不仅精度有保障,也增加了设计的灵活性。
§1.3.2 主控制器选择
处理器可以选择采用DSP或51FPGA,DSP适合用于控制电机,功能强大。51FPGA应用广泛,能满足一般控制的需要。由于对51FPGA比较熟练,价格便宜,而DSP控制相对而言复杂,故采用51FPGA。
市场上流通很多种类的FPGA,在一般性能上都可以达到要求,例如AT89C51、ATFPGA等都可以用于控制小车,唯一缺点在于不能在线下载,造成了不便的烦恼,下载器,AT系列FPGA价钱比较贵,不利于小资本实验。而STC系列FPGA价钱容易接受,可以在线下载,下载器也比较容易购买到,方便携带应用。故本设计采用FPGA作为该智能小车系统控制模块的核心,通过FPGA利用程序来精确控制小车的运动,从而实现对小车的自动控制,在对于智能小车系统的控制方面,FPGA是一个超低功耗,和标准51系列FPGA相比较具有运算速度快,抗干扰能力强,支持ISP在线编程,片内含8k空间的可反复擦写1000次的Flash只读存储器,具有256 bytes的随机存取数据存储器(RAM),32个I/O口,3个16位可编程定时计数器。其指令系统和传统的8051系列FPGA指令系统兼容,降低了系统软件设计的难度,电路设计简单、价格低廉。且在运用过程中FPGA的精确度和运算速度也都完全符合系统的要求。
综合以上分析选用了比较普通的且更为熟悉的FPGA为整个系统的控制核心。
§1.3.3 传感器选择
方案一:使用超声波传感器
在壁障模块中,可以选择超声波壁障。其优点是反应速度灵敏,距离远。但由于声波衍射现象较严重,且波包散面太大,易造成障碍物的错误判断。超声波受环境影响较大,电路复杂,而且地面对超声波的反射,会影响系统对障碍物的判断。
方案二:使用视频采集处理装置
使用CCD实时采集小车前进路线上的图像并进行实时传输及处理,这是最精确的障碍物信息采集方案,可以对障碍物进行精确定位和测距。但是使用视频采集会大大增加小车成本和设计开发难度,而且考虑到本设计的小车只是进行简单的,因而使用视频采集在实际应用中是个很大的浪费,所以本设计放弃了这一方案。
方案三:使用红外传感器
使用红外传感器,这是一种集发射与接收于一体的光电传感器,其有效探测距离3~80cm可调,且抗外界背景光干扰能力强,价格便宜、易于装配、使用方便,可在日光下正常工作(理论上应避免日光和强光源的直接照射)。
相比方案一与方案三,由于两者价格相差不大,红外传感器体积更小,精度更高,反应更快,因此,本课题将采用红外传感器来实现智能小车的。
§1.3.4 电机驱动选择
方案一:采用继电器控制
采用继电器对电动机的开或关进行控制,通过开关的切换对小车的进行调整。此方案的优点是电路较为简单,缺点是继电器的响应时间慢,易损坏,寿命较短,可靠性不高。
方案二:使用分立原件搭建电机驱动电路
使用分立原件搭建电机驱动电路造价低廉,在大规模生产中使用广泛。但分立原件H桥电路工作性能不够稳定,较易出现硬件上的故障,故本设计放弃了这一方案。
方案三:使用L298N芯片驱动电机
L298N是一个内含两个H桥的高电压大电流双H桥式驱动芯片,输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用FPGA的IO口提供信号,而且带有使能端,方便PWM调速,电路简单,性能稳定,使用比较方便。L298N芯片可以驱动两个二相电机,也可以驱动一个四相电机,正好符合本设计小车两个二相电机的驱动要求。
因此,采用L298N芯片驱动电机。
§1.3.5 稳压电源选择
方案一:采用单一电源供电
这样供电比较简单,但是由于电动机启动瞬间电流很大,会造成电压不稳、有毛刺等干扰,严重时可能会造成FPGA系统掉电,使之不能完成预定行程。
方案二:采用双电源供电
电动机驱动电源采用5节五号电池,FPGA及其外围电路电源采用5V钮扣电池供电,两路电源完全分开,这样做虽然可以将电动机驱动所造成的干扰彻底消除,提高了系统稳定性。但是不如单电源方便灵活。
由于本设计采用的L298N电机驱动电路板可以提供+5V输出,可以方便给5V的FPGA供电,因此采用单电源供电即可。只有给L298N电机驱动电路板供电大于6V时,才能输出+5V电压。综合考虑到本设计采用的直流电机为强磁电机以及线路压降,因此本设计选择了7.2V的镍镉充电电池组来供电。
§1.3.6 智能小车系统最终方案
经过上面的思考和分析最终确定智能小车系统的最终方案如下:
(1)采用FPGA作为整个电路的控制核心。
(2)采用可充电镍镉电池组提供基准电源。
(3)采用小车底盘作为小车载体,强磁直流减速电机作为小车系统的驱动电机。
(4)采用电机专用驱动芯片L298N作为直流电机的驱动芯片。
(5)采用红外传感器进行障碍检测。
#ifndef _MOTOR_H_
#define _MOTOR_H_
#include <reg52.h> //包含52FPGA头文件
#define uint unsigned int
#define uchar unsigned char
sbit IN1=P1^0; //电机1的控制位 IN1,IN2的值控制电机的正转,反转,停止 ,IN1=1,IN2=0电机正转,IN1=0,IN2=1电机反转,IN1=0,IN2=0电机停止转动;
sbit IN2=P1^1; //在C语言里,如果直接写P1^1,C编译器并不能识别所以利用sbit换名,使编译器识别对其进行位操作。
sbit INA=P1^4; // 电机1的使能位 INA=1,电机开始工作,INA=0,电机停止工作
sbit IN3=P1^2; //电机2的控制位 IN3,IN4的值控制电机的正转,反转,停止 ,IN3=1,IN4=0电机正转,IN3=0,IN4=1电机反转,IN3=0,IN4=0电机停止转动;
sbit IN4=P1^3;
sbit INB=P1^5; // 电机2的使能位 INB=1,电机开始工作,INB=0,电机停止工作
sbit P17=P1^7; //传感器输入,遇障碍物输出低电平
sbit P20=P2^0; //蜂鸣器输入,低电平有效
extern uint speed1,speed2; // speed1电机速度值,t1电机一个周期的时间,PWM=speed/t;
extern void delay(uint xms); //一个简短的延时函数
extern void go(uchar spe1,uchar spe2); //电机加速函数,通过spe1,spe2控制电机速度
extern void qianjin(); //电机前进函数
extern void back(); //电机后退函数
extern void turn_left(); //电机左转
extern void turn_right(); //电机右转
extern void start(); //电机启动函数
extern void stop(); //电机停止函数
extern void ISP_init(); //定时器初始化函数
extern void dd(); //蜂鸣器报警函数
#endif
/*motor.c*/
#include "motor.h"
uint speed1=0,speed2=0;
void delay(uint xms) //简单的延时
{
uint i;
uchar j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--); //for双层循环当j减为0时i减一
}
void dd()
{
P20=0;
delay(500);
P20=!P20;
delay(500);
P20=!P20;
delay(500);
P20=!P20;
delay(500);
}






导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题:
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和
我正在尝试找出一种方法来显示来自不在RAILS_ROOT下(在RedHat或Ubuntu环境中)的已安装文件系统的图像。我不想使用符号链接(symboliclink),因为这个应用程序实际上是通过Tomcat部署的,而当我关闭Tomcat时,Tomcat会尝试跟随符号链接(symboliclink)并删除挂载中的所有图像。由于这些文件的数量和大小,将图像放在public/images下也不是一种选择。我查看了send_file,但它只会显示一张图片。我需要在一个格式良好的页面中显示6个请求的图像。由于膨胀,我宁愿不使用Base64编码,但我不知道如何将图像数据与呈现的页面一起传递下去。