时间当时是2016年,网上大部分的方案是STM32+MPU6050,也有一些用arduino做的。Arduino的问题我稍后再说,当时想的是:随大流!既然32的案例多,那么资料就多,出于稳妥,先买个样机玩玩吧。
当时没认真对比,随便买了个。买回来才发现,资料少的可怜。店铺名称我就不说了,这里奉劝大家,无论买什么,多咨询,多对比。否则学不好,不要怪别人。样子如图:
外形还是很霸气的,大小跟我的一只鞋差不多大,电机扭矩也很给力。但是依然弥补不了卖家配套资料不足的短板。
资料少是一方面,让我惊掉下巴的是,程序居然是用STM32的2.0的库写的。没经历过STM32库函数版本变动的同学是不会理解的,32的库从刚出来到现在相对稳定的3.5版本,变更了几次,每次都是大变样。早期的工程师叫苦不迭,甚至还有的扬言说要自己写一套库函数。
但当时是2016年,16年啊!!!3.5版本已经稳定好几年了!但是卖家提供的程序竟然是2.0版本的库函数,当然,功能是没有问题的。所以我早期的工作就是把整套程序用3.5的库重写一遍,既熟悉了程序流程,也方便了后续的调试。
资料少我忍了,又让我发现一个问题,卖家的原理图和实际硬件不配套。我耐着性子跟卖家反映了这个问题,给出的答复是:技术保密,不影响应用。
我再忍。
然后又发现一个问题,这个电路没有留JTAG或者SW接口,只有一个串口下载的接口。注意,连排针上都没有调试接口,可想而知,这个板子设计的有多失败。
到这里,我竟然已经习惯了。也无所谓了,于是就开始改程序改着玩。
前面我在把库函数版本从2.0变到3.5的时候,已经过了一遍流程。所以每段程序的功能我几乎都了解了,这套板子是STM32+MPU6050,然后使用6050内部DMP固件的方式来获取角度。这种方式获取的值的精度是很高的,而且不需要再经过滤波。但是同样的,对单片机的ROM和RAM的要求也很高。换句话说,低配的单片机玩不来!
先改哪?
就从呼声最高的PID参数开始吧。关于PID参数整定的文章,网上一搜一大堆。同样,抱怨参数不好调的文章也是一大堆。那我就改参数改着玩吧。
结果发现,无论怎么改(只要变动不是特别夸张),,,,,貌似小车都很稳定,这........和我预想的不太一样啊......
这个问题曾经困扰了我很长一段时间,直到搜了一堆相关资料又看了
稚晖
的文章,才解决了我的疑惑。
稚晖
是谁?后面再说,同样,会提到他的蛋黄,一个萌翻了的自平衡小车。
简单来说,平衡车好不好调,有几个因素影响:
void Yijielvbo(float angle_m, float gyro_m)
{
float dt = 0.0f;
dt = (float)TIM_GetCounter(TIM1);
dt = dt / 1000000;
TIM_SetCounter(TIM1, 0);
angel = K1 * angle_m+ (1-K1) * (angel + gyro_m * dt);
}
dt是每次获取角度的时间间隔。使用这种方式,给我最大的感觉就是严重的滞后性。参数K1和滞后性相关,我也进行了调试,有效果,但是达不到要求。
小车放在地上,能明显感觉到已经向一个方向偏了一段时间了,才反应过来。如果不使用一阶滤波也不用卡尔曼,可以感觉到小车的反应速度明显快很多(当然了,还是站不起来~~~)
所以,我当时主要疑惑的问题:一阶滤波的滞后性怎么处理,是否和电机性能有关? 现在回想起来,有两个可能因素: 1、STM32频率从72降到16MHZ的时候,IIC的速度可能忘了调节了; 2、一阶滤波的代码可能没调好。 一阶滤波的方式当时试了好几天,最后忍不了了。换卡尔曼滤波吧! 这里要说一下,卖家发货时提供的程序只有一份读取DMP方式的,没有一阶滤波、也没有卡尔曼。跟卖家软磨硬泡了一下午,给我找来了一份卡尔曼的,电机驱动方向有点问题,PID参数也需要调整。
于是我拿过来,整了一下,在16MHZ的情况下,竟然就占了起来。 卡尔曼,你是个好人! 到这里,角度获取的几种方式,我都已经过了一遍了。优缺点,心里也有数了。接下来,做点什么?(原谅我自己玩的比较嗨,快忘了给外甥做玩具的事了) 我想把程序简化一下,看看能简化到什么程度,于是开始了给这套程序瘦身。不瘦不知道,一瘦发现卖家的程序里很多没用的东西(我竟然已经习惯了这种卖家,没有情绪拨动了),于是我都逐步测试,确认没用,然后删了。 简化之前,下载到单片机里面要占用30多K,简化以后,我印象里只有15K左右了。如果使用寄存器方式编程的话,代码量还要小一些。 到这里,我已经清楚要给外甥做一个什么样的玩具了。这个玩具不只是给他的,也是给我自己的。 硬件电路框架还是网上普遍在用的,但是核心我已经不想用STM32了,因为没有意思。我想用STM8,因为做这个东西,8位单片机足够了。 这也是我做这个东西,强烈想表达的一个想法。有一段时间,我在QQ群里和网友交流技术问题的时候,经常会有一些新人提问:学8位单片机好,还是学STM32好? 为什么他们会问这样的问题? 因为32位单片机的各方面性能几乎都是碾压8位单片机的,很多用人单位确实也在技能要求里面提到了会用到32。但是,这并不意味着8位单片机就不行了,说个最俗的因素,8位单片机便宜! 骚尼哥在回答这类问题时,说了一段话,我印象很深:会用STM32不代表牛逼,会用8位单片机不代表不牛逼,能把STM32的项目用8位单片机做出来,这才算牛逼! 是的,32位单片机确实性能强,但如果用不到合适的地方,就是资源的浪费,这不是一个优秀的工程师该做的事。 很多新人做项目,很少考虑需要用到的处理器性能,动不动就是32位单片机。 这对一件商品来说,确实是一件好事,因为被大众认可了。 但是对一个工程师来说,我不这么认为。 我印象很深的一件事,一个学生想做个平衡小车,但是角度环调不好,问我怎么回事。 我让他跟我说下他的硬件方案: 他说他用的STM32F4系列的某个芯片(型号我记不清了),电机是网上随便找的。 我当时的心里是一阵阵的无力感,F4系列都用上了,呵呵,但是电机这个最重要的因素却没认真考虑。 未完待续...... 地心一号-超迷你自平衡小车
外形还是很霸气的,大小跟我的一只鞋差不多大,电机扭矩也很给力。但是依然弥补不了卖家配套资料不足的短板。
资料少是一方面,让我惊掉下巴的是,程序居然是用STM32的2.0的库写的。没经历过STM32库函数版本变动的同学是不会理解的,32的库从刚出来到现在相对稳定的3.5版本,变更了几次,每次都是大变样。早期的工程师叫苦不迭,甚至还有的扬言说要自己写一套库函数。
但当时是2016年,16年啊!!!3.5版本已经稳定好几年了!但是卖家提供的程序竟然是2.0版本的库函数,当然,功能是没有问题的。所以我早期的工作就是把整套程序用3.5的库重写一遍,既熟悉了程序流程,也方便了后续的调试。
资料少我忍了,又让我发现一个问题,卖家的原理图和实际硬件不配套。我耐着性子跟卖家反映了这个问题,给出的答复是:技术保密,不影响应用。
我再忍。
然后又发现一个问题,这个电路没有留JTAG或者SW接口,只有一个串口下载的接口。注意,连排针上都没有调试接口,可想而知,这个板子设计的有多失败。
到这里,我竟然已经习惯了。也无所谓了,于是就开始改程序改着玩。
前面我在把库函数版本从2.0变到3.5的时候,已经过了一遍流程。所以每段程序的功能我几乎都了解了,这套板子是STM32+MPU6050,然后使用6050内部DMP固件的方式来获取角度。这种方式获取的值的精度是很高的,而且不需要再经过滤波。但是同样的,对单片机的ROM和RAM的要求也很高。换句话说,低配的单片机玩不来!
先改哪?
就从呼声最高的PID参数开始吧。关于PID参数整定的文章,网上一搜一大堆。同样,抱怨参数不好调的文章也是一大堆。那我就改参数改着玩吧。
结果发现,无论怎么改(只要变动不是特别夸张),,,,,貌似小车都很稳定,这........和我预想的不太一样啊......
这个问题曾经困扰了我很长一段时间,直到搜了一堆相关资料又看了
稚晖
的文章,才解决了我的疑惑。
稚晖
是谁?后面再说,同样,会提到他的蛋黄,一个萌翻了的自平衡小车。
简单来说,平衡车好不好调,有几个因素影响:
- 处理器性能,DMP固件的方式肯定是很好的,32没问题,但是一些低端单片机就玩不来了。这时,就需要读取原始数据,然后做一阶滤波或者卡尔曼滤波,这种方式来实现。
- 电机性能,非常重要!!!力矩越大越好。参数整定,说是P+I+D三个,但如果电机性能好,只要P+D就够了,不需要I。现在市面上的大部分平衡车套件几乎也不需要I,毕竟加了一个参数,难度会上去很多。
- 编码器精度。电机性能好,只能保证角度平衡,但是会朝某个方向一直跑,越跑越快,最后速度跟不上,倒下。编码器可以检测电机转了多少,不是转多少圈,是一圈的几分之几。精度高的编码器可以检测电机转了几百分之一 圈,精度低的编码器只能测 十几分之一 圈,甚至几分之一。
void Yijielvbo(float angle_m, float gyro_m)
{
float dt = 0.0f;
dt = (float)TIM_GetCounter(TIM1);
dt = dt / 1000000;
TIM_SetCounter(TIM1, 0);
angel = K1 * angle_m+ (1-K1) * (angel + gyro_m * dt);
}
dt是每次获取角度的时间间隔。使用这种方式,给我最大的感觉就是严重的滞后性。参数K1和滞后性相关,我也进行了调试,有效果,但是达不到要求。
小车放在地上,能明显感觉到已经向一个方向偏了一段时间了,才反应过来。如果不使用一阶滤波也不用卡尔曼,可以感觉到小车的反应速度明显快很多(当然了,还是站不起来~~~)
所以,我当时主要疑惑的问题:一阶滤波的滞后性怎么处理,是否和电机性能有关? 现在回想起来,有两个可能因素: 1、STM32频率从72降到16MHZ的时候,IIC的速度可能忘了调节了; 2、一阶滤波的代码可能没调好。 一阶滤波的方式当时试了好几天,最后忍不了了。换卡尔曼滤波吧! 这里要说一下,卖家发货时提供的程序只有一份读取DMP方式的,没有一阶滤波、也没有卡尔曼。跟卖家软磨硬泡了一下午,给我找来了一份卡尔曼的,电机驱动方向有点问题,PID参数也需要调整。
于是我拿过来,整了一下,在16MHZ的情况下,竟然就占了起来。 卡尔曼,你是个好人! 到这里,角度获取的几种方式,我都已经过了一遍了。优缺点,心里也有数了。接下来,做点什么?(原谅我自己玩的比较嗨,快忘了给外甥做玩具的事了) 我想把程序简化一下,看看能简化到什么程度,于是开始了给这套程序瘦身。不瘦不知道,一瘦发现卖家的程序里很多没用的东西(我竟然已经习惯了这种卖家,没有情绪拨动了),于是我都逐步测试,确认没用,然后删了。 简化之前,下载到单片机里面要占用30多K,简化以后,我印象里只有15K左右了。如果使用寄存器方式编程的话,代码量还要小一些。 到这里,我已经清楚要给外甥做一个什么样的玩具了。这个玩具不只是给他的,也是给我自己的。 硬件电路框架还是网上普遍在用的,但是核心我已经不想用STM32了,因为没有意思。我想用STM8,因为做这个东西,8位单片机足够了。 这也是我做这个东西,强烈想表达的一个想法。有一段时间,我在QQ群里和网友交流技术问题的时候,经常会有一些新人提问:学8位单片机好,还是学STM32好? 为什么他们会问这样的问题? 因为32位单片机的各方面性能几乎都是碾压8位单片机的,很多用人单位确实也在技能要求里面提到了会用到32。但是,这并不意味着8位单片机就不行了,说个最俗的因素,8位单片机便宜! 骚尼哥在回答这类问题时,说了一段话,我印象很深:会用STM32不代表牛逼,会用8位单片机不代表不牛逼,能把STM32的项目用8位单片机做出来,这才算牛逼! 是的,32位单片机确实性能强,但如果用不到合适的地方,就是资源的浪费,这不是一个优秀的工程师该做的事。 很多新人做项目,很少考虑需要用到的处理器性能,动不动就是32位单片机。 这对一件商品来说,确实是一件好事,因为被大众认可了。 但是对一个工程师来说,我不这么认为。 我印象很深的一件事,一个学生想做个平衡小车,但是角度环调不好,问我怎么回事。 我让他跟我说下他的硬件方案: 他说他用的STM32F4系列的某个芯片(型号我记不清了),电机是网上随便找的。 我当时的心里是一阵阵的无力感,F4系列都用上了,呵呵,但是电机这个最重要的因素却没认真考虑。 未完待续...... 地心一号-超迷你自平衡小车

本文介绍了使用Arduino制作平衡车的过程中,如何处理低端单片机的数据过滤问题,建议采用一阶滤波或卡尔曼滤波。同时强调电机性能的重要性,指出力矩大且参数整定恰当的电机仅需P+D即可实现平衡,大部分套件无需I参数。此外,编码器的精度对于防止车辆持续加速直至失控也至关重要。
856

被折叠的 条评论
为什么被折叠?



