《单片机应用-智能小车设计概论13489.pdf》由会员分享,可在线阅读,更多相关《单片机应用-智能小车设计概论13489.pdf(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 智 能 小 车 设 计 所谓智能系统,应该是在没有人为因素干预下,能够完全的或者部分的对外部刺激因素做出适当响应的系统。通常这种系统无论复杂还是简单,其硬件结构都可以分为传感、控制以及执行三个部分,好比人的各种感官、大脑以及四肢。下面就从这三个方面进行智能小车的设计,该小车具备自动循迹能力(非人为控制下按照指定路线行走),并且随着不同传感器的加入,能够完成更多的功能,比如壁障、走迷宫、寻光、通过电脑及手机等上位机控制等等。一、控制部分:图 1 单片机最小系统原理图 图 2 控制信号输入部分原理图 图 3 控制部分电源输入开关 图 4 显示接口 图 5 DS18B20/1838 一体化接口及
2、ISP 接口 该智能小车整个控制部分电路原理如以上 5 个图所示,可分为主控芯片最小系统、控制信号输入、电源以及各类接口四个部分。1.主控芯片最小系统:在本设计中所使用的主控芯片为51 系列单片机,为保证其正常工作所必需的外围电路包括晶振电路、复位电路以及 P0 口上拉电阻。当然以上三个部分只能保证单片机正常运转,但若只是这样基本没有什么实际意义,根据不同的任务要求,需要让单片机在适当的引脚上连接相应的设备。这里结合智能小车所需的功能以及未来方便扩展的需要,除了设置4 个 3 头插针连接红外光电开关、舵机(距离探测时会用到)以及给其他传感器供电外,还将单片机P0、P1、P2、P3 口用排针引出
3、,其中 P1 使用双排针,一排与 8 个 LED 灯相连,可在日后测试时方便观察信号变化。具体连接如图 1 所示。2.控制信号输入部分:51 系列单片机接收外部信号无非通过两个渠道,一个是其 4 个并行的 I/O 口,另一个就是其自带的串口,相较之下,串行口的拓展能力更强一些。如图 2 所示,在本设计中,利用单片机的 I/O 口设置了 4 个按键进行人机交互,同时在其串口上连接了一块 USB/串口转换芯片 PL2303。PL2303:是 Prolific 公司生产的一种高度集成的 RS232-USB 接口转换器,可提供一个 RS232 全双工异步串行通信装置与 USB 功能接口便利联接的解决方
4、案。该器件内置 USB 功能控制器、USB 收发器、振荡器和带有全部调制解调器控制信号的 UART,只需外接几只电容就可实现 USB 信号与 RS232 信号的转换,能够方便嵌入到各种设备,该器件作为 USB/RS232 双向转换器,一方面从主机接收 USB 数据并将其转换为 RS232 信息流格式发送给外设;另一方面从 RS232 外设接收数据转换为 USB 数据格式传送回主机。这些工作全部由器件自动完成,开发者无需考虑固件设计。PL2303 的高兼容驱动可在大多操作系统上模拟成传统 COM 端口,并允许基于 COM 端口应用可方便地转换成 USB 接口应用,通讯波特率高达 6 Mb/s。该
5、器件具有以下特征:完全兼容 USB1.1 协议;可调节的 35 V 输出电压,满足 3V、3.3V 和 5V 不同应用需求;支持完整的 RS232 接口,可编程设置的波特率:75b/s6 Mb/s,并为外部串行接口提供电源;512 字节可调的双向数据缓存;支持默认的 ROM 和外部 EEPROM 存储设备配置信息,具有 I2C 总线接口,支持从外部 MODEM 信号远程唤醒;支持Windows98,Windows2000,WindowsXP 等操作系统;28 引脚的 SOIC 封装。PL2303 引脚功能列表:引脚 名字 类型 引 脚 描 述 1 TXD 输出 数据输出到串口;2 DTR_N
6、输出 数据终端准备好,低电平有效;3 RST_N 输出 发送请求,低电平有效;4 VDD_325 电源 RS232 的电源,为串行端口信号的电源引脚;当串口为 3.3V,这应该是 3.3;当串行端口是 2.5V,这应该是 2.5V;5 RXD 输入 串口数据输入;6 RI_N 输入/输出 串行端口(环指示器);7 GND 电源 接地;8 NC 无连接 9 DSR_N 输入/输出 串行端口(数据集就绪)10 DCD_N 输入/输出 串行端口(数据载波检测)11 CTS_N 输入/输出 串行端口(清除发送)12 SHTD_N 输出 控制 RS232 收发器关机 13 EE_CLK 输入/输出 串行
7、 EEPROM 时钟 14 EE_DATA 输入/输出 串行 EEPROM 数据 15 DP 输入/输出 USB 端口 D+信号 16 DM 输入/输出 USB 端口 D-信号 17 VO_33 常规 3.3V 电源输出 18 GND 接地 19 NC 无连接 20 VDD_5 电源 USB 端口的 5V 电压电源 21 GND 接地 22 GP0 输入/输出 通用 I/O 引脚 0 23 GP1 输入/输出 通用 I/O 引脚 1 24 NC 无连接 25 GND_A 模拟地锁相环 26 PLL_TEST 输入 PLL 锁相环测试模式控制 27 OSC1 输入 晶体振荡器输入 28 OSC2
8、 输入/输出 晶体振荡器输出 SSOP28 封装 以上是 PL2303 芯片的基本介绍,通俗的讲就是该芯片通过驱动可以在 PC 机上虚拟出一个 COM 口,使 USB 接口模拟串口的功能,一般使用情况下主要关心 1、5、15、16 四个引脚,具体连接参看图 2。3.电源部分:电源部分设计为双供电方式,从图 3 中可以看到,当切换开关上方闭合时,控制板通过电源接头供电,当切换开关下方闭合时,控制板通过USB 接口供电。4.各类接口部分:这里所提供的接口分别为 1602、12864LCD 标准接口、DS18B20/1838 一体化接口、ISP 接口以及图 2 中所示的由 PL2303 芯片扩展的
9、USB 接口,保证了基本的输出扩展及传感器信号源扩展。由于已将单片机的 I/O 口引出,不必担心接口是否够用的问题,日后根据需要通过杜邦线可以随时扩展新的接口。二、执行部分:这里所说的执行部分指的是智能小车上能够表现出其对外部条件作出的反应的部分,这种反应可以是运动,也可以是声或者光。图 6 LED 数码管显示 1.LED 数码管显示:图 6 所示为 4 位共阳极 LED 数码管显示电路,该部分可用于实时显示有关智能小车当前运行状态,比如速度、前方障碍物距离等等。如果根据实际需要进行相应的扩展,则可以用于显示更多类型的信息,比如加入 AD 转换器可以显示当前电池的电压情况,加入温度传感器可以显
10、示当前的工作温度等等。图 7 蜂鸣器 2.蜂鸣器 图 7 所示为简单的蜂鸣器电路,该蜂鸣器可用于对智能小车运行时的一些特定状况进行声音提示,如距离某物太近、转向、脱离轨道、电量过低等等,不同的状况可以使用不同的声音组合进行区分。3.运动部分:该智能小车的运动执行部分由减速直流电机、轮胎以及相应的驱动电路组成,具体如图 8、9 所示。该部分负责实时的执行小车所需的各种运动(左右转、前进、后退等),若将轮胎部分换成履带或者其它专用轮胎,则可以执行翻越等更为复杂的运动。下面就该部分原理做较为详尽的介绍。图 8 直流减速电机及轮胎 图 9 双 L298N 驱动电路 直流减速电机:直流减速电机相较于普通
11、直流电机的最大区别就是加入了减速齿轮组,通过调整齿轮比可以在转速与扭矩之间进行权衡,降低转速则可以获得较大扭矩,带动更重的设备,反之扭矩则减少。本设计中整个小车质量相对于普通 5V 直流电机来说比较重,若选用较大功率的电机,则耗电量与驱动电路的负载将会增加,况且并不需要太高的速度,所以选用减速电机,在同样的功率下通过降低转速获得足够的扭矩。轮胎:最常见的轮胎如图 8 中所示的圆形轮胎,也是本设计中所使用的轮胎,其对于一般硬质平地来说非常适用,除此之外还有履带,适用于较软并且凹凸不平路面以及专门用于攀爬楼梯等特殊障碍物的异形轮胎等。驱动电路:小车直流电机工作电流一般是 200-400mA 有些更
12、大,该设计中是四个轮子,那么总的电流在 800-1600mA 左右,这些电机轮子都是要接受单片机指令执行相应的动作,而单片机 I/O 口一般只能提供 5mA 到 10mA 的电流,直接驱动不了电机,所以需要一个驱动模块,该驱动模块的作用就是根据单片机的指令提供足够的电流。对于工作电压12V以下,功耗25W以内的设备可以选用专业的 L298N,L293D 驱动芯片。这里我们选用 L298N 驱动芯片,该芯片可以同时驱动两个电机,所以采用双 L298N 方案。L298N:图 10 L298N 内部结构图 L298N 是 ST 公司的 L298 系列的一款常见的 15 功能引脚 Multiwatt1
13、5 或 PoweSO20 封装的产品,如图 11 所示,内部包含 4 通道逻辑驱动电路,即内含两个H 桥的高电压大电流双全桥式驱动器,如图 10 所示,可以方便的驱动两个直流电机,或一个四相步进电机。L298N可接受标准 TTL 逻辑电平信号,输入电压范围为2.546 V,输出电压最高可达 50V,可以直接通过电源来调节输出电压,输出电流可达 2.5 A,可驱动电感性负载,可接入电流采样电阻形成电流传感信号,可以直接用单片机的 IO 口提供信号,而且应用电路简单,使用比较方便。L298N 引脚功能表:引脚(MW15)引脚(PSO20)名称 功能 1;15 2;19 Sense A;Sense
14、B 在该引脚与地之间连接一个用于电流采样的电阻,形成电流传感信号来控制负载电流。2;3 4;5 Out 1;Out 2 A 桥的输出,并且这两端之间的负载电流受到 1号管脚的监测。4 6 VS 供电电压输入端口,该端口的输入电压与桥的输出电压一致,范围为+2.5+46V,使用时必须在其与地之间接上一个 100nF 的无感电容。5;7 7;9 Input 1;Input 2 A 桥 TTL 逻辑电平输入端,与对应 A 桥输出一致(逻辑高则输出,低则停止输出)。6;11 8;14 Enable A;Enable B 逻辑电平使能端,为高则对应桥按照逻辑电平正常输出,为低时则停止。8 1;10;11
15、;20 GND 接地 9 12 VSS 逻辑参考电平输入端,使用时必须在其与地之间接上一个 100nF 的无感电容。10;12 13;15 Input 3;Input 4 B 桥 TTL 逻辑电平输入端,与对应 A 桥输出一致(逻辑高则输出,低则停止输出)。13;14 16;17 Out 3;Out 4 B 桥的输出,并且这两端之间的负载电流受到 15号管脚的监测。3;18 N.C.悬空 图 11 L298N 芯片封装 在该驱动电路中,除了 L298N 驱动芯片外还包括 LM2596S 降压稳压芯片以及 ULN2003L集成达林顿管,具体连接如图 9 所示。其作用分别为:LM2596S 降压稳
16、压芯片:该芯片可以 稳定输出 5V(可调)电压,用于给控制板以及传感器等较小功率设备提供一个稳定的电压,保证其的正常工作。ULN2003L 集成达林顿管:将其所有管脚用排针引出,为了日后方便扩展更大功率器件。在图 9 中的 16 只二极管起到稳压保护作用,当输出电压过高或过低时,可以将其稳定在合理的范围之内。若在 4 个 OUT 之间加入发光二极管,则可以直观的看出当前驱动器的输出状态,即电机的工作状态,如图 12 所示 图 12 驱动状态指示电路 下面给出一路电机的控制逻辑表,其他三路电机逻辑类同。从表中可以更为直观的看出 L298N 驱动芯片几个关键引脚的功能,IN1 和 IN2 之间高低
17、电平切换可控制电机正反转,EN 端高低变换可控制 L298N输出端是否按照输入信号执行。用两个 L298N 连接前后左右 4 个电机,参照表中的逻辑给不同的 IN 输入逻辑电平,就可使小车完成前进、后退、左转、右转等动作,比如一块 L298N 芯片的 OUT1、OUT2、OUT3、OUT4 分别连接左侧前后电机的正极、负极、正极、负极,另一块 L298N 芯片的 OUT1、OUT2、OUT3、OUT4 分别连接右侧前后电机的正极、负极、正极、负极,此时两块 L298N 的 IN 端输入逻辑电平 1010、1010 则所有电机正转,小城前进;输入 1010、0101 则小车左侧前进,右侧后退实现
18、右转等。当然此逻辑会随着实际的连接而改变,但原理相同。这里可以看到 L298N 中的 EN 端负责控制 OUT 端是否执行 IN 端的输入,使其在 0、1 之间按一定周期切换则可以实现小车的 PWM 控制,若想使小车全速运行,则需将EN 端与逻辑高电位始终相连。电机控制逻辑表:IN1 IN2 EN A 电机 0 0 0 不转 0 1 0 不转 1 0 0 不转 1 1 0 不转 0 0 1 不转 1 0 1 正转 0 1 1 反转 1 1 1 不转 三、传感器部分:若要使小车智能化,就必须使其能够对外界环境的变化自行做出适当地反映,在这个过程中最为关键的因素就是如何感知外界的环境,完成这一任务
19、的就是传感器。不同的传感器可以感知不同的环境因素,传感器越丰富,小车可获取到的因素种类就越多,这里将介绍几个常用的传感器。1.四路红外线探测系统:如图 13 所示该系统是为智能小车、机器人等自动化机械装置提供一种多用途的红外线探测系统。使用红外线发射和接收管等分立元器件组成探头,并使用 LM339 电压比较器(加入迟滞电路),防止临界输出抖动做为核心器件构成中控电路。此系统具有的多种探测功能能极大的满足各种自动化、智能化的小型系统的应用。图 13 四路红外线探测系统 应用范围:1.智能化轮式车和智能化履带车循迹、避障、防跌落;2.智能化小型机械人和智能化小型机械手物料检测、色相检测灰度检测。特
20、性:1.易于安装,使用简便;2.四路分别独立工作,工作时不受数量限制中控板与探头分开;3.安装位置不受限制模块高度4 厘米;4.安全工作电压范围在 4 伏特至 6 伏特之间 4 路全开工作电流 30 毫安至 40 毫安之间;5.带校正调节功能,R17、R18、R19、R20 对应比较电压调节输出端为集电极开路,板载 4.7 千欧上拉电阻。端口:+5、GND:电源接线端 IN(14);OUT:探头与中控板连接端;OUT1、OUT2、OUT3、OUT4:对应输出端;LED3、LED4、LED6、LED7:对应输出指示;原理:图 14 所示为四路红外线探测系统中的一路原理图,其他三路与其一致,图中左
21、半部份为发射,右半部份为接收,R17 负责调整基准电压,加入迟滞电路,防止临界输出抖动。测试方法:如图 15 所示,左侧为传感器测试电路,右侧为传感器安装位置。1.测试探头:移开探头前面的所有物体,且探头不要指向阳光的方向。将探头板接上电源后用万用表测最输出端电压。此时的电压应当在 1 伏特左右。用白纸挡在探头前。用万用表测输出端电压应当接近电源电压。2.测试中探板:将测试好的探头按板上所标示的接入输入端子,移开探头前面的所有物体,且探头不要指向阳光的方向,将中探板接上电源后用万用表测输出端子,此时输出端输出的电压应当接近电源电压,用白纸挡在探头前,万用表测输出端电压应当接近 0 伏特,调整所
22、在通道的电位器可以改变探测的距离。图 14 一路红外线探测系统原理图 调试灵敏度:1.调节其四路寻迹的的电位器(调节其灵敏度以适合其环境)具体调试方法如下:先用手握住小车离地,左右晃动,从左到右第一对红外对管离开黑线时,中控板指示 D3 灯应会亮。当红外对管进入黑线时,中控板指示 D3 红灯应会灭,调节中控板 R17 使其工作在上述状态。同理,调节其它三对探头,使其正常工作。2.对应顺序:第二对红外对应灵敏度对应指示灯为中控板 D4,调节灵敏度电位器 R18;第三对红外对应灵敏度对应指示灯为中控板 D5,调节灵敏度电位器 R19;第四对红外对应灵敏度对应指示灯为中控板 D6,调节灵敏度电位器
23、R20。图 15 探头测试 2.US-100 超声波测距模块:US-100 超声波测距模块可实现 04.5m 的非接触测距功能,拥有 2.45.5V 的宽电压输入范围,静态功耗低于 2mA,自带温度传感器对测距结果进行校正(温度会影响超声波的测距精度),同时具有 GPIO,串口等多种通信方式,内带看门狗,工作稳定可靠。外观如图 16 所示,左图为正面,右图为背面,模块的尺寸为 45mm*20mm*1.6mm。板上有两个半径为 1mm的机械孔。图 16 US-100 超声波测距模块 主要技术参数:工作电压:DC 2.4V5.5V;静态电流:2mA;工作温度:-20+70 度;输出方式:电平或UA
24、RT(跳线帽选择);感应角度:小于 15 度;探测距离:2cm-450cm;探测精度:0.3cm+1%;UART 模式下串口配置:波特率 9600,起始位 1 位,停止位 1 位,数据位 8 位,无奇偶校验,无流控制。接口说明 本模块共有两个接口,即模式选择跳线(背面与电路板面垂直的两个引脚)和 5 Pin 接口(正面图中向下的 5 个引脚)。模式选择跳线接口:间距为 2.54mm,当插上跳线帽时为 UART(串口)模式,拔掉时为电平触发模式。5 Pin 接口:正面图中从左到右依次编号 1、2、3、4、5,功能如下表所示:1 号 Pin 接 VCC 电源(供电范围 2.4V5.5V)2 号 P
25、in 当为 UART 模式时,接外部电路 UART 的 TX 端;当为电平触发模式时,接外部电路的 Trig 端。3 号 Pin 当为 UART 模式时,接外部电路 UART 的 RX 端;当为电平触发模式时,接外部电路的 Echo 端。4 号 Pin 接外部电路的地。5 号 Pin 接外部电路的地。电平触发测距工作原理:在模块上电前,首先去掉模式选择跳线上的跳线帽,使模块处于电平触发模式。图 17 表明:只需要在 Trig/TX 管脚输入一个 10US 以上的高电平,系统便可发出 8 个 40KHZ 的超声 波脉冲,然后检测回波信号。当检测到回波信号后,模块还要进行温度值的测量,然后根据当前
26、温度对测距结果进行校正,将校正后的结果通过Echo/RX 管脚输出。在此模式下,模块将距离值转化为 340m/s 时的时间值的 2 倍,通过 Echo 端输出一高电平,可根据此高电平的持续时间来计算距离值。即距离值为:(高电平时间*340m/s)/2。注:因为距离值已经经过温度校正,此时无需再根据环境温度对超声波声速进行校正,即不管温度多少,声速选择 340m/s 即可。图 17 US-100 电平触发测距时序图 串口触发测距工作原理:图 18 US-100 串口出发测距时序 在模块上电前,首先插上模式选择跳线上的跳线帽,使模块处于串口触发模式。串口触发测距的时序如图 18 所示:在此模式下只
27、需要在 Trig/TX 管脚输入 0X55(波特率 9600),系统便可发出 8 个 40KHZ 的超声波脉冲,然后检测回波信号。当检测到回波信号后,模块还要进行温度值的测量,然后根据当前温度对测距结果进行校正,将校正后的结果通过 Echo/RX 管脚输出。输出的距离值共两个字节,第一个字节是距离的高 8 位(HDate),第二个字节为距离的低 8 位(LData),单位为毫米。即距离值为(HData*256+LData)mm。串口触发测温工作原理:图 19 US-100 串口测温时序 在模块上电前,首先插上模式选择跳线上的跳线帽,使模块处于串口触发模式。串口触发测温的时序如图 19 所示:在
28、此模式下只需要在 Trig/TX 管脚输入 0X50(波特率 9600),系统便启动温度传感器对当前温度进行测量,然后将温度值通过 Echo/RX 管脚输出。测量完成温度后,本模块会返回一个字节的温度值(TData),实际的温度值为 TData-45。例如通过 TX 发送完 0X50 后,在 RX 端收到 0X45,则此时的温度值为(0X45 的 10 进制值)-45=24 度。超声波测距模块主要用于实现智能小车及机器人壁障这一功能,其型号有很多,但从原理上和使用方法上来讲大同小异,这我们的设计中采用US-100 这个型号的超声波测距模块,主要是因为该模块本身具备温度校正功能,在编写程序时较为
29、方便。为了充分发挥超声波模块的作用,可给其配上一台舵机,使其能够实现多个方向的距离感应。舵机:在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具,如航模,包括飞机模型,潜艇模型;遥控机器人中已经使用得比较普遍。舵机是一种俗称,其实是一种伺服马达。图 20 舵机 1)工作原理:控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为 20ms,宽度为 1
30、.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。2)舵机的控制:舵机的控制一般需要一个 20ms 左右的时基脉冲,该脉冲的高电平部分一般为0.5ms2.5ms范围内的角度控制脉冲部分。以 180度角度伺服为例,那么对应的控制关系是这样的:0.5ms-0 度;1.0ms-45 度;1.5ms-90 度;2.0ms-135度;2.5ms-180度;3)用单片机作为舵机的控制单元:用单片机可以使 PWM 信号的脉冲宽度实现微秒级的变化,从
31、而提高舵机的转角精度。单片机完成控制算法,再将计算结果转化为 PWM 信号输出到舵机,由于单片机系统是一个数字系统,其控制信号的变化完全依靠硬件计数,所以受外界干扰较小,整个系统工作可靠。单片机系统实现对舵机输出转角的控制,必须首先完成两个任务:首先是产生基本的PWM 周期信号,本设计是产生 20ms 的周期信号;其次是脉宽的调整,即单片机模拟 PWM信号的输出,并且调整占空比。当系统中只需要实现一个舵机的控制,采用的控制方式是改变单片机的一个定时器中断的初值,将 20ms 分为两次中断执行,一次短定时中断和一次长定时中断。这样既节省了硬件电路,也减少了软件开销,控制系统工作效率和控制精度都很
32、高。图 21 单片机控制舵机基本流程 具体的设计过程:例如想让舵机转向左极限的角度,它的正脉冲为 2ms,则负脉冲为20ms-2ms=18ms,所以开始时在控制口发送高电平,然后设置定时器在 2ms 后发生中断,中断发生后,在中断程序里将控制口改为低电平,并将中断时间改为 18ms,再过 18ms 进入下一次定时中断,再将控制口改为高电平,并将定时器初值改为 2ms,等待下次中断到来,如此往复实现 PWM 信号输出到舵机。用修改定时器中断初值的方法巧妙形成了脉冲信号,调整时间段的宽度便可使伺服机灵活运动。为保证软件在定时中断里采集其他信号,并且使发生 PWM 信号的程序不影响中断程序的运行(如
33、果这些程序所占用时间过长,有可能会发生中断程序还未结束,下次中断又到来的后果),所以需要将采集信号的函数放在长定时中断过程中执行,也就是说每经过两次中断执行一次这些程序,执行的周期还是 20ms。具体流程如图 21 所示。以上介绍的传感器可以保证智能小车完成循迹、壁障、走迷宫等功能,若想完成更为复杂的功能,可以通过添加适当的传感器来实现,具体细节在未来系统扩展的在做介绍。前面,我们从硬件结构方面对智能小车做了一个较为全面的分析,但是以上所包括的所有器件电路只能算作一个运行平台,其包含了要实现功能所需的所有物质实体,却缺少智能系统所需的一个必要要素“思想”,没有“思想”谈何智能。这里所指的“思想
34、”在电子方面指的就是程序,要想让小车真正实现智能化,通过合理的程序来调动其各个部分协调工作是必不可少的。下面我们就来谈谈程序方面的设计。四、程序部分:对于 51 系列单片机来说,程序设计一般使用汇编和 C 两种语言。汇编语言接近底层,在时序控制方面可以做到十分精确,但缺点是可读性差,不容易实现模块化;C 语言虽然精确度上稍稍不及汇编,但在其他方面均优于汇编语言,所以目前除了时序要求非常严格的接口驱动喜欢用汇编语言编写外,其余大部分越来越多的喜欢使用 C 语言。下面就以 C 语言作 为程序编写语言,用模块化的思想设计智能小车各部分的程序。1.小车基本运动程序设计:顾名思义,该部分程序负责让主控部
35、分协调小车各部分完成前进、后退、左右转向等基本动作。这里要说明一下,一个模块可以理解为一项任务,大任务可以分解为若干个小任务,也就是模块可分模块,一个任务包含若干功能,一个功能在 C 语言中我们习惯用一个子函数来描述,所以可以这样理解,一个模块就是由若干个子函数构成的,整个系统也可以理解为一个项目中最大的模块。硬件的连接方式会影响程序的编写,一般这种影响只局限于 I/O 口的变动,也就是说改变硬件连接后一般只需要将程序中的 I/O 口变量做适当的调整就可以实现原先的功能。下面我们参照图 9,按照以下方式连接对小车基本运动程序进行设计,其他连接方式程序雷同。根据前面描述,EN1 EN2 为驱动使
36、能端,若给其 PWM 输入,则可以通过一起一停,调整起停所占时间比例的方式控制小车的运动速度。若要全速运行,只需直将使能端通过跳线帽接在+5V 上即可。下面的程序只是基本运动,所以采用全速方式。然后 P1_0 P1_1 接 IN1 IN2 P1_2 P1_3 接 IN3 IN4 P1_4 P1_5 接 P1_6 P1_7 接 IN7 IN8 IN5 IN6;左上电机接驱动板子输出端(蓝色端子 OUT1 OUT2)、左下电机接驱动板子输出端(蓝色端子 OUT3 OUT4)、右上电机接驱动板子输出端(蓝色端子 OUT5 OUT6)、右下电机接驱动板子输出端(蓝色端子 OUT7 OUT8)。则 4
37、个电机转向与单片机 I/O 口输出关系如下表所示:单片机 I/O 口输出 电机运行状态 P1_0=1,P1_1=0 左上电机正转 P1_0=0,P1_1=1 左上电机反转 P1_0=0,P1_1=0 左上电机停转 P1_0=1,P1_1=1 左上电机刹停 P1_2=1,P1_3=0 左下电机正转 P1_2=0,P1_3=1 左下电机反转 P1_2=0,P1_3=0 左下电机停转 P1_2=1,P1_3=1 左下电机刹停 P1_4=1,P1_5=0 右上电机正转 P1_4=0,P1_5=1 右上电机反转 P1_4=0,P1_5=0 右上电机停转 P1_4=1,P1_5=1 右上电机刹停 P1_6
38、=1,P1_7=0 右下电机正转 P1_6=0,P1_7=1 右下电机反转 P1_6=0,P1_7=0 右下电机停转 P1_6=1,P1_7=1 右下电机刹停 根据上表,做以下宏定义,方便后面程序的编写,具体如下表所示:宏命令 功能#define Left_moto_go P1_0=1,P1_1=0,P1_2=1,P1_3=0;左边两个电机正转(智能小车左半部分前进)#define Left_moto_back P1_0=0,P1_1=1,P1_2=0,P1_3=1;左边两个电机反转(智能小车左半部分后退)#define Left_moto_Stop P1_0=0,P1_1=0,P1_2=0,
39、P1_3=0;左边两个电机停转(智能小车左半部分停止)#define Right_moto_go P1_4=1,P1_5=0,P1_6=1,P1_7=0;右边两个电机正转(智能小车右半部分前进)#define Right_moto_back P1_4=0,P1_5=1,P1_6=0,P1_7=1;右边两个电机反转(智能小车右半部分后退)#define Right_moto_Stop P1_4=0,P1_5=0,P1_6=0,P1_7=0;右边两个电机停转(智能小车右半部分停止)如此一来就不难给出智能小车的 4 个基本运动函数的流程及代码:1)流程:开始 左侧电机正转;右侧电机正转结束开始 左侧
40、电机反转;右侧电机反转结束开始 左侧电机正转;右侧电机反转结束开始 左侧电机反转;右侧电机正转结束小车前进小车后退小车左转小车右转 图 22 小车基本运动流程图 2)代码:全速前进:void run(void)Left_moto_go;Right_moto_go;全速后退:void backrun(void)Left_moto_back;Right_moto_back;左转:void leftrun(void)Left_moto_back;Right_moto_go;右转:void rightrun(void)Left_moto_go;Right_moto_back;若要让小车完成某个动作,只
41、需在主函数 MAIN 中循环调用相应的运动子函数即可,比如让小车全速前进可实现如下:void main(void)while(1)run();2.小车 PWM 运行程序设计:PWM 运行,简而言之就是通过让电机一转一停,调整转停比来控制小车速度的运行方式。通过前面的介绍可以知道可以通过向 L298N 芯片的 ENA、ENB 端输入 PWM 信号来实现,缺点是会占用单片机的 I/O 口。另一种方法是直接向 IN 端输出 PWM 的方法,比如结合前面的单片机 I/O 输出与电机运行状态关系表,驱动端 IN1=1 IN2=0 时全速前进 IN1=1,IN2=1 时电机刹停,由此可以看出先使小车处于某
42、个运行状态,然后给 4 个电机的其中一端输入一个 PWM 信号,小车就会按照占空比实现 PWM 运行。此方法的好处就是节省 I/O 口资源,下面的程序设计也基于此法。由于左右转向无需以 PMW 方式运行,与之前基本运动程序一样,所以该部分程序主要针对小车的前进与后退进行设计,其均可分为三个部分:前进/后退函数;左右电机调速函数;定时器 0 中断函数,具体如下:前进/后退函数:1)流程:开始 确定左侧电机占空比;确定右侧电机占空比 左侧电机正转;右侧电机正转结束开始 确定左侧电机占空比;确定右侧电机占空比 左侧电机反转;右侧电机反转结束 图 23 小车 PWM 运行中前进/后退函数流程 2)代码
43、:前进:void run(void)push_val_left=7;/占空比调节变量 0-9。9 最小,0 最大 push_val_right=7;Left_moto_go;Right_moto_go;后退:void backrun(void)push_val_left=3;/占空比调节变量 0-9。0 最小,9 最大 push_val_right=3;Left_moto_back;Right_moto_back;该函数的功能主要是确定小车的当前运行进本状态,类似于初始化函数,不循环调用,旨在给后面的 PWM 运行函数做运行前准备工作。左右电机调速函数:1)流程:开始左侧PWM输入端输出1左侧
44、电机是否允许运行?左侧占空比变量=10?左侧占空比变量清零结束左侧电机一端进入停止状态NYNYYN开始右侧PWM输入端输出1右侧电机是否允许运行?右侧占空比变量=10?右侧占空比变量清零结束右侧电机一端进入停止状态NYNYYN 图 24 左右电机调速函数流程 2)代码:左电机调速:void pwm_out_left_moto(void)if(Left_moto_stop)/左侧电机起停变量 if(pwm_val_left=10)pwm_val_left=0;else Left_moto_pwm=0;Left_moto_pwm1=0;右电机调速:void pwm_out_right_moto(v
45、oid)if(Right_moto_stop)/右侧电机起停变量 if(pwm_val_right=10)pwm_val_right=0;else Right_moto_pwm=0;Right_moto_pwm1=0;该函数负责给 4 个电机一端按照预设占空比进行 PWM 信号输出。定时器 0 中断函数:1)流程:进入中断定时器0赋初值 中断次数变量+1;左侧占空比变量+1;右侧占空比变量+1中断结束 调用左调速函数;调用右调速函数 图 25 定时器 0 中断函数流程 2)代码:void timer0()interrupt 1 using 2 TH0=0XFc;/1Ms 定时 TL0=0X18
46、;time+;pwm_val_left+;pwm_val_right+;pwm_out_left_moto();pwm_out_right_moto();该中断函数负责 PWM 信号输出所需的时间控制。使用以上 3 个子函数便可完成小车前进与后退的 PWM 运行,通过占空比变量的不同取值可以调整小车的运行速度。这里需要注意的是,在本设计中,前进时占空比变量越大,则小车向前跑的越慢,后退时则相反;运行停止变量在小车前进时只能起到预备停止的作用,若要使小车完全停止需在一开始调用停止函数,而在后退时则可以仅通过停止变量使小车停止。下面以小车 PWM 前进为例看看以上几个子程序是如何协调工作的。voi
47、d main(void)TMOD=0X01;TH0=0XFc;/1ms 定时 TL0=0X18;TR0=1;ET0=1;EA=1;run();/PWM,调速前进 while(1)/*无限循环*/3.小车循迹程序设计:所谓小车循迹,就是让小车自行顺着预先设置好运动轨迹前进,效果好像小车自己跟人一样能够看到预设路线似的,但实际上有一部分小车是和人一样用“眼”看,而另一部分小车则是像蝙蝠一样用其它感官去“看”。上面提到的“眼”实际就是摄像头,俗称电子眼,通常使用的是 CCD 光学传感器件;其它感官则如我们前面提到的四路红外探测系统。电子眼的优点是定位精确,但后续数据处理工作量较为庞大,为保持实时性,
48、需要配套类似于 DSP 等高速运算型 MCU,整体成本较高,所以只应用于对精度有特殊要求的领域;四路红外探测系统在精度上无法和电子眼相提并论,但贵在其后续数据处理简单,51 系列单片机就可以轻松胜任,整体成本低,能够胜任于一般精度要求的系统。在本设计中循迹过程中的“眼”采用的就是四路红外探测系统,有关该系统的原理前面已经做了详细介绍,下面主要进行小车循迹部分的程序设计。按照惯例,在做程序设计之前首先要将硬件部分连接确定下来。完成循迹功能首先要使小车具备运动能力,这部分仍按照之前的接法,不用PWM 运行方式,除此之外就是四路红外探测系统了,这部分的接法如下(参照图 1、9、13、14):四路寻迹
49、传感器电源+5V GND 取自于单片机板靠近液晶调节对比度的电源输出接口;P3_2 接四路寻迹模块接口第一路输出信号即中控板上面标记为 OUT1;P3_3 接四路寻迹模块接口第二路输出信号即中控板上面标记为 OUT2;P3_4 接四路寻迹模块接口第三路输出信号即中控板上面标记为 OUT3;P3_5 接四路寻迹模块接口第四路输出信号即中控板上面标记为 OUT4。按照前面对四路红外探测系统原理的分析,当某个探头遇白线时输出信号为 0,遇黑线时输出信号为 1。下面对关键的几个接口做如下宏定义,方便程序编写,四个探头至左向右分别命名为Left_1_led、Left_2_led、Right_1_led、
50、Right_2_led。宏定义 描述#define Left_1_led P3_4 P3_4 接四路寻迹模块接口第一路输出信号即中控板上面标记为 OUT1#define Left_2_led P3_5 P3_5 接四路寻迹模块接口第二路输出信号即中控板上面标记为 OUT2#define Right_1_led P3_6 P3_6 接四路寻迹模块接口第三路输出信号即中控板上面标记为 OUT3#define Right_2_led P3_7 P3_7 接四路寻迹模块接口第四路输出信号即中控板上面标记为 OUT4 这里需要说明的是,一般完成循迹只需要两个与小车中轴线左右对称的探头即可,若轨迹线的宽度