查看: 703|回复: 0

[经验] 手把手教你玩转直流电机PID双环控制

[复制链接]
  • TA的每日心情

    2018-11-20 13:41
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2020-6-23 14:17:56 | 显示全部楼层 |阅读模式
    分享到:
    手把手教你玩转直流电机PID双环控制

    1.速度闭环控制
    我们一般在速度闭环控制系统里面,使用增量式PI控制。而在我们的微处理器里面,因为控制器是通过软件实现其控制算法的,所以必须对模拟调节器进行离散化处理,这样它只需根据采样时刻的偏差值计算控制量。因此,我们需要使用离散的差分方程代替连续的微分方程。

    假定采样时间很短时(我们的代码中是10ms),可做如下处理:

    用一介差分代替一介微分;

    用累加代替积分。

    根据增量式离散PID公式

    Pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]

    e(k):本次偏差

    e(k-1):上一次的偏差

    e(k-2):上上次的偏差

    Pwm代表增量输出

    在我们的速度控制闭环系统里面只使用PI控制,因此对PID控制器可简化为以下公式:

    Pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)


    具体通过C语言实现的代码如下:

    int Incremental_PI (int Encoder,int Target)

    {

    float Kp=100,Ki=100; //PI参数由电机的种类和负载决定

    static int Bias,Pwm,Last_bias;

    Bias=Encoder-Target; //计算偏差

    Pwm+=Kp*(Bias-Last_bias)+Ki*Bias; //增量式PI控制器

    Last_bias=Bias; //保存上一次偏差

    return Pwm; //增量输出

    }

    入口参数为编码器的速度测量值和速度控制的目标值,返回值为电机控制PWM

    第一行代码为PI参数的定义,PI参数在不同的系统中不一样,我们的代码中的PID参数,仅针对平衡小车之家的电机空载时调试得到。

    第二行是相关内部变量的定义。

    第三行是求出速度偏差,由测量值减去目标值。

    第四行使用增量PI控制器求出电机PWM

    第五行保存上一次偏差,便于下次调用。

    最后一行是返回。

    10ms定时中断里面调用该函数实现我们的控制目标:

    Moto1=Incremental_PI(Encoder,Target_velocity);

    Set_Pwm(Moto1); //===赋值给对应MCUPWM寄存器

    具体请结合完整代码理解,我们的代码基于STM32F103C8控制器,但是把基于C语言的PID控制器部分剥离,并放在control.c里面,故对STM32不熟悉的同学依然可以使用记事本打开这个文件观看。

    2.位置闭环控制
    根据位置式离散PID公式

    Pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]

    e(k):本次偏差

    e(k-1):上一次的偏差

    ∑e(k)e(k)以及之前的偏差的累积和;其中k1,2,,k;

    Pwm代表输出

    在我们的位置控制闭环系统里面只使用PI控制,因此对PID控制器可简化为以下公式:

    Pwm=Kp*e(k)+Ki*∑e(k)


    具体通过C语言实现的代码如下:

    int Position_PI (int Encoder,int Target)

    {

    float Kp=15,Ki=0.01;

    static int Bias,Pwm,Integral_bias;

    Bias=Encoder-Target; //计算偏差

    Integral_bias+=Bias; //求出偏差的积分

    Pwm=Kp*Bias+Ki*Integral_bias; //位置式PI控制器

    return Pwm; //增量输出

    }

    入口参数为编码器的位置测量值和位置控制的目标值,返回值为电机控制PWM

    第一行代码为PI参数的定义,PI参数在不同的系统中不一样,我们的代码中的PID参数,仅针对平衡小车之家的电机空载时调试得到。

    第二行是相关内部变量的定义。

    第三行是求出速度偏差,由测量值减去目标值。

    第四行通过累加求出偏差的积分。

    第五行使用位置式PI控制器求出电机PWM

    最后一行是返回。

    10ms定时中断里面调用该函数实现我们的控制目标:

    Moto1=Position_PI(Encoder,Target_position);

    Set_Pwm(Moto1); //===赋值给PWM寄存器

    具体请结合完整代码理解。

    3.速度位置双环控制
    速度位置双环控制由以上两个控制器进行嵌套,具体原理不再细讲,只对核心代码进行讲解:

    Encoder=Read_Encoder(2);

    Position+=Encoder;

    Moto1=Position_PI(Position,Target_position);

    Moto1=Incremental_PI(Encoder,-Moto1);

    第一行是通过M法测速获得电机速度。

    第二行是通过累加求出速度的积分,也就是电机的位置信息。

    第三行是位置外环控制器,求出控制输出量,作为速度内环的控制目标值。

    第四行是速度内环。

    因为双环控制过程较复杂,故给出其控制原理图如下:




    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-26 02:56 , Processed in 0.107902 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.