速度闭环

速度控制 增量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占空比,可用于直接控制电机。

最后修改:2022 年 03 月 02 日
如果觉得我的文章对你有用,请随意赞赏