1、1摘要本设计主要有单片机模块、传感器模块、电机驱动模块以及电源模块组成,小车具有自主寻迹的功能。本次设计采用 STC 公司的 89C52 单片机作为控制芯片,传感器模块采用红外光电对管和比较器实现,能够轻松识别黑白两色路面,同时具有抗环境干扰能力,电机模块由 L298N 芯片和两个直流电机构成,组成了智能车的动力系统,电源采用 7.2V 的直流电池,经过系统组装,从而实现了小车的自动循迹的功能。关键词 智能小车 STC89C52 单片机 L298N 红外光对管21 绪论随着科学技术的发展,机器人的设计越来越精细,功能越来越复杂,智能小车作为其的一个分支,也在不断发展。在近几年的电子设计大赛中,
2、关于小车的智能化功能的实现也多种多样,因此本次我们也打算设计一智能小车,使其能自动识别预制道路,按照设计的道路自行寻迹。2 设计任务与要求采用 MCS-51 单片机为控制芯片(也可采用其他的芯片) ,红外对管为识别器件、步进电机为行进部件,设计出一个能够识别以白底为道路色,宽度10mm 左右的黑色胶带制作的不规则的封闭曲线为引导轨迹并能沿该轨迹行进的智能寻迹机器小车。3 方案设计与方案选择3.1 硬件部分可分为四个模块:单片机模块、传感器模块、电机驱动模块以及电源模块。3.1.1 单片机模块为小车运行的核心部件,起控制小车的所有运行状态的作用。由于以前自己开发板使用的是 ATMEL 公司的 S
3、TC89C52,所以让然选择这个芯片作为控制核心部件。STC89C52 是一种低损耗、高性能、CMOS 八位微处理器,片内有 4k 字节的在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除 1000 次,数据保存时间为十年。其程序和数据存储是分开的。3.1.2 传感器模块方案一:使用光敏电阻组成光敏探测器采集路面信息。阻值经过比较器输出高低电平进行分析,但是光照影响很大,不能稳定工作。方案二:使用光电传感器来采集路面信息。使用红外光电对管,其结构简明,实现方便,成本低廉,没有复杂的图像处理工作,因此反应灵敏,响应时间少。但也存在不足,它能获取的信息是不完全的,容易受很多扰动(如背景
4、光源,高度等)的影响,抗干扰能力较差。方案三:使用 CCD 传感器来采集路面信息。使用 CCD 可以获取大量的图像信息,掌握全面的路径信息,抗干扰能力强,为以后功能的扩展提供方便。但使用 CCD 需要大量的图像处理工作,进行大量数据的存储和计算,因此电路复杂,实现起来工作量大。方案四:使用光电对管采集路面信息。RPR220 结构紧凑,体积小,调整电路简单工作性能稳定。可见方案四最适宜,但仅从此项目考虑,方案二成本低,也能完成设计,故选用方案二。33.1.3 电机控制模块3.1.3.1 电机的选择方案一:采用步进电机,其转过的角度可以精确定位,可实现小车行进过程的精确定位。但步进电机的输出力矩低
5、,随转速的升高而降低,且转速越快下降得越快。方案二:采用直流电机,其转动力矩大,体积小,重量轻,装配简单,操作方便。速度的调节可以改变电压也可以调节 PWM。基于以上,我们选择了方案二,使用直流电机作为驱动电机。3.1.3.2 电机的驱动采用专用芯片 L298N 作为电机驱动芯片,其操作方便,稳定性好,性能优良。一片 L298N 就可以分别控制两个直流电机。3.1.4 电源模块给整个系统稳定供电以保持其正常工作,包括 7.2V 的电源以及转 5V 部分,其中 7.2V 的是给电机和其驱动供电,5V 的用来驱动单片机及其他芯片。以上单元连接如下图所示:43.2 软件部分3.2.1 程序流程图此系
6、统采用 89C52 单片机,再根据硬件连接,通过相应的软件来完成对信号的采集和数据的分析,再控制小车的运行状态,以下为主程序流程图:3.2.2 程序设计思路3.2.2.1 寻迹模块程序通过传感器获得路面信息然后反馈给单片机,再通过单片机来实现相应的功能。3.2.2.2 电机驱动模块程序控制两个直流电机,实现前进、后退、前左转、前右转、停车等功能。54 各部分电路的作用及电路工作原理分析4.1 信号采集模块4.1.1 TCRT500 结构与工作原理TCRT5000(L)具有紧凑的结构发光灯和检测器安排在同一方向上,利用红外光谱反射对象存在另一个对象上,操作的波长大约是 950 毫米。探测器由光电
7、晶体三极管组成的,它由高发射功率红外光电二极管和高度灵敏光电晶体管组成。通过测试,其检测距离在 2mm-10mm。TCRT5000 的发射管和接收管是一起封装在矩形塑料壳中,为了使检测更加准确,我们用了 5 只 TCRT5000检测黑线,实物见图 4-1。4.1.2 信号采集电路图及原理小车在白色地面行驶时,红外发射管发出的红外信号被反射,接收管收到信号后,输出端为低电平,经过比较器比较后输出为低电平。而当红外信号遇到黑色导轨时,红外信号被吸收,接收管不能接收信号,输出端为高电平,经过比较器比较后输出高电平。单片机通过采集每个比较器的输出端电压,便可以检测出黑线的相对位置的位置,从而控制小车的
8、行驶方向。64.2 信息处理模块4.2.1 原理检测到白色路面的红外接收头处理后送出的是低电平,而检测到黑色路线的检测头送出的是高电平,由此可根据这 5 个红外接收头的高低电平判断路线情况而调整小车前进方向。具体情况有如下几种:a 检测到 1 1 1 1 1 或0 0 0 0 0 小车应该停止。b 检测到 1 0 0 0 0 或0 1 0 0 0 或1 1 0 0 0 说明路线向左偏,小车向左转。c 检测到 0 0 0 0 1 或0 0 0 1 0 或0 0 0 1 1 说明路线向右偏,小车向左转。d 检测到 x x 1 x x(x 不全为 1) 说明线路是直的,小车直走。74.3 电机驱动模
9、块4.3.1 直流电机给两个电刷 A 和 B 加上直流电源,如上图(a)所示,则有直流电流从电刷 A 流入,经过线圈 abcd,从电刷 B 流出,根据电磁力定律,载流导体 ab和 cd 收到电磁力的作用,其方向可由左手定则判定,两段导体受到的力形成了一个转矩,使得转子逆时针转动。如果转子转到如上图(b)所示的位置,电刷 A 和换向片 2 接触,电刷 B 和换向片 1 接触,直流电流从电刷 A 流入,在线圈中的流动方向是 dcba,从电刷 B 流出。此时载流导体 ab 和 cd 受到电磁力的作用方向同样可由左手定则判定,它们产生的转矩仍然使得转子逆时针转动。这就是直流电动机的工作原理。外加的电源
10、是直流的,但由于电刷和换向片的作用,在线圈中流过的电流是交流的,其产生的转矩的方向却是不变的。实用中的直流电动机转子上的绕组也不是由一个线圈构成,同样是由多个线圈连接而成,以减少电动机电磁转矩的波动,绕组形式同发电机。4.3.2 电路图我们采用成品 L298N 电机驱动模块,采用光电耦合器件隔离单片机与L298N 的控制电路,工艺精度高,性能可靠。L298N 模块内部通过 H 桥电路实现直流电机的正转,反转,其原理如下:如图 4-3 所示,全桥式驱动电路的 4 只开关管都工作在斩波状态,S1、S2 为一组,S3、 S4 为另一组,两组的状态互补,一组导通则 另一组必须关断。当 S1、S2 导通
11、时,S3、 S4 关断,电机两端加正向电压,可以实 现电机的正转或反转制动;当 S3、S4 导 通时,S1、S2 关断,电机两端为反向电 压,电机反转或正转制动。桥驱动电路84.3.3 原理L298N 是 ST 公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15 脚封装。主要特点是:工作电压高,最高工作电压可达 46V;输出电流大,瞬间峰值电流可达 3A,持续工作电流为 2A;额定功率 25W。内含两个 H 桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一
12、个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用 L298N 芯片驱动电机,该芯片可以驱动两台直流电机。95 系统调试 5.1 硬件部分焊接完成后,首先进行的调试是用数字万用表测量各个电路是否焊接正常,是否有虚焊漏焊等现象的出现,以及各个电容是否是正常的未被击穿状态、电阻的阻值是否与设计的原理图上的一致。接通电源,用数字万用表测量当有+5V 的各引脚是否有+5V 的电压,测量电路中是否出现了不该有的短路现象。接入光电传感器模块,使各个光电检测器的光电对管靠近白纸,观察对应的发光二极管是否发光,不发光表示正常。 然后再使各个光电对管靠近黑线,观察
13、对应的发光二级管是否发光,发光表示正常。5.2 软件部分我们先测试了小车的前进,停止,左转和右转。组装信号采集模块后,实现小车的自动循迹功能。具体实现程序见附录一6 总结实验结果如符合实验要求,小车按照黑胶布轨迹前进,并能够及时正确显示小车的行进状态以及行进距离。具体现象如下:左边传感器检测到黑线,小车左转;右边传感器检测到黑线,小车右转;中间传感器检测到黑线,小车直行。从而就可以完成对黑胶布的循迹功能。7 参考文献1电子信息专业实验教程 赵刚 李佐儒 四川大学出版社2单片机 C 语言教程 郭天祥 电子工业出版社3模拟电子技术 童诗白 清华大学出版社10附录一程序:#includesbit D
14、J_left_s = P10; /直流电机控制sbit DJ_left_n = P11;sbit DJ_right_s = P12;sbit DJ_right_n = P13;/左转函数void Turn_right()DJ_left_s = 0;DJ_left_n = 1;DJ_right_s = 1;DJ_right_n = 0;/右转函数void Turn_left()DJ_left_s = 1;DJ_left_n = 0;DJ_right_s = 0;DJ_right_n = 1;/前进函数void Go_ahead()DJ_left_s = 1;DJ_left_n = 0;DJ_right_s = 1;DJ_right_n = 0;/停止函数void Stop()DJ_left_s = 0;DJ_left_n = 0;DJ_right_s = 0;