OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11023|回复: 0

分享一个, PID算法——改版的位置式PID,不知符不符合PID的原本功能,如果有错望指导!!!

[复制链接]

28

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2019-3-30
在线时间
86 小时
发表于 2020-2-21 12:32:54 | 显示全部楼层 |阅读模式

我们常见的位置式PID算法是这样的(图一)
int Position_PID(int Feedback_value,int User_Target)
{        
        static float Bias,PWM_Out,Integral_bias,Last_Bias,Differntial_bias;

        Bias=User_Target-Feedback_value;                                     //计算偏差
        Integral_bias+=Bias;                                                       //求出偏差的积分
        Differntial_bias=Bias-Last_Bias;
       
        PWM_Out=
                                        PID. Position_KP                *        Bias
                                        +PID.         Position_KI                *        Integral_bias
                                        +PID.         Position_KD*        Differntial_bias;           //位置式PID控制器公式
        Last_Bias=Bias;                                                     //保存上一次偏差

        return PWM_Out;                                                     //位置式PWM输出
}
,我是拿PID算法做舵机的PWM控制,没有用到微分项,因为微分项系数为零   P=0.85,I=0.09,D=0;   
      在使用过程中发现(看图二)
       为了解决积分项的反应缓慢,我把积分项改成了乘积的形式来进行使用,二不是用平常的累计偏差        Integral_bias=Feedback_value*11.2;                                        //求出偏差的积分
用当前的PWM值乘以一个系数   如520PWM值的稳定时的积分值为5578  拿5578/520=11.2     求出这样一个系数后就把积分的累积改成了分配形式。。。

当Feedback_value=520是  算出来的积分值和一前累积方式的一样520*11.2=5578     ,现在的目标值是520  当前值也是520  ,偏差就为零,,比例项的输出就为零。。二积分项则为  5578*0.09=520   PWM输出为520.。
改进积分项后的波形图(图三)

改进后的算法
int Position_PID(int Feedback_value,int User_Target)
{        
        static float Bias,PWM_Out,Integral_bias,Last_Bias,Differntial_bias;
       
        Bias=User_Target-Feedback_value;                                     //计算偏差
        Integral_bias=Feedback_value*11.2;                         //改进的积分项
        Differntial_bias=Bias-Last_Bias;

        PWM_Out=
                                                 PID. Position_KP                *        Bias
                                                +PID. Position_KI                *        Integral_bias
                                                +PID. Position_KD                *        Differntial_bias;           //位置式PID控制器公式
        Last_Bias=Bias;

        Upper_Computer_Phoenix(Feedback_value*11+520,User_Target*11+520);                                                        /*发送数据到上位机*/
        return PWM_Out;                                                     //位置式PWM输出
       

}

第一次发帖子,可能说得不是很到位。希望能读懂其中的意思


常见位置式PID算法.png
积分项的不足.png
改进积分项后的波形图.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 13:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表