基于STM32+LDC1000的循迹小车

1、前言

这是2016年TI杯电子设计竞赛的作品,并获得了省一等奖。

2、竞赛题目

每年的TI杯电子设计竞赛都会出A题~G题共七个题,我们团队平时主要做控制的多,所以这次竞赛我们选择控制类题目——自动循迹小车。该题题目及要求如下:

3、方案的选择及比较

一些功能的实现、方案选择的分析如下:

3.1 主控芯片的选择

我们选用STM32系列单片机中的STM32F103RBT6作为主控芯片。大学期间的参加的两次TI杯都没有用TI的MSP430作为主控,哈哈。因为比赛规则没有说禁止使用其他厂商的控制芯片,那我们当然选用我们相对熟悉的STM32来作为控制芯片。

本以为毕业后可以做STM32或者其他ARM内核芯片作为开发平台的工作,没想到还是与TI挂上了勾,现在工作用的是TI的某双核DSP芯片,正好也可以学习TI的产品。在这一方面学的知识越来越多,就感觉平台只是基础,关键还是应用,关键还是看使用芯片平台开发什么产品。这一段时间的学习,给我的感觉就是TI官方写的代码没ST官方写的代码漂亮~

3.2 电机驱动方案

采用专用芯片L298N作为电机驱动芯片。L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可以分别控制两个直流电机,而且还带有控制使能端。用该芯片作为电机驱动,操作方便,稳定性好,性能优良。L298N结合单片机可实现对小车速度的精确控制。

3.3 传感器的选择

方案1:采用一片TI公司配发的LDC1314。LDC1314提供匹配良好的通道, 可实现差分测量与比率测量。LDC1314具有多通道且支持远程感测并且还具备有高分辨率。高分辨率通道可支持更大的感测范围,在两倍线圈直径范围外依然可保持良好的性能。 良好匹配的通道支持差分与比率测量。LDC1314与单片机通信方式为I2C方式。

方案2:采用一片TI公司配发的LDC1000。LDC1000的通信方式为SPI通信,通道个数为1。LDC1000除了通信方式与通道个数与LDC1314不同之外,其他部分几乎与LDC1314兼容。

由于当时比赛时LCD1314的数量有限,所以我们选用方案2的LDC1000传感器来寻迹。因为LDC1000只有一路通道,线圈无论左偏还是右偏,检测回来的值都变小,但是我们可以使用软件的方式来弥补它的这一缺点,同样可以达到准确寻迹的目的。

3.4 LCD1000的测量方案分析

方案1:采用一片电子开关(CD4052)作为辅助让LDC1000可以对两个线圈进行切换控制,以趋近与双通道的效果。

方案2:采用一片LDC1000单独检测铁丝,让线圈绕着铁丝走倒V形、Z形或S形的方式让线圈沿着铁丝左右切割前进。

由于考虑到程序算法的问题,因此我们采用方案2测量。

3.5 小车转向的方案分析

方案1:使用舵机转向。可以输入一个周期性的正向脉冲信号来控制舵机,这个周期性脉冲信号的高电平时间通常在1ms—2ms之间,而低电平时间应在5ms到20ms之间,并不很严格,典型的20ms周期性脉冲的正脉冲宽度与微型伺服马达的输出臂位置的关系:输入正脉冲宽度为0.5ms时对应的输出臂为-90°,输入正脉冲宽度为1.0ms时对应的输出臂为-45°,输入正脉冲宽度为1.5ms时对应的输出臂为0°,输入正脉冲宽度为2.0ms时对应的输出臂为45°,输入正脉冲宽度为2.5ms时对应的输出臂为90°。所以使用舵机在小角度转弯时灵敏度并不高。

方案2:利用电机的速度差转向。它具有调速范围广、起动转矩大、控制功率小等一系列优点。

由于考虑到舵机小角度转弯灵敏度低的问题,因此我们采用方案2测量。

3.6 电机的选择

方案1:采用直流电机。直流电机转动力矩大,响应快速,体积小,重量轻,直流电动机具有优良的调速特性,调速平滑、方便,调整范围广;过载能力强,能承受频繁的冲击负载,可实现频繁的无级快速启动、制动和反转,能满足各种不同的特殊运行要求,价格便宜。我们选用减速比为1:74的直流电机,减速后电机的转速为100r/min

方案2:采用步进电机。步进电机是一种将电脉冲信号转换成角位移或线位移的精密执行原件。控制方便,体积小,灵活性和可靠性高,具有瞬时启动和急速停止的优越性,比较适合本系统控制精度高的特点。但步进电机的抖动比较大,输出力矩较低,随转速的升高而下降,且在较高转速时会急剧下降,其转速较低,不适用于小车等有一定速度要求的系统,价格还比较昂贵,所以这里不采用此方案。

由于直流电机价格便宜、控制简单。而且选用车轮直径为6cm的电机时,最大速度可以达到V=2πr·v=2*3.14*0.03*100/60=0.314m/s,能够较好的满足系统的要求。因此选用方案1。

4、软件及解决的算法分析

4.1 循迹算法分析

我们软件实现的整体思路很简单,首先看一下分析图:

我们我们记LDC1000读回来的数字量为 Ldc_Val, 根据我们自己铺的轨道,当线圈中心置于铁丝正上方时(在图中3号位置)的 Ldc_Val约为 11000, 当线圈中心置于偏离铁丝一小段距离(图中4号位置)的 Ldc_Val 约为 9000,当线圈正好与铁丝相切时(图中1、4号位置)的 Ldc_Val 约为 5000。

我们设置了三种情况来控制小车循迹,一是当 9000<Ldc_Val<11000(当然,因为上限值与下限值都是一个大概值,所以这两个值可以根据实际测试需要修改)时,小车稍微往右偏一个小角度,小车右偏的条件左边电机转速大于右边电机转速(偏离的程度根据实际测试调整)。二是当 5000<Ldc_Val<9000(当然,因为上限值与下限值都是一个大概值,所以这个值可以根据实际测试需要修改)时,小车稍微往左偏一个小角度,小车左偏的条件右边电机转速大于左边电机转速(偏离的程度根据实际测试调整)。三是当 Ldc_Val=9000(这个值根据前面两种情况的修改而修改)时,小车稍微往左偏一个小角度,小车左偏的条件右边电机转速大于左边电机转速(偏离的程度根据实际测试调整)。如此反复(过弯的情况也是一样的),小车就会沿着铁丝做Z 形对铁丝做切割运动循迹前行。

4.2 硬币的检测

在除了上述三种情况下,再添加第四种范围,当Ldc_Val>12000(此值根据实际测试调节)时,就是检测到硬币在铁丝边缘,此时蜂鸣器发声提示。但是,有些时候会导致蜂鸣器频繁发声,这种情况是因为蜂鸣器发声的 Ldc_Val 值太低,导致铁线处于线圈正下方时 Ldc_Val 值也会处于蜂鸣器发声的 Ldc_Val 范围内,这时可以把蜂鸣器发声的临界值调高些。

还有一种情况就是线圈会在没有硬币的地方会偶尔产生一个异常的数值,该数值处于蜂鸣器发声的 Ldc_Val 值范围导致蜂鸣器发声,对于这种情况,我们首先想到的是在程序上采用连续读取多个检测回来的数字量去除最大最小值的再求平均值的方法来滤除掉这些偶尔的异常值。

4.3 程序主流程图

5、实物图

小车共有三个轮子,其中车头两个轮子,车位一个万向轮(方便转弯),LDC1000安装在车头正前方。

六、代码获取

https://github.com/zhengnianli/LDC1000_Track_Car


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券