速度闭环
速度控制 增量PI
速度环使用增量式PI控制,电机本身惯性小,需要加I控制。同时因为无需考虑历史误差,不采用位置式。
int16 SpeedError[4][3]={0};//用于保存误差:上上次 上次 当前
float SpeedPID_1=0.000;
float SpeedPID_2=0.000;
int16 PWM_Output_1,PWM_Output_2;
#define Kp1 3.3 //比例常数
#define Ki1 0.3 //积分常数
//速度环单次修正限幅 除以5为真实占空比
#define Umax 100
#define Umin -100
//PWM变动限幅 除以5为真实占空比
#define Pmax 350 //495
#define Pmin -350//-495
int PID_Speed_1(int speed,int ActualSpeed)//speed转速目标值,ActualSpeed转速实际值
{
SpeedError[0][2]=speed-ActualSpeed;
SpeedPID_1 = Kp1 * (SpeedError[0][2] - SpeedError[0][1])
+ Ki1 * SpeedError[0][2];
for(uint8 i=0;i<2;i++)
{
SpeedError[0][i]=SpeedError[0][i+1];//数据左移,低位扔掉
}
if(SpeedPID_1 >= Umax)SpeedPID_1 = Umax;//调整值限幅
if(SpeedPID_1 <= Umin)SpeedPID_1 = Umin;
PWM_Output_1 += SpeedPID_1; //刷新PWM占空比
if(PWM_Output_1 > Pmax)PWM_Output_1 = Pmax;//输出值限幅
if(PWM_Output_1 < Pmin)PWM_Output_1 = Pmin;
return PWM_Output_1;
}
实际上最后占空比不要达到100%或者-100%就行,这里需要对单片机做适配。
对于双电机的情况需要两个速度环控制,最后调好的PI参数应该差距不大。
该PID的输出不能直接控制电机,其输出的是变化量(需要调整的量)。
该函数最后输出的量为处理过的PWM占空比,可用于直接控制电机。