PID控制电机输出作为电机PWM占空比输入的理解:一种新思路

这两天一直疑惑PID的输出怎么就能作为PWM脉冲控制电机输出呢?问了几个人也没说清楚。
我认为你能让一个初学者说明白也就说明你掌握的挺深刻,如果你说了别人还是没明白那就的得反思自己掌握的怎么样,是在自欺欺人吗?还有就是每个人擅长的领域不一样不要总说这么简单都不明白,那我只能说,我擅长的领域你可能就是个小白。
现在研究了一天终于明白了,分享给和我一样疑惑的初学者,仅代表个人理解。

1、设定PID目标值和参数,目标值为电机速度值。

set_p_i_d(1.5, 0.2, 0.0);
set_pid_target(30.0);

2、PID是一个负反馈闭环系统,这点很重要。

float PID_realize(float actual_val)
{
	/*计算目标值与实际值的误差*/
	DBG_Printf("%s: pid_target:%.2f - PID_actual:%.2f \r\n", __FUNCTION__,pid.target_val, actual_val);
	pid.err = pid.target_val - actual_val;
	
	/*积分项*/
	pid.integral += pid.err;

	DBG_Printf("%s: PID_error:%.2f - PID_sum:%.2f \r\n", __FUNCTION__,pid.err, pid.integral);
	/*PID算法实现*/
	pid.output_val = pid.Kp * pid.err + 
				     pid.Ki * pid.integral + 
				     pid.Kd * (pid.err - pid.err_last);

	/*误差传递*/
	pid.err_last = pid.err;

	/*返回当前实际值*/
	return pid.output_val;
}

3、具体反馈流程

a、首先PID算法第一步 会对目标值和实际值做一个差值计算,计算偏差之刚开始很大逐渐会变小。
b、每次的PID输出会作为电机的输入,编码器会对每次的速度进行读取,刚开始读到的速度很小,它会把这个速度值作为实际值传入PID输入这个时候PID的目标值还会和这个实际值进行比较,直到误差为0,这个过程会一直进行,只是误差为0时积分项的累加值就稳定了,微分项的差值也稳定了,比例项也稳定了。也就是PID的输出就稳定了,而这个值就是PWM的占空比,这个值是三项的和的稳定值,按我的例子来说,这个PWM占空比值稳定在400左右,它是由电机旋转过程中的负反馈值,也就是目标值30对应的占空比,具体来说就是目标值到达30,PID输出三项的累计值,要想达到这个速度就得是这个占空比,它们两是线性关系,和你设置的PID参数有直接关系。

c、重新设定PID目标值和参数,目标值为电机速度值。
set_p_i_d(15.0, 2.0, 0.0);
set_pid_target(30.0);
我把PID参数增大十倍,速度目标值不变,这个时候最终的PID输出的PWM占空比还是会稳定在400.相对于上一组参数,它的积分累加项正好是上一组的十分之一,但是响应速度较上一组提高10倍。

物联沃分享整理
物联沃-IOTWORD物联网 » PID控制电机输出作为电机PWM占空比输入的理解:一种新思路

发表评论