自平衡小车问题咨询-求老司机带路
平衡车爱好者一枚,和大家一样,看到这个东西就觉得好玩的不得了,想搞一个玩玩。不过很多人都是自己动手DIY,我比较懒,于是上淘宝买了一套,然后自己组装玩。避免广告,我就不说店铺名字了。先简单说一下配置:单片机是STM32F1系列的,陀螺仪是MPU6050,电机驱动芯片是TB6612,电机型号是JGA25-371电机,减速比1:21,11.1V锂电池供电。
工作流程也很简单,初始化部分我就不说了,老司机都懂得。循环部分流程如下:
读取蓝牙串口指令 - DMP方式读取当前角度 - 读取光栅信号个数 - PID处理 - 循环
过程大致如上所示,时钟运行频率是72MHZ。
本帖最后由 lazyduck 于 2016-8-3 16:12 编辑
但是在本论坛潜水一段时间,发现很多高手都是用arduino做的,时钟频率只有16MHZ,角度获取方式也很简单,2tan运算+一阶滤波就出来了。所以我也试着把系统的时钟频率往下降。
从72MHZ一路降到24MHZ,其他方面不动,PID参数略作调整。虽然稳定性略有变化,但是都能站住。唯独到了16MHZ的时候,这种方式站不住了。参数各种调,死活站不住。
当时以为是PID参数的问题,于是,看了各路高手调参数的视频,从角度环的P开始,逐步调,调的生无可恋了,还是不行。在此期间也问了很多爱好者,答案各不一样。但是都强调一点,那就是:电机的性能很重要!
所以有很长一段时间,我在想,是不是我这个电机的性能不行,比如说扭矩太小。于是又各种翻案例对比:发现淘宝上卖的各种小车电机扭矩大部分是0.8kg或者1kg的,我这个是0.4kg的,是不是扭矩不行?
这个问题,我到写帖子的时候依然无法给出绝对的答案,只能说可能不是,因为后来我用其他方式实现了它在16MHZ频率下的站立。
好,继续。
当时还得出了一个很可笑的结论,就是自平衡车无法在16MHZ的情况下用DMP方式读取角度维持平衡,理由是DMP方式比较慢,在16MHZ的时候循环一圈下来,需要的时间是8个毫秒左右,也就是说我认为125HZ左右的循环速度满足不了小车的站立。
高手看到这里可以打我脸了.............
问了一圈,忽然想起来,为啥不问问卖家呢?于是脑残的我去问了卖家。
这里要说一下,卖家发货时提供的程序只有一份读取DMP方式的,没有一阶滤波、也没有卡尔曼。跟卖家软磨硬泡了一下午,给我找来了一份卡尔曼的,电机驱动方向有点问题,PID参数也需要调整。
于是我拿过来,整了一下,在16MHZ的情况下,竟然就占了起来。而当我看主函数循环周期的时候,发现只有五六十HZ。 所以前面说125HZ情况下站立不起来,真的too young!
所以,现在说出我的第一个问题:为什么在16MHZ的情况下,DMP方式小车站不起来,而卡尔曼滤波的方式能站起来?
好,继续...
然后是一阶滤波,不要以为我没试过,网上普遍说这种方式简单,虽然数据不是太准,但是做小车没问题。不过我调了几天,搞不定!
代码如下:
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和滞后性相关,我也进行了调试,有效果,但是达不到要求。
小车放在地上,能明显感觉到已经向一个方向偏了一段时间 了,才反映过来。如果不使用一阶滤波也不用卡尔曼,可以感觉到小车的反映速度明显快很多(当然了,还是站不起来~~~)
所以,这是我的第二个问题:一阶滤波的滞后性怎么处理,是否和电机性能有关?
忽然想起来还有第三个问题:卡尔曼方式进行站立的时候,刚上电的时候,小车会左右抖动一小段时间,这个是咋回事?
谢谢各位老司机了! :funk:研究的进度条不错嘛。记得做好记录,虽然我没调过平衡车,不过我的坑里一大堆都是这样整不下去的。。。。。:lol:lol:lol:lol:lol:lol,坑迟早要填完的,只要记录笔记没有丢 迷你强 发表于 2016-8-3 21:59 static/image/common/back.gif
研究的进度条不错嘛。记得做好记录,虽然我没调过平衡车,不过我的坑里一大堆都是这样整不下去的。。 ...
唉,累心啊 没人回复啊~~~~~~~~~~ 唉,自己顶一下,期待老司机的回答 还是没人啊~~ 我的车也是反应很慢,我用的串口MPU6050,直接读滤好波的数据,可是小车响应很慢
页:
[1]