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

我们常见的位置式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 · 访问量 26

猜你喜欢

转载自blog.csdn.net/weixin_42718050/article/details/104425865