1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!
刚入职的时候,公司组织参观,参观的时候看到了公司的AGV循迹小车,用于搬运物料。看到这些小车的时候,感觉很熟悉,这让我想起了16年TI杯电子设计竞赛,当时我们做的就是一个循迹小车。
现在突然想起一件事,当时我面试的时候,也许就是我恰好跟面试官说了这个循迹小车,所以才会被招进来,招进来做电机控制方面的工作。按照以往找工作的经验,稍微大一点的公司,看到我的简历上写着新能源专业,估计已经扔垃圾桶了。我们部门虽然招人要求不高,但是软件好像也没那么容易进,因为软件大多招的都是研究生,我这个小本科非电机、电子相关专业怎么能进来,况且当时面试我的正是我们研究院的院长,电机控制方面的专家啊。当时觉得很满足,现在发现,这就是个坑啊,说多都是泪。要是知道是来做电机方面的我就不来了~
大学期间共参加了三次省级/*的电子设计竞赛/单片机应用设计大赛,均获得了一等奖,现将这些作品分享出来,供有需要的朋友进行学习。先分享循迹小车:
竞赛题目
每年的TI杯电子设计竞赛都会出A题~G题共七个题(关于16年TI杯电子竞赛的题目,有兴趣的可在后台回复:2016,进行获取),我们平时主要做控制的多,所以这次竞赛我们选择控制类题目——自动循迹小车。该题题目及要求如下:
方案的选择及比较
一些功能的实现、方案选择的分析如下:
一、主控芯片的选择
我们选用STM32系列单片机中的STM32F103RBT6作为主控芯片。大学期间的参加的两次TI杯都没有用TI的MSP430作为主控,哈哈。因为比赛规则没有说禁止使用其他厂商的控制芯片,那我们当然选用我们相对熟悉的STM32来作为控制芯片。
本以为毕业后可以做STM32或者其他ARM内核芯片作为开发平台的工作,没想到还是与TI挂上了勾,现在工作用的是TI的某双核DSP芯片,正好也可以学习TI的产品。在这一方面学的知识越来越多,就感觉平台只是基础,关键还是应用,关键还是看使用芯片平台开发什么产品。这一段时间的学习,给我的感觉就是TI官方写的代码没ST官方写的代码漂亮~
二、电机驱动方案
采用专用芯片L298N作为电机驱动芯片。L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可以分别控制两个直流电机,而且还带有控制使能端。用该芯片作为电机驱动,操作方便,稳定性好,性能优良。L298N结合单片机可实现对小车速度的精确控制。
三、传感器的选择
方案1:采用一片TI公司配发的LDC1314。LDC1314提供匹配良好的通道, 可实现差分测量与比率测量。LDC1314具有多通道且支持远程感测并且还具备有高分辨率。高分辨率通道可支持更大的感测范围,在两倍线圈直径范围外依然可保持良好的性能。 良好匹配的通道支持差分与比率测量。LDC1314与单片机通信方式为I2C方式。
方案2:采用一片TI公司配发的LDC1000。LDC1000的通信方式为SPI通信,通道个数为1。LDC1000除了通信方式与通道个数与LDC1314不同之外,其他部分几乎与LDC1314兼容。
由于当时比赛时LCD1314的数量有限,所以我们选用方案2的LDC1000传感器来寻迹。因为LDC1000只有一路通道,线圈无论左偏还是右偏,检测回来的值都变小,但是我们可以使用软件的方式来弥补它的这一缺点,同样可以达到准确寻迹的目的。
四、LCD1000的测量方案分析
方案1:采用一片电子开关(CD4052)作为辅助让LDC1000可以对两个线圈进行切换控制,以趋近与双通道的效果。
方案2:采用一片LDC1000单独检测铁丝,让线圈绕着铁丝走倒V形、Z形或S形的方式让线圈沿着铁丝左右切割前进。
由于考虑到程序算法的问题,因此我们采用方案2测量。
五、小车转向的方案分析
方案1:使用舵机转向。可以输入一个周期性的正向脉冲信号来控制舵机,这个周期性脉冲信号的高电平时间通常在1ms—2ms之间,而低电平时间应在5ms到20ms之间,并不很严格,典型的20ms周期性脉冲的正脉冲宽度与微型伺服马达的输出臂位置的关系:输入正脉冲宽度为0.5ms时对应的输出臂为-90°,输入正脉冲宽度为1.0ms时对应的输出臂为-45°,输入正脉冲宽度为1.5ms时对应的输出臂为0°,输入正脉冲宽度为2.0ms时对应的输出臂为45°,输入正脉冲宽度为2.5ms时对应的输出臂为90°。所以使用舵机在小角度转弯时灵敏度并不高。
方案2:利用电机的速度差转向。它具有调速范围广、起动转矩大、控制功率小等一系列优点。
由于考虑到舵机小角度转弯灵敏度低的问题,因此我们采用方案2测量。
六、电机的选择
方案1:采用直流电机。直流电机转动力矩大,响应快速,体积小,重量轻,直流电动机具有优良的调速特性,调速平滑、方便,调整范围广;过载能力强,能承受频繁的冲击负载,可实现频繁的无级快速启动、制动和反转,能满足各种不同的特殊运行要求,价格便宜。我们选用减速比为1:74 的直流电机,减速后电机的转速为100r/min。
方案2:采用步进电机。步进电机是一种将电脉冲信号转换成角位移或线位移的精密执行原件。控制方便,体积小,灵活性和可靠性高,具有瞬时启动和急速停止的优越性,比较适合本系统控制精度高的特点。但步进电机的抖动比较大,输出力矩较低,随转速的升高而下降,且在较高转速时会急剧下降,其转速较低,不适用于小车等有一定速度要求的系统,价格还比较昂贵,所以这里不采用此方案。
由于直流电机价格便宜、控制简单。而且选用车轮直径为6cm的电机时,最大速度可以达到V=2πr·v=2*3.14*0.03*100/60=0.314m/s,能够较好的满足系统的要求。因此选用方案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 形对铁丝做切割运动循迹前行。
二、硬币的检测
在除了上述三种情况下,再添加第四种范围,当 Ldc_Val>12000(此值根据实际测试调节)时,就是检测到硬币在铁丝边缘,此时蜂鸣器发声提示。但是,有些时候会导致蜂鸣器频繁发声,这种情况是因为蜂鸣器发声的 Ldc_Val 值太低,导致铁线处于线圈正下方时 Ldc_Val 值也会处于蜂鸣器发声的 Ldc_Val 范围内,这时可以把蜂鸣器发声的临界值调高些。
还有一种情况就是线圈会在没有硬币的地方会偶尔产生一个异常的数值,该数值处于蜂鸣器发声的 Ldc_Val 值范围导致蜂鸣器发声,对于这种情况,我们首先想到的是在程序上采用连续读取多个检测回来的数字量去除最大最小值的再求平均值的方法来滤除掉这些偶尔的异常值。
三、程序主流程图
实物图
小车共有三个*,其中车头两个*,车位一个万向轮(方便转弯),LDC1000安装在车头正前方。
代码获取
关注微信公众号【嵌入式大杂烩】回复关键词:循迹小车,即可获取。
总结
电子设计竞赛是组队参加的,这就不得不说我的另一位队友了。一位真正的电子发烧友,真正的喜欢电子,而我是伪电子发烧,竞赛取得一等奖一半以上是他的功劳。他是我的一位大学室友,我人生中的贵人之一啊。若不是他当初拉着我一起去搞智能测控,我现在应该是在车间里工作吧,而不是坐在办公室码代码。他的付出也得到了很好的回报,现在也在一家大公司里工作,在这里祝愿他。希望,未来我们有机会的话可以在一起工作,还可以合作。
TI杯电子设计竞赛的方式为:在4天3夜里完成作品的所有工作,包括硬件、软件及报告。这是个很好的锻炼过程,各位还在上大学的朋友有机会一定要积极参加,竞赛的过程很煎熬,但是会让你收获很多。
【往期精彩笔记推荐】
1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!