我们常见的位置式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是 算出来的积分值和一前累积方式的一样52011.2=5578 ,现在的目标值是520 当前值也是520 ,偏差就为零,,比例项的输出就为零。。二积分项则为 55780.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输出
}
第一次发帖子,可能说得不是很到位。希望能读懂其中的意思
窦元淇 发布了1 篇原创文章 · 获赞 0 · 访问量 28 私信 关注