本贴由MCU起航原创,首发于博客-MCU起航,版权归本人所有,如有转载,请注明出处链接!
接着上一篇文章,咱们继续
想清楚这几点之后我就开始动手准备了,首先是单片机,我选用的是stm8s103f3P6,这是一个20管脚的单片机,flash空间只有8k rom,1k的ram。在选之前,其实我自己也不知道这个东西能不能实现我的要求。但随着设计的过程进慢慢的进行,我发现它远远够超出我的预期,功能是非常强大的。
记得之前我在贴吧看到一篇帖子,就是在描述这个单片机,当时他把stm8s和传统的51做了一个对比,把它称为8位单片机的性价比之王,这个说法虽然有些夸张,但是在一定程度上也体现了这个单片机的功能强大。
我为什么会想到选这个芯片,其实是因为之前在淘宝上闲逛的时候,看一些最小系统板。当时看到他的照片的时候有一丝惊讶的感觉,因为它的体积非常之小,注意是最小系统板,它和一个一元的硬币放在一起也依然显得非常小巧,所以当时忍不住就买了几个回来做测试,结果发现非常好,然后价格也不贵,当时的价格我记得是3块钱左右。放个图:
我当年买的时候是三块多,现在涨了点。
角度传感器这个就不用说了,MP6050因为用的比较多,网上资料也比较多,价格也合适,所以就选它。
然后是电机驱动的部分,这里有两个选择,一个是L9110s,另外一个是tb6612,另外一个还有传统的l298n,但是那个东西体积非常太大,太丑了,我不喜欢,所以把它抛弃掉了。
那L9110S和TB6612怎么选?
这两个模块其实我都有买回来测试。先说L9110S,当时的价格比TB6612低一点,测试过程中发现有两个问题:一个是发热比较严重(据说后来新的芯片解决了发热的问题),当时我甚至加了散热片,只跑了几分钟就热的不行;另一个是能量转换效率貌似不高,打个比方,同样用50%的占空比驱动电机,只用肉眼观察,TB6612比L9110S明显要快一点。
注:我说的这些数据都是2016年~2017年做测试得出的结果,现在可能有了变化,所以仅供参考。
还有一件事比较诡异,2019年下半年,TB6612在淘宝上几乎断货。部分有货的,价格从四五块钱直接张到了20左右。咋回事?
然后是电池,电池最开始选的时候我也没有什么经验,所以就各种电池都买了一些,4.2伏的,8.4伏的都有。
然后是电机,电机的话,我主要看中了一款n20的电机,据说性能比较好。所以我在淘宝买了一些。看了一下各方面参数都还可以,但是带码盘和不带码盘的电机价格差别有点大,但是前期研发先不管,买回来再说。
最后是轮胎,刚好和n20电机配套的,有一款D字型的橡胶轮胎,外形也是非常的可爱,然后就买了一些回来。
然后就开始搞事情了。
首先是搭建这个小车的结构,我一开始并没有直接使用PCB来做车身,也没有用亚克力板子来做车身,我使用的是洞洞板,按照一定的尺寸评估整个车身的大小,然后用剪刀裁定的尺寸,然后使用铜柱进行多层的结构组装。
组装的过程也是非常的暴力,剪子钳子,热熔胶,螺丝刀,各种工具都要上,还有杜邦线,电烙铁等等。
组装的过程很惨烈,出来的外形自然也就没那么好看了,这里应该还有当年组装的外形,放个图给大家看一下,这就是当时最早的一个版本。比较脏也比较难看,现在已经放在一边吃灰了。
可以看到左边是MPU6050,右边是STM8S的最小系统板。上下两层洞洞板,采用铜柱做固定。
怎么确定这个新组装出来的结构可以用,这是一个最基本的问题。但是好在我有之前买的那个平衡车,于是我把它的控制板拆下来,然后使用我新买的电机、轮胎、电池、角度传感器、电机驱动模块组成的车身,这样组装在一起做了一个测试。
这个时候第1个问题出现了,就是使用32的平台来控制这个结构时。如果使用的是DMP方式读取MPU6050的角度,控制小车,是可以站立的;但如果使用原始数据转化为角度再去控制的话,几乎是站不住的。
发现这个问题是非常吓人的,因为如果必须使用DMP方式的话,那就跟我的初衷相违背了。所以这个问题必须要想办法解决。
于是我又开始了长时间的上网查资料,这次查资料的时候,主要的重点放在小车的结构上面。
什么样的结构小车最容易平衡站立,而且站立的最稳,是不是要重心低一点?还是要质量分布均匀一点?还是结构要大一点?
甚至我回想起了小时候玩的一个游戏,就是用一根手指,把一根木棍立在一根手指上,看如何能保持这根棍子的直立。到底是质量大的棍子容易直率还是质量小棍子容易直率。
随着结构和程序的不断优化,我慢慢发现了这个问题的核心点,根据我的回忆,当时最核心的地方在于,由于我是用的是原始数据计算角度的方式,这种方式和DMP方式计算出的角度有一定的偏差。而这个偏差会导致当小车发生偏移的时候,我的电机没有办法快速的给出响应,也就是说反应速度不够。
有些人看到这个问题,第一反应就是8位的处理器速度不够,但其实你忘了我在上面贴出的第1个例子,他使用的单片机就是8M的时钟,而这里我使用的stm8s,我已经把它的时钟设置为16M,所以这个时钟的因素是可以忽略的。
然后引起我注意的是一条不太起眼的消息,就是网上有人在讨论小车结构的时候会说到车身越大、平衡越好掌握;越小、越不容易掌握。因为大的车身它发生偏移的时候,需要的时间长一些,而小的车身发生倾斜的时候,时间貌似更短,所以这就需要更快的反应速度。
这个时候就需要一个控制算法的出现了,前面也提到过,就是PID。因为当前市面上大部分平衡小车的套件,他们使用的电机性能比较强,同时车身也比较大,所以电机的响应能力和速度是完全可以应付车身的,处理小车倾斜时面对的状况。
但是我现在选了一个车身比较小的结构,同时电机扭距不是特别强的电机。那么这个电机的性能就需要一些特殊方式来提高,而提高响应速度最直接的方式就是使用PID这个算法里面的参数I,也就是积分。积分的特性就是它会累积误差,时间越久累积的误差越大,它纠正的力度也就越大,当然这个时间久并不是咱们人体感应的时间,而是单片机的时间。对他来说几个循环过去,如果发现误差还在继续增加,那么它会产生非常强大的修正的力,这个力会作用在电机上,最终使小车的车身恢复平衡。
终于把这个因素考虑进来之后,小车颤颤巍巍的站了起来,第1个问题顺利解决。
发现他摇摇晃晃的站了起来,这个时候我可以确定这个结构是可行的。
这个时候工作要分两个方向同时进行,一个是电路板的绘制。当时第1批板子,我使用的是autumn designer这个绘图工具。当时我印象里应该是画了两三个版本,然后发给嘉立创去打样。现在还能找到当时的板子,随手放一个图。
可以看到,那个黑色的是散热片,下面紧挨着L9110S模块。中间的两个排母用来接STM8S的最小系统板,MPU6050挨着L9110S在另一个角落。
另外就是程序的编写,stm8s的单片机从我买那个最小系统板回来之后还是第1次用,但是编程方式和其他单片机都是大同小异的。只要注意一下细节,网上搜几个例程,搜几个参考的工程,基本上都是可以玩上手的。况且,卖家当时还提供了很多基础的资料,上手完全没有问题。
而且当时我心里想的是32我都玩了,8我还玩不了呢,这是一个很简单的逻辑问题。
准备程序的移植和编写,当时在32这个平台上,我已经可以正常使用了,但是移植到stm8这个平台上,还需要一些工作。基础框架是没有问题的,使用普通IO模拟IIC总线读取MPU6050的数据,但是因为stm8s103f3P6这个芯片的flash非常小,所以没有办法使用DMP的方式读取比较高精度的数据。因此,所以这里使用的是读取原始数据,然后解析的方式。
也就是直接读取加速度和角速度,然后使用重力垂直向量的方式进行解析,这样来获取角度。这个思路也很简单,如下:
初始状态是,加速度计读数是A_X =0; A_Y=0; A_Z=1g;如下图:
然后旋转一定角度后是这样:
旋转后仍要保证竖直方向是1g的加速度,所以有将X轴和Z轴的加速度值矢量叠加后为1g即可用反正切求出P的大小来了
如图:
即可得
Angle = atan2(Acc_x,Acc_z);(注意:这里得出来的角度是弧度)
(上面内容转自CSDN博客:基于MPU6050的加速度求角度)
当时出现的第2个问题是,小车虽然站了起来,但是抖动和晃动是比较明显的,不是一个非常平稳的过程。怎么办?
刚好那段时间认识了做四轴的小马哥,他对MPU6050了解应该比我强,所以当时在网上简单咨询了一下。但因为小马哥看不到实物,不好分析。
这个时候我从两个方向去考虑问题,首先是结构上,有一部分原因我会怀疑这个小车的车身重量太轻,导致电机在对小车进行纠正的时候力度过猛,使小车产生震荡。
针对这个考虑,我在小车底部用胶粘了很多铜柱,增加车身重量,发现没有效果,然后又把这些铜柱放在车身顶部,然后又把它们摆成了各种形状,要么是长的要么是直立的,总之增加小车的质质量,进而增大它的惯性,但是这种方式依然没有效果。
第2个方向是对程序进行优化。例如调节PID参数、调整程序循环周期、在PID算法的基础上做微调等等,效果都不明显。
这里说一下,当时使用的滤波算法是卡尔曼滤波,是从那个不靠谱的STM32小车卖家那里移植过来的。
后面我在想,是不是算法移植有问题。查了一下资料,果然!已经有网友写成了可直接使用的库文件,同时,在使用卡尔曼滤波的时候,需要对相关参数做调整,最主要的应该是周期!
调整完成之后,小车从哆哆嗦嗦的状态,一下子变成了平稳的滑翔者!当时夜里11点多,我媳妇睡的呼呼的,我激动的把她叫醒,演示了一下我的样品。然后她给了六个字的评价:
别烦我,睡觉呢!
嗯,谢谢鼓励!
到这一步,角度环已经没有问题了。当时我还在QQ空间发了个视频,显摆了一下。当时很多人都希望我赶紧弄完,然后发教程。但谁知,一等就是两年~~~
本系列已完结,相关章节请点击:
如果要购买地心一号平衡小车,可在淘宝搜索:地心一号,或者在公众号:AI电堂(可开发票) 中获取购买方式。