制作Arduino自平衡车(三)

分享,记录 2017-01-29 4 条评论 访问: 14,036 次

第不知道多少天

车总体上能立起来了,但对于较大的干扰,车会向一个方向加速倒去。可能pid参数调得不太好吧,从某些角度考虑参数确实很难调,电机的死区电压较高,而且不同,pwm也是8位精度的,这样可用的pwm范围就更小了,而电机的齿缝较大,有3度左右的偏差。
对于整个系统来说输入量有以下几种,角度,角速度,电机编码器反馈的速度。而输出量便是pwm。
再说下滤波,我用的是卡尔曼滤波,互补融合我没试过,不过据说这两种差不多。
arduino 主函数
diy-arduino-auto-balance-car

还有就是pid,比例积分微分,在直立车中,控制主要分三个环节,直立环,速度环,转向环,最主要的便是直立环,直立环是基础,其他两环其实就是干扰,所以其参数尽量小,这有利于增加系统的稳定性。
直立环,主要是一个式子

pwmbalance=kpangle+kdd(angle)

直立环

diy-arduino-auto-balance-car

注:我对角度与角速度进行了低通滤波
kp,kd是系数,angle是角度,d(angle)是角度的微分,即角速度。如果直立环调得好,车是可以很好地静止,并且有一定的抗干扰能力。kp项主要是给系统一个大的趋向,即车向哪边倾斜,车轮就向哪边转动,倾角越大,速度越快。如果只有kp项,系统不能完全直立,kp过大会导致系统低频震荡,此时应减小kp。而kd项是提供阻尼力,防止系统过冲,如果只有kd项,系统在静止的时候车轮不会转动,当系统角速度变化时,车轮会转动,kd过大,会导致系统高频震荡,过小,会导致系统左右摇摆,最终倒下。kp项尽量调大,有利于增加系统的稳定性,这也可以为后面速度环,转向环打好基础。
速度环,主要也是一个式子

pwmvelocity=kpvelocity+kivelocityintegral

速度环

diy-arduino-auto-balance-car

注:我对速度进行了平滑处理,对积分项进行了限幅
kp,ki是系数,velocity和velocityintegral分别是相对速度和速度的积分。首先kp项是将速度反馈到系统中从而形成一个有反馈的环形系统,进而可以以一定速度维持直立,并且可以保持倾角。而速度的积分可以抵消稳态误差,此项可以讲微小误差放大,进而使系统趋于稳定,但ki一般设置得较小,不宜过大。积分项可以让系统回位,但效果不太明显。对于系统以一定速度运行,那么也是在此积分项上进行增减,对velocity的增减可能会导致系统不稳定。同时,对积分项添加误差,就可以实现平衡车的前进后退的效果。从某种意义上讲,直立环是一种利用误差加速的过程。至此,速度环也差不多了。
至于转向环,主要是对积分项进行操作,添加适当的误差,所以最后的总pwm公式就是

pwmA=pwmbalance+pwmvelocity+pwmturn

pwmB=pwmbalance+pwmvelocity-pwmturn

注意:pwmA,B分别代表两个电机的pwm,对于转向pwm的处理就是该变pwmturn的符号实现的差速
至此,基本的直立pid也谈得差不多了。
相关链接:
制作Arduino自平衡车(二)
制作Arduino自平衡车(一)


除非注明,嗯VIEW文章均为原创,转载请以链接形式标明本文地址
本文地址:https://www.umview.com/diy-arduino-auto-balance-car-3

本文由 nash.zhao 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

4 条评论

  1. Wslibeia
    Wslibeia

    看了后颇有启发,以至于在去年的电子竞赛中取得好成绩,非常感谢

    1. nash.zhao
      nash.zhao

      这个关联词,让我很迷啊!

  2. Mark
    Mark

    虽然我第一次没看懂,但是觉得很厉害!

    1. nash.zhao
      nash.zhao

      ..谢谢.额,,其实写得不好,

添加新评论