🗒初墨
🍊Hello,各位好,我是面包!
想让平衡车像杂技演员一样稳稳站立?PID算法就是它的“平衡大师”!今天,我们从底层原理到实战应用,深度剖析PID算法如何让平衡车“稳如泰山”,并揭秘其背后的数学与物理奥秘!
一、PID算法:平衡车的“三招制胜法宝”
平衡车的速度环PID代码
c
/**************************************************************************
Function: Speed PI control
Input : encoder_left:Left wheel encoder reading;encoder_right:Right wheel encoder reading
Output : Speed control PWM
函数功能:速度控制PWM
入口参数:encoder_left:左轮编码器读数;encoder_right:右轮编码器读数
返回 值:速度控制PWM
**************************************************************************/
int Velocity(int encoder_left,int encoder_right)
{
float Velocity_Kp=160,Velocity_Ki=0.8; //速度环PI参数
static float velocity,Encoder_Least,Encoder_bias;
static float Encoder_Integral;
//=============速度PI控制器=======================//
Encoder_Least =0-(encoder_left+encoder_right);
//获取最新速度偏差==测量速度(左右编码器之和)-目标速度(此处为零)
Encoder_bias *= 0.8; //一阶低通滤波器
Encoder_bias += Encoder_Least*0.2; //一阶低通滤波器
//相当于上次偏差的0.8 + 本次偏差的0.2,减缓速度差值,减少对直立的干扰
Encoder_Integral +=Encoder_bias; //积分出位移 积分时间:10ms
if(Encoder_Integral>10000) Encoder_Integral=10000; //积分限幅
if(Encoder_Integral<-10000) Encoder_Integral=-10000; //积分限幅
velocity=-Encoder_bias*Velocity_Kp-Encoder_Integral*Velocity_Ki; //速度控制
if(Turn_Off(Angle_Balance)==1||Flag_Stop==1) Encoder_Integral=0; //电机关闭后清除积分
return velocity;
}1. 比例控制(P):快速响应,及时纠偏
- 原理:偏差越大,纠正力度越大。比如平衡车速度慢了,P控制会立即加大电机输出。
- 数学表达:
其中是控制量,是比例系数,是偏差。
- 效果:快速减小偏差,但容易“矫枉过正”,导致震荡。
2. 积分控制(I):消除稳态误差,精准到位
- 原理:累积历史偏差,解决“残留误差”。比如平衡车长时间速度偏低,I控制会逐步增加电机输出。
- 数学表达:
其中是积分系数。
- 效果:消除稳态误差,但响应慢,容易“积分饱和”。
3. 微分控制(D):预测未来,防止震荡
- 原理:根据偏差变化率,提前调整控制量。比如平衡车速度变化过快,D控制会抑制电机输出。
- 数学表达:
其中是微分系数。
- 效果:抑制震荡,但容易放大噪声。
二、平衡车站稳的物理原理:倒立摆的“力学魔法”
1. 倒立摆模型:平衡车的“力学基石”
- 模型描述:平衡车可以简化为一个倒立摆,重心在支点上方,处于不稳定平衡状态。
- 力学分析:
- 当车身倾斜时,重力会产生一个力矩,使车身继续倾倒。
- 电机通过驱动轮子产生反向力矩,抵消重力力矩,使车身恢复直立。
2. 控制目标:保持直立与速度稳定
- 直立控制:通过PID算法调整电机输出,抵消车身倾斜力矩。
- 速度控制:通过PID算法调整电机输出,保持车速稳定。
三、代码层推理解析:平衡车的“速度环魔法”
1. 偏差计算:速度环的“指南针”
c
Encoder_Least = 0 - (encoder_left + encoder_right); // 计算速度偏差- 解读:
encoder_left和encoder_right是左右轮编码器读数,Encoder_Least表示当前速度与目标速度(0)的偏差。
2. 低通滤波:平滑数据的“降噪神器”
c
Encoder_bias *= 0.8; // 上次偏差的80%
Encoder_bias += Encoder_Least * 0.2; // 本次偏差的20%- 解读:用一阶低通滤波器平滑速度偏差,减少噪声对控制的干扰。
3. 积分限幅:防止“积分饱和”的“安全阀”
c
if(Encoder_Integral > 10000) Encoder_Integral = 10000; // 上限
if(Encoder_Integral < -10000) Encoder_Integral = -10000; // 下限- 解读:限制积分值的范围,防止控制量过大导致系统不稳定。
4. 速度控制:输出PWM的“魔法公式”
c
velocity = -Encoder_bias * Velocity_Kp - Encoder_Integral * Velocity_Ki;- 解读:结合比例和积分控制,计算最终的速度控制量。
四、PID调参:平衡车的“炼丹术”
1. 比例系数(Kp)
- 作用:决定纠偏力度。
- 调参技巧:从小到大逐步增加,直到系统快速响应但不过度震荡。
2. 积分系数(Ki)
- 作用:消除稳态误差。
- 调参技巧:从0开始增加,直到稳态误差消失,但避免积分饱和。
3. 微分系数(Kd)
- 作用:抑制震荡。
- 调参技巧:在P和I调好后加入,逐步增加直到震荡消失。
五、避坑指南:PID调参的“防翻车手册”
- 震荡过大:降低Kp或增加Kd。
- 响应过慢:增加Kp或Ki。
- 积分饱和:限制积分值范围或降低Ki。
六、总结:PID算法让平衡车“稳如泰山”
- 比例控制:快速纠偏,响应迅速。
- 积分控制:消除误差,精准到位。
- 微分控制:抑制震荡,稳定系统。
掌握这三招,你的平衡车不仅能站稳,还能像杂技演员一样玩出花样!快去试试吧!🎯
