Skip to content
 
📑标签
🏷stm32 🏷小项目 🏷c

🗒初墨

🍊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控制会立即加大电机输出。
  • 数学表达:

u(t)=Kpe(t)u(t) = K_{p} \cdot e(t)

其中u(t)u(t)是控制量,KpK_p是比例系数,e(t)e(t)是偏差。

  • 效果:快速减小偏差,但容易“矫枉过正”,导致震荡。

2. 积分控制(I):消除稳态误差,精准到位

  • 原理:累积历史偏差,解决“残留误差”。比如平衡车长时间速度偏低,I控制会逐步增加电机输出。
  • 数学表达:

u(t)=Ki0te(τ)dτu(t) = K_i \cdot \int_0^t e(\tau) \, d\tau

其中KiK_i是积分系数。

  • 效果:消除稳态误差,但响应慢,容易“积分饱和”。

3. 微分控制(D):预测未来,防止震荡

  • 原理:根据偏差变化率,提前调整控制量。比如平衡车速度变化过快,D控制会抑制电机输出。
  • 数学表达:

u(t)=Kdde(t)dtu(t) = K_d \cdot \frac{de(t)}{dt}

其中KdK_d是微分系数。

  • 效果:抑制震荡,但容易放大噪声。

二、平衡车站稳的物理原理:倒立摆的“力学魔法”

1. 倒立摆模型:平衡车的“力学基石”

  • 模型描述:平衡车可以简化为一个倒立摆,重心在支点上方,处于不稳定平衡状态。
  • 力学分析:
    • 当车身倾斜时,重力会产生一个力矩,使车身继续倾倒。
    • 电机通过驱动轮子产生反向力矩,抵消重力力矩,使车身恢复直立。

2. 控制目标:保持直立与速度稳定

  • 直立控制:通过PID算法调整电机输出,抵消车身倾斜力矩。
  • 速度控制:通过PID算法调整电机输出,保持车速稳定。

三、代码层推理解析:平衡车的“速度环魔法”

1. 偏差计算:速度环的“指南针”

c
Encoder_Least = 0 - (encoder_left + encoder_right);  // 计算速度偏差
  • 解读:encoder_leftencoder_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调参的“防翻车手册”

  1. 震荡过大:降低Kp或增加Kd。
  2. 响应过慢:增加Kp或Ki。
  3. 积分饱和:限制积分值范围或降低Ki。

六、总结:PID算法让平衡车“稳如泰山”

  • 比例控制:快速纠偏,响应迅速。
  • 积分控制:消除误差,精准到位。
  • 微分控制:抑制震荡,稳定系统。

掌握这三招,你的平衡车不仅能站稳,还能像杂技演员一样玩出花样!快去试试吧!🎯

Playlist
Total 4
  • 星茶会
    灰澈
  • song1
    author1
  • soewrewfg1
    author1
  • PIKASONIC - Blossom
    author1