1、智能循迹小车智能控制课程设计成员:完成时间:智能循迹小车摘要:本设计是一种基于单片机控制的简易自动寻迹小车系统,包括小车系统构成软硬件设计方法。小车以飞思卡尔单片机MC9S12DG128 为控制核心, 用单片机产生PWM波,控制小车速度。利用红外光电传感器对路面黑色轨迹进行检测,并将路面检测信号反馈给单片机。单片机对采集到的信号予以分析判断,及时控制驱动直流电机以调整小车转向,从而使小车能够沿着黑色轨迹自动行驶,实现小车自动寻迹的目的。关键词:单片机单片机MC9S12DG128 光电传感器 直流电机 自动循迹目 录目 录 II1.任务及要求 11.1任务 12.系统设计方案 12.1小车循迹原
2、理 12.2控制系统总体设计 23.模块方案 23.1 寻迹传感器模块 23.2控制器模块 23.4电机驱动模块 23.5 电源模块 44.软件设计 44.1 PWM控制 44.2 总体软件流程图 44.3小车循迹流程图 5结束语 6附录1单片机测序 71.任务及要求1.1任务 设计一个基于直流电机的自动寻迹小车,使小车能够自动检测地面黑色轨迹,并沿着黑色车轨迹行驶。系统方案方框图如图1-1所示。图1-1 系统方案方框图2.系统设计方案2.1小车循迹原理这里的循迹是指小车在白色地板上循黑线行走,由于黑线和白色地板对光线的反射系数不同,可以根据接收到的反射光的强弱来判断“道路”。通常采取的方法是
3、红外探测法。红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。红外探测器探测距离有限。红外探测原理图如图1-2所示。图1-2 红外探测原理图 2.2控制系统总体设计自动循迹小车控制系统由主控制电路模块、稳压电源模块、红外检测模块、电机及驱动模块等部分组成,控制系统的结构框图如图2-1所示。3.模块方案3.1 寻迹传感器模块反射式光电传感器
4、是经常使用的传感器。我们采用的BFD-1000光电传感器价格便宜、体积小、使用方便、质量可靠、用途广泛。在黑线检测的测试中,若检测到白色区域,发射管发射的红外线没有反射到接收管,测量接收管的电压为48V ,若检测到黑色区域,接收管接受到发射管发射的红外线,所得电压也就随之发生变化,测的接收管的电压为0V,测试基本满足要求。3.2控制器模块采用飞思卡尔公司的MC9SDG128 单片机作为主控制器。它是一个低功耗,高性能的16 位单片机,其单片机CPU外部总线频率为8MHz,内部运算速度可达25MHz,运行速度快。I/O口资源丰富,具有SPI、SCI、I2C等模块。且具有PWM输出功能,更便于控制
5、小车的车速及转向。3.4电机驱动模块驱动模块采用专用芯片L298N 作为电机驱动芯片,L298N 是一个具有高电压大电流的全桥驱动芯片,其响应频率高,一片L298N可以分别控制两个直流电机。以下为L298N的引脚图和输入输出关系表。 图3-1 L298N外部引脚 表1 L298N输入输出关系驱动电路的原理图如图3-2所示:图3-2 驱动电路原理图L298N 的5、7、10、12 四个引脚接到单片机上,通过对单片机的编程就可实现两个直流电机的PWM调速控制。3.5 电源模块系统中液晶显示模块,键盘模块需用到5V电压源,将开关电源12V电压输出经过7809转换为9V电压,再经过7805转换为5V电
6、压。电压电路设计如图3-4(a)和(b)所示。(a) 12V9V电压源电路(b) 9V5V电压源电路图3-3 电压源电路设计图4.软件设计4.1 PWM控制本系统采用脉冲宽度调制(PWM)来调节直流电机的速度。PWM是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。此设计所使用的单片机自带PWM输出功能,通过PWM的寄存器设置,对PWMDTY和PWMPER写值,来达到不同的占空比,当电机通电时,速度增加;电机断电时,速度逐渐减少。只要按一定规律,改变通、断电的时间,即改变PWM占空比即可让电机转速得到控制。4.2 总体软件流程
7、图小车进入寻迹模式后,即开始不停地扫描与探测器连接的单片I/O 口,一旦检测到某个I/O 口有信号变化,就执行相应的判断程序,把相应的信号发送给电动机从而纠正小车的状态。软件的主程序流程图如图4-1所示:4.3小车循迹流程图小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测到某个I/O口有信号,即进入判断处理程序,我们所希望的是在黑线非交叉和空白时由中间的探测器一直检测得到黑线,在小车运行过程中先确定5个探测器中的哪一个探测到了黑线,如果左面第一级传感器或者左面第二级传感器探测到黑线,即小车左半部分压到黑线,车身向右偏出,此时应使小车向左转;如果是右面第一级传感器或右面
8、第二级传感器探测到了黑线,即车身右半部压住黑线,小车向左偏出了轨迹,则应使小车向右转。在经过了方向调整后,小车再继续向前行走,并继续探测黑线重复上述动作。在黑线交叉或空白时即认为直线前进,但速度可以降下来。结束语此次智能控制课程设计,我们以小组为单位进行设计,此次设计的智能循迹小车最后测试结果比较好,然而在设计过程中曾遇到了许多难题,包括小车的组装,单片机的使用,尤其是在编程调试阶段花去了大量时间,由于此次设计选用的车体较小,输出力矩小,小车在低速配重较大时不能转动,所以必须以较快的车速来运行,这又带来了车速太快容易冲出跑道的情况,经过多次尝试,最终总算调试出比较满意的效果。在掩饰过程中,由于
9、环境的变化,小车在现场不能跑出往常一样的效果。此时,精我组成员细心检查,终于发现是由于循迹模块距离地面太低而是小车循迹失误,知道原因后,在现场很快拆卸重装,最后演示时跑出了往常效果。从这次课程设计中,我们加强了自己的专业知识,也锻炼了我们现场排查事故,快速解决的动手能力。附录1单片机测序#include /* common defines and macros */#include /* derivative information */#include Includes.h /总头文件#define INT16U unsigned int void PWM_Init(void) PWME=0
10、x00; PWMPRCLK=0x43; /设置B时钟16分频,A时钟8分频 /PWMSCLA= 0x08; / 设置SA的分频系数8 PWMCLK=0x00; /0和1通道使用A时钟控制小车,2,3通道使能B时钟驱动超声波 PWMPOL=0x0F; /极性先高后低 PWMCAE=0x00;/左对齐输出 PWMCTL=0x20; /2.3级联 PWMDTY23 = 11; /设置周期寄存器 11us PWMPER23 = 65535; /设置占空比寄存器 655ms PWME =0x0F;/使能0和1,3通道 void main(void) MCUInit(); EnableInterrupts
11、; PWM_Init(); DDRA=0x00; / A口输入 PORTA=0x00; DDRH=0xFF; /H口输出控制IN1,IN2,IN3,IN4 PTH=0x00; for(;) if(PORTA=7)|(PORTA=19)/向右转 Speedctrl(1,42); /PTP_PTP0=1; PTH_PTH0=1; /电机左轮前转 PTH_PTH1=0; Speedctrl(0,45); PTH_PTH2=0; /电机右轮后转 PTH_PTH3=1; else if(PORTA=15)/向右转 Speedctrl(1,80); /PTP_PTP0=1; PTH_PTH0=1; /电机
12、左轮前转 PTH_PTH1=0; Speedctrl(0,75); PTH_PTH2=0; /电机右轮后转 PTH_PTH3=1; else if(PORTA=23)/向右转 Speedctrl(1,60); /PTP_PTP0=1; PTH_PTH0=1; /电机左轮前转 PTH_PTH1=0; Speedctrl(0,64); PTH_PTH2=0; /电机右轮后转 PTH_PTH3=1; else if(PORTA=25)|(PORTA=28) /向左转 Speedctrl(1,60); PTH_PTH0=0; /电机左轮后转 PTH_PTH1=1; Speedctrl(0,60); /
13、PTP_PTP1=1 ; PTH_PTH2=1; /电机右轮前转 PTH_PTH3=0; / Delay(500); else if(PORTA=29) /向左转 Speedctrl(1,70); PTH_PTH0=0; /电机左轮后转 PTH_PTH1=1; Speedctrl(0,65); /PTP_PTP1=1 ; PTH_PTH2=1; /电机右轮前转 PTH_PTH3=0; else if(PORTA=30) /向左转 Speedctrl(1,75); PTH_PTH0=0; /电机左轮后转 PTH_PTH1=1; Speedctrl(0,80); /PTP_PTP1=1 ; PTH
14、_PTH2=1; /电机右轮前转 PTH_PTH3=0; else if(PORTA=27)/检测交叉,前进 Speedctrl(0,40); PTH_PTH2=1; /电机右轮前转 PTH_PTH3=0; Speedctrl(1,40); PTH_PTH0=1; /电机左轮前转 PTH_PTH1=0; else if(PORTA=0)|(PORTA=31) /检测交叉,前进 Speedctrl(0,40); PTH_PTH2=1; /电机右轮前转 PTH_PTH3=0; Speedctrl(1,36); PTH_PTH0=1; /电机左轮前转 PTH_PTH1=0; else Speedct
15、rl(0,37); PTH_PTH2=1; /电机右轮转 PTH_PTH3=0; Speedctrl(1,39) ; PTH_PTH0=1; /电机左轮转 PTH_PTH1=0; 参考文献:1 王宜怀. 嵌入式系统(HCS12微控制器的设计与应用).北京:北京航空航天大学出版社,20083 2 孙同景Freescale十六位单片机原理及嵌入式开发技术北京:机械工业出版社,200853 邵贝贝.单片机嵌入式应用的在线开发方法北京:清华大学出版社,2004104 柴欣,张红梅 Visual C+程序设计基础(第二版)北京:中国铁道出版社,20075 黄智伟. 全国大学生电子设计竞赛系统设计. 北京:北京航空航天大学出版社,200612