(背景介绍:
进行到上一篇已经能让遥控车听话了。
已走过的路线是:让马达转->遥控器与车无线收发信息->发让马达转的信息。
其中:“发让马达转的信息”这里就有两种方法了。
上一篇Sugar用的是开环控制方法。通俗讲就是:单片机输出固定 pwm 让马达转,不管马达转速是多少,更不管转速是否一致。
从本篇起,开始初涉闭环控制方法。通俗讲就是: 不只管让马达转,还要负责让各个马达能够维持指定的转速。
凭什么维持指定的转速
想维持指定的转速,就要知道:
当前的转速是多少;
离指定转速差多少。
本节主要解决第 1 个问题。
简而言之:凭ab相编码器反馈数据换算出当前转速,从而进行闭环控制来维持指定转速。
那么啥是”ab相编码器”呢?看看下面的视频就知道了。
下面用一张图圈个重点:
stm32 与 ab 相编码器
通过上面的视频,已经知道怎么用stm32连接ab相编码器了。
这里说一些细节的东西。
1、30线ab相编码器
什么叫“30线”:30线就是码盘转一圈会产生 30 个脉冲以供计数。
2、怎么验证“一圈计30个数”
按图中方法,结合上面视频中的在线调试方法,可以验证将码盘转一圈计数变动 30 个。
3、stm32定时器的作用
(1) 定时器一经开启,自动计数,CPU只要在需要时管定时器要数就行了。
(2) 自动通过 ab 相判断转向,按方向不同自动对计数进行加减。
stm32 软件上要注意的问题
处理这个问题的方法是:
代码开源地址是:
https://github.com/SuWeipeng/4wd
如何换算速度
这里说下思路,详细处理都在代码里(上面有代码地址)。
处理问题:思路决定方向,耐心保障细节。思路很重要。
1、速度从何而来?
这里不区分线速度和角速度,笼统地用“速度”俩字概括。
速度表示“单位时间内的变动量”,这里提到一个重要的数据:时间。
所以想换算出速度,代码里要有个地方计算“时间增量”。
本次训练为了简单,代码里就用固定时间差(50Hz)的圈数差代表速度了。
2、速度的常用单位
(1) m/s 表示“米每秒”,是线速度单位;
(2) rpm 表示“转每分”,是转数单位;
(3) rad/s 表示“弧度每秒”,是转速单位。
做速度换算一定要注意“单位”(也叫“量纲”),有单位的数据才是有意义的,不然都是瞎算。
3、马达转数与轮子的转数
相差一个减速箱的“减速比”。
4、轮子的转速与轮子的线速度
线速度 = 转速(角速度)* 轮子半径
5、小车速度与轮子的线速度
麦轮小车有专门的运动学分析,本文不做深入研究。
有兴趣的读者可以看代码里的 Doc 目录,里面有文章专门讲这个。
当前进展与下一步安排
到目前为止,已经可以通过ab相编码器得到速度了。
本次训练力求简单,目标速度是一个常量(确定值)。
剩下就是:写个控制算法,让编码器得到的“检测速度”能够达到并维持在“目标速度”附近。
这里的控制算法 Sugar 直接用 ArduPilot 目前最新升级的 pid 算法。下一篇单独讲这个(爱好飞控的朋友们会喜欢这个)。