基于STC89C52的自动循迹小车项目

2022-09-06 19:15:55 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

摘要:本文根据对目标金属物的非接触式探测定位和移动的具体要求,以STC89C52RC单片机为控制核心,结合驱动模块、三个电感模块(LDC1000电感数字传感器)、测速模块和显示模块,设计并实现了一种自动循迹小车。该小车能在规定的具有0.6-0.9mm细铁丝标识的平面跑道上自动循迹前进,且在行进过程中能够检测到硬币并报警,同时小车的运行时间、距离等信息可在显示屏上实时显示。经过多次测试表明,该循迹小车达到了预期的效果,自动循迹稳定,硬币识别准确,实时显示距离及时间效果好,抗干扰能力强。

1 方案论证

自动循迹小车包括STC89C52RC单片机主控器、驱动模块、电感模块、测速模块和显示模块等模块。该小车采用2个直流电机分别控制2个车轮,通过LDC1000传感器[1]判断铁丝的位置来引导小车行驶的方向。具体方案是:给小车提供5V的电压,传感器LDC1000对铁丝电感值(L)进行测量,再由单片机根据测量值判断小车的行进方向;在行进途中,传感器同时可以测得硬币的L值,并根据测量值判断经过硬币否,一旦遇到硬币蜂鸣器就会发出警报声。小车运动时,测速模块将数据传送给单片机,单片机按照算法计算出数据值并传到显示屏上实时显示小车运动的时间和距离。系统整体结构如图1所示:

图1 系统整体结构图

本设计制作的自动循迹智能小车,要求能够在规定的直径为 0.6-0.9mm 的细铁丝跑道上自动循迹前进,同时显示小车行驶的距离和时间,并对跑道上任意放置的硬币进行检测并发出提示音。跑道示意图如图2所示,图中所有圆弧的半径均为20cm±2cm。根据预设的目标要求,对系统各模块方案进行了详细的比较论证,具体如下:

图2 跑道示意图

1.1控制器模块选择方案及论证

方案一:采用普通51直插单片机。单片机只有P0、P1、P2、P3四个口以及16个引脚,2个定时器,内部RAM为128字节,对于自动循迹需要较多的功能无法满足,因此51单片机不合适。

方案二:用STC89C52RC单片机[2]做控制核心。52单片机同51单片机芯片内核(CPU)都是一样的,且有3个定时器,内部RAM为256字节,因此可以存储更多的程序。

方案三:采用STM32单片机。STM32单片机高性能、低成本、低功耗,程序都是模块化的,接口相对简单些,自身功能多,工作速度也快。而51的自身功能少,需要外围元件多。

综合以上方案,我们选择比较普通且更为熟悉的方案二:使用STC89C52RC单片机为我们整个系统的控制核心。为了保证系统的稳定性,本设计选择两片STC89C52RC单片机,一片STC89C52RC单片机实现两个LDC1000的数据读取、对电机的控制、显示时间、显示距离;另一块STC89C52RC单片机实现PWM控制电机速度、一个LDC1000的数据读取。

1.2 电机选择方案论证

方案一:选择步进电机。步进电机与其他设备进行接口方便, 它的精度较好, 在执行过程中没有累计误差, 且步进电机的步数是通过脉冲数量来控制的,因此它定位较精准,且转速较低时又不适于小车对速度的一定要求。

方案二:选择普通直流电机。其定位虽不及步进电机精准,但速度很容易控制,且反应快,很容易实现PWM调速。很方便的就可以实现通过单片机对直流减速电机前进、后退、停止、调速等操作。 

因此,综合考虑选择方案二,但本次设计要求对小车行驶的时间、距离进行显示,如果选用普通直流电机,需结合测速模块实现时间和距离的测量。电机具体型号为双轴TT 1:120减速电机,驱动采用 L293D驱动芯片[3]实现。

1.3 传感器循迹模块方案论证

本次设计需要小车对铁丝轨道进行探测并循迹,同时还需要检测硬币,可以采用 TI 公司 LDC1314 或LDC1000 任意一款传感器。

方案一:采用LDC1000传感器[4]。据查资料了解到,LDC1000 是世界上第一个电感数字转换器,从而在一个低功耗、小封装尺寸解决方案内提供电感感测的优势。 此产品采用一个小外形尺寸无引线(SON)-16 封装,并且提供了几种运行模式。一个串行外设接口(SPI) 简化了到微控制器(MCU)的连接。其功耗低、灵敏度高、结构简单、成本低,且能满足系统检测要求。基于设计成本及设计者自身知识特点的考虑,最终设计选定了 LDC1000 传感器。

方案二:采用LDC1314传感器。该传感器是4-通道12位的电感-数字转换器(LDC),同LDC1000一样,以最低的成本与最小的功耗来获得电感感测的性能和可靠性。

但是基于设计成本及设计者自身知识特点的考虑,最终设计中选定方案一。

1.4 速度采集模块选择

为实时显示小车运行时间、距离,我们采用SM100K测速传感器,配合黑色码盘可以测量电机转速(所测电机的规格,和码盘有关),测速编码器检测电机转速,通过将编码器检测到的数据送至单片机进行具体计算得到距离值并加以显示。现在提供的码盘D型孔内径为4mm且为20栅格码盘。

1.5 显示模块方案论证

方案一:采用LED数码管显示,LED显示具有硬件电路结构简单、调试方便、软件实现相对容易等优点,但是计划要显示小车运行时间,LED数码管无法显示如此丰富的内容,因此我们放弃此方案。

方案二:采用LCD1602液晶显示。LCD液晶因具有功耗低、显示内容丰富、清晰,显示信息量大,显示速度较快,界面友好等特点而得到了广泛的应用,因此我们选择此方案。

2 循迹理论分析与计算

2.1 LDC1000传感器工作原理以及 RpMIN 和 RpMAX 值设定

2.1.1 LDC1000传感器工作原理

电感数字传感器 LDC1000 利用电磁感应原理 , 工作原理图如下图 3 所示。在传感器自身线圈中加一个交变电流 I1,则会有交变电磁场H1在其线圈周围产生,当金属物体进入此电磁场中,金属物体表面就会产生涡流H 2( 感应电流 I2 ),H2、I2的方向与 H1、I1向相反,该涡流的函数与金属物体种类、距离、大小相关。可把LDC1000 的线圈看作为初级线圈,涡流效应为次级线圈,这样就可以形成了一个变压器,在初级线圈侧就可以检测到次级线圈的参数。当将一个电容并联在线圈侧时,产生了 LC 的并联谐振作用,能量只在 R1 和 R2’上消耗,因此可以通过检测 (R1 R2’) 的损耗间接地检测金属物体的距离、种类等。

LDC1000一个极其重要的参数为L,设计中也是通过这个参数确定是否探测到铁丝和硬币。通过不断测试,探测 0.8mm 铁丝时,L 值为 200-400,探测一角硬币时,L 值为1300-1500,特别说明一下,LDC1000对滤波电容的选择十分苛刻, 需要选择温度稳定性好,压电噪声低的电容,最优的电容值在 20pF 到 100nF 之间,它是 LDC1000 内部有源滤波器的一部分,选取时应尽量小,但是要确保有源滤波器不饱和。本次设计经过综合考虑,在有源滤波器不饱和的情况下,选择 C= 100pF。

图 3 传感器 LDC1000 工作原理图

2.1.2 RpMIN 和 RpMAX 值设定

不同的测试对象和距离会产生不同的损耗,也就是 Rp 的范围不同[5]。所以应用中需要配置合适的 Rp 范围。LDC1000 中有两个寄存器 Rp_Min 和 Rp_Max 用于配置。为了保证 Rp 的实际值落在采样区间内部,而且还要保持一定的精度,就需要我们进行合理的设置 RpMIN 和 RpMAX 寄存器的数值,我们可以通过一些简单的方法测出 Rp 等效的最大值和最小值。首先通过表格选取两个合适的 RpMIN 和 RpMAX 值填入寄存器中;然后我们将金属物体放在距离线圈最近的地点,将 RpMIN的值一步一步增大使得 CODE 值接近 25000 时,选取这时的RpMIN;最后同样的方法的将金属放在线圈最远的地方,这时 涡流损耗最小,RpMAX 会渐渐变小,使得 CODE 值接近 3000 时,选取这时的值作为 RpMAX。

Rp 值的计算公式:

Rp=(RpMAX×RpMIN)/(RpMIN×(1-Y) RpMAX×Y) Y=ProximityData/215

在本设计中,将上述计算公式结合实验测试情况,得到以下Rp值范围:

探测铁丝的LDC1000(1)(2)的RpMIN=0x5a,RpMAX=0x05,

探测硬币的LDC1000(3)的RpMIN=0x3f,RpMAX=0x09。

应用中 Rp 的值如果超出这个范围就会被钳位。如果设置的 Rp 范围过大,真实的 Rp 只占这个范围的一小部分, 这样就会浪费 LDC1000内部 ADC 的精度。

2.2 PWM 电机转速调控

2.2.1 PWM电机调速原理

对于电机的转速调整,我们是采用脉宽调制(PWM)办法[6],控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端EN1 和EN2 上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。

2.2.2 52单片机PWM程序

如果需要产生两个PWM[7],要求两个PWM波形占空都为5/16,两个波形之间要错开,不能同时为高电平,高电平之间相差3/16,可以用定时器T0来控制频率,定时器T1来控制占空比:T0定时器中断是让一个IO口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。

占空比为高电平脉冲个数占一个周期总脉冲个数的百分数。一个周期加在电机两端的电压为脉冲高电压乘以占空比。占空比越大,加在电机两端的电压越大,电机转动越快。电机的平均速度等于在一定的占空比下电机的最大速度乘以占空比。当我们改变占空比时,就可以得到不同的电机平均速度,从而达到调速的目的。精确地讲,平均速度与占空比并不是严格的线性关系,在一般的应用中,可以将其近似地看成线性关系。

本系统设计中通过控制STC89C52RC单片机,从而可以实现 P1.4 和 P1.5 输出口输出不同占空比的脉冲波形。设定 CL,EPCnL 及 CCAPnL 的值,就使 P1.4 或 P1.5产生一个脉冲。将直流电机的速度分为 60 个等级,因此一个周期就有 60 脉冲,周期为 60 个脉冲的时间。速度等级对应一个周期的高电平脉冲的个数。

2.3 检测铁丝和硬币的电感值L

此设计运用了3个LDC1000[8],其中,两个用来测铁丝的电感值,从而判断小车的运行方向,一个用来测硬币的值。

LDC1000(1)和LDC1000(2)测铁丝的电感值[9]是动态数据,取这些数据的平均值 10,就是有铁丝的电感值。当所测数据大于这个电感值时,则有铁丝,小车则按照铁丝的方向行驶。

当小车在行驶过程中,碰到硬币时,LDC1000(3)测的电感值是动态数据,取这些数据的平均值 60,就是有硬币的电感值。当所测的数据大于这个电感值,蜂鸣器就会发出警报。

2.4 巡线检测算法设计

金属源的检测采用LDC1000传感器,该传感器是TI公司推出的一款全新的电感数字转换器,利用了电磁感应原理,LDC实际上是一个特殊的ADC,外接一个传感线圈。通过LDC1000检测L值的大小判断小车是否在正确的轨道上,若小车左边的线圈检测到铁丝,则小车左轮减速,向左转;若小车右边的线圈检测到铁丝,则小车右轮减速,向右转;若两边线圈都没有检测到铁丝,两电机保持相同的速度,小车直行。

2.5 测速原理及计算

为准确计算时间、距离并实时显示,具体思路描述如下:计数器记录来自 CPU 的高频脉冲f0,编码器 PLG 每输出一个脉冲,中断电路向 CPU 发出一次中断请求,CPU 响应中断,从外部中断中计数值M1=M1 1,M1为其中断次数,每个测速模块[10]20个栅格码盘为一圈,周长为20厘米。所以,距离L=M1/20*20=M1。

3 电路设计

3.1 系统组成

自动寻迹小车系统分为数据采集处理模块、主控模块、电机驱动模块、电感模块(LDC)、测速模块和显示模块。一块STC89C52RC将采集的数据按预先设置的算法进行比较计算、实现控制作用、进行时间和距离的计算,另一块从STC89C52RC单片机实现PWM控制电机速度、LDC1000(3)的数据读取。

3.2 各模块电路设计

3.2.1主控电路

本设计所用单片机 STC89C52RC,在设计中用到了P1、P2、P3、P4 四个 I/O 口, 其中 P0 为 LCD1602 的数据接口 ,P2和P3中的八个引脚为两个LDC1000 的数据端,P1 口为直流电机的控制端,一片主STC89C52RC单片机实现两个LDC1000(1)和LDC1000(2)的数据读取、对电机的控制、显示时间、显示距离。

主控电路图如图4所示:

图4 主控电路图

3.2.2 LDC1000传感器与单片机的连接

本设计采用LDC1000来判断小车是否行走在细铁丝上。LDC1000收集到的数据发送给单片机,单片机经过计算后再判断小车下一步的行走方向。

MCU通过SPI连接(SDI、SDO、SCLK、CSB)实现对LDC1000 的控制,以及数据读取。在SPI通信过程中,LDC1000扮演从机的角色。

STC89C52RC与LDC1000的硬件连接如图 5所示。通过SDI、SDO、SCLK 3根数据线互连实现高速数据传送。其中STC89C52RC对LDC1000进行数据读写采用SPI通信,首先将片选信号CSB置低,然后STC89C52RC通过SDI线向LDC1000写入访问寄存器地址,最高位为0表示写入,为1表示读出,剩余7位为寄存器地址。如果为读,SDO线上发送来自其地址寄存器上的8位数据; 如果为写,SDI线接收来自STC89C52RC的8位数据并且将其写入寄存器。

LDC-1000(1) 与 MCU 的连接原理图如图5所示:

图5 LDC1000(1)传感电路与 MCU 的连接原理图

LDC-1000(2) 与 MCU 的连接原理图如图6所示:

图6 LDC1000(2)传感电路与 MCU 的连接原理图

LDC-1000(3) 与 MCU 的连接原理图如图7所示:

图7 LDC1000(3)传感电路与 MCU 的连接原理图

3.2.3电机驱动电路

L293D是一款单片集成的高电压、高电流、4通道电机驱动,设计用于连接标准DTL或TTL逻辑电平,驱动电感负载(诸如继电线圈、DC和步进电机)和开关功率晶体管等。

为了简化为双桥应用,L293D每个通道对都配备了一个使能输入端。L293D逻辑电路具有独立的供电输入,可在更低的电压下工作。L293D是支持Vcc4.5-36V的微型电机驱动集成电路芯片。

L293D可同时驱动 2 个二相或 1 个四相步进电机,接收标准TTL逻辑准位信号,且可以直接透过电源来调节输出电压; 此芯片可直接由单片机的 I/O 端口来提供模拟时序信号。电机驱动原理图如图8所示:

图8 电机驱动原理图

3.2.4 测速模块电路

SM100K测速传感器是一款宽电压、高分辨率、短响应速度、开关量输出的测速模组,在选用测速传感器的时候,我们选用了对射式的传感器,同反射式传感器相比,具有分辨率高、输出波形规整等诸多优点,输出信号为标准方波,没有毛刺和变形。测速模块原理图如图9所示:

图9 测速模块原理图

3.3 系统软件设计

3.3.1 系统总体程序设计流程

软件设计首先进行初始化,然后用LDC1000计算铁丝和硬币的电感值,立刻调用显示子函数,进入显示界面将时间、距离等信息实时显示出来。不断检测当前电感值与所计算的铁丝的电感值比较,判断是否检测到铁丝和硬币,根据检测结果对小车进行控制,使小车前进。

系统主流程图如图 10所示:

图10 系统主流程图

3.3.2 循迹程序设计流程

在小车循迹程序设计中,对LDC1000所检测到的多组数值求其平均值进行处理,并把此均值设定为标准参考值。然后小车开始行进,若小车左边的线圈检测到铁丝,则小车左轮减速,向左转;若小车右边的线圈检测到铁丝,则小车右轮减速,向右转;若两边线圈都没有检测到铁丝,两电机保持相同的速度,小车直行。

该小车在行进过程中不断检测是否有硬币[11],若检测到有硬币则蜂鸣器报警,若没有硬币则继续行驶。行驶过程中依然不断检测,若检测到小车在铁丝上行走,则说明小车状态正常,使其继续保持前行。若检测到小车不在铁丝正上方,则需要立即判断铁丝是处于小车的左边还是右边,从而控制小车的转向。小车控制流程图如图11所示:

图11 小车控制流程图

4 测试方案与测试结果

4.1 测试工具

铁丝轨道、秒表、卷尺。

4.2 测试方法与测试结果分析

4.2.1小车跑完一圈的时间及铁丝循迹情况

将小车放在跑道任意位置,共测试五次,每次记录跑完一圈的时间及铁丝轨迹偏离小车垂直投影的距离, 记录数据见表 1。

表1 测试数据

次数

第一次

第二次

第三次

第四次

第五次

跑一圈时间

23

24

24

23

23

偏离距离

0

0

0

0

0

从测试结果可以看出,小车能实现自动循迹,在较短时间内跑完一圈,且铁丝轨迹一直在小车垂直投影下方,未偏离。测试结果表明,小车循迹按题目指定要求完成并达到预期的效果。

4.2.2 小车实时显示行进距离、运行时间情况

小车运行过程中,LCD 显示屏上清晰可见实时显示的距离和时间,而且随机选定了三处,记录小车顶部LCD 实时显示的距离和时间,并与实测距离和时间进行了对比,数据如下表2。

表2 测试数据

第一次

第二次

第三次

LCD显示距离及时间

820cm

24s

810cm

23s

750cm

23s

实测距离及时间

680cm

25s

680cm

24s

680cm

24s

实时显示距离及时间误差

140cm

1s

156cm

1s

70cm

1s

误差率

20%

4%

19%

4.1%

10%

4.1%

综上所述,LCD显示距离与实测距离相差较小,各误差率稳定在20%左右,LCD显示的时间与实测时间相差较小且相对稳定在1s左右,误差率稳定在4%左右。结果表明,该小车实时显示距离及时间效果好,抗干扰能力强,性能稳定。

4.2.3 一角硬币检测情况

将四枚一角硬币边缘紧贴任意直线段铁丝边缘,让小车沿着轨道行驶,记录能准确检测并警报的硬币的个数,同样测试几次,数据见表3。

表3 测试数据

次数

第一次

第二次

第三次

第四次

准确检测到的 硬币的个数

4

4

4

4

是否报警

结果表明,该小车硬币识别准确,且遇到每一个硬币都能及时发出报警声。

5 结语

通过数次测试与不断完善,本系统已达到设计题目的要求,通过对记录数据进行分析,可得该小车在直行和转弯过程中都能根据细铁丝标识的平面跑道运动,准确度较高,运行速度较快,稳定性好。从调试结果来看,后续可通过改进算法、优化程序等方法进一步提高小车的运行速度和测量值的精确度。

自动循迹小车实物图

图12 小车正面图

图13 小车底部图

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134041.html原文链接:https://javaforall.cn

0 人点赞