『文章』平衡小车PID,就该这么调


上一篇文章:看完这篇文章 , 还不会做平衡小车 , 你来打我 。 描述了平衡小车的制作过程 , 也开源了一部分设计资料 。 在上篇文章留言中 , 有朋友说:
『文章』平衡小车PID,就该这么调
本文插图
安排 , 必须安排!
1、PID 关于 PID 的概念 , 网上相关的帖子太多 , 在此不再赘述 。 之前也有过几篇关于 PID 的文章: 再论 PID , PID 其实很简单 。。。 PID 算法搞不懂?看这篇文章就够了 。
这次我们聊下关于平衡小车中的 PID , 在平衡小车的 PID 中 , 分为三种 PID , 分别是直立环、速度环、转向环 。 任何一个 PID 最终计算出来的都是电机 PWM , 都是需要赋值给电机的 。 环环嵌套 , 得出电机的最终控制 PWM 。
2、直立环 PID 在直立环中 , PID 的入口参数为:平衡小车的姿态角和姿态角对应的角速度 。
值得说明 , MPU6050 得出来的姿态角有三种:PITCH(俯仰角)、ROLL(翻滚角)、YAW(航向角)一般来说 , MPU6050 都是平方且平行装在平衡小车上 , 总不会有人垂直装吧
如果平放且平行安装 , 那么直立环 PID 的入口参数为:Pitch 或 roll 。 直立环中 , 有一个较为重要的概念 , 也就是机械中值 。 通俗讲 , 小车在不接受任何外力或者电机作用 , 能够找到一个角度自我平衡 。 如何理解这句话:很简单 , 小车电机不转动 , 人的手扶着小车 , 小车总能找到一个角度 , 自我短期平衡 。 此时的角度就是机械中值 。
直接看代码:
/*******************************************************************函数功能:直立 PD 控制入口参数:角度、机械平衡角度(机械中值)、角速度返回值:直立控制 PWM作者:公众号【大鱼机器人】******************************************************************/int balance_UP(float Angle,float Mechanical_balance,float Gyro){float Bias;// 角度误差int balance;// 直立环计算出来的电机控制 pwmBias=Angle-Mechanical_balance; //===求出平衡的角度中值和机械相关balance=balance_UP_KP*Bias+balance_UP_KD*Gyro;//===计算平衡控制的电机 PWMPD 控制kp 是 P 系数 kd 是 D 系数 return balance;} 从程序上看:balance_UP_KP 为直立环的 P , balance_UP_KD 为 直立环的 D 。 如何确定 P 和 D 的大小和极性?
2.1 直立环 P 范围确定:需要先确定 PWM 的范围 , 例如 , 定时器最大的 PWM 为 7200 , 此时占空比为 100% , 电机应该是全速运行 。 如果小车需要直立 , 摆幅 , 差不多就要≤10° 。 ,如果超过此范围 , 小车抖动较为厉害根据直立环的程序:
balance=balance_UP_KP*Bias+balance_UP_KD*Gyro; 由于 PWM 最大是 7200 , 角度在 10° , 反推可以得到:直立环的 P 可选范围应该在 0~700 。
当然这只是个大致的范围 , 具体多少还需要进一步调试 。
2.2 直立环 P 极性确定:极性也就是符号 , P 到底是给正的 , 也是负的 。
直接给 kp 正负值 , 然后观察现象:
正常出现的现象是负反馈 , 小车往那边倒 , 电机转动使得小车往要倒的方向去追 。 使得小车能够往反方向站起来!
如果出现正反馈 , 车往哪边倒 , 电机转动使得小车快速倒下 。 这种现象就是不对的 。
2.3 直立环 P 大小确定:慢慢试错 , 从小到大 , 响应慢慢加快也就是小车倒下后恢复直立的时间越来越短 , 直到小车出现大幅度的低频抖动!