目 录
前 言 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);
}