Skip to content

前言

更新: Invalid Date 字数: 0 字 时长: 0 分钟

🍊Hello,各位好,我是面包!

这篇文档集合了面包的双轮平衡车项目的开发经历。

PID控制算法应该算是应用非常广泛的算法了。不管是智能车控制还是机械臂控制,乃至飞行棋控制都离不开PID。有一个很形象的例子,比如“如何控制一个“热得快”,让一锅水的温度保持在50℃?”。

🍞开发经历

平衡车的速度环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;
}