当前位置: 首页 > 科技观察

用Excel教你PID算法_0

时间:2023-03-20 22:06:21 科技观察

1。引入PID电机控制,做到没有反馈,也就是说我们完全相信输入的数字,是一个理想化的模型,比如占空比为50%的25KzPWM,轮速为1m/s,实际产品会受到各种影响,如接地电阻,风阻等,同样输入占空比为50%的25KzPWM,轮速不是1m/秒。这时候我们引入测量单元,也就是反馈系统。这时最常见的反馈是:直接使用反馈值。简单的例子,属于值X和输出值y的数学公式是:y=2x,这是最常见的关系。假设我们输入7,测量结果为5,那么我们直接修改输入为7+2*(7-5)=11。也就是我们可以直接一次性调整到位。这个调整太简单粗暴了,因为我们直接修改输入为11,输出可能直接变成6,超出了预期值。这时候自然想到多次调整,每次只增加一点点,然后测一下速度,看是否达标。这就是比例调节Kp。2、以比例调整为例,小车当前速度为0.2,目标速度为1,输出y和输入x的关系为y=1*x。比例系数Kp=0.5。随着时间的增加,输出和输入之间的关系如下。直观的折线图如下:我们发现这太完美了,那么比例环节可以完美解决问题,但是等等,在得出这个结论之前,我们忽略了一个特殊的因素:噪声误差。许多系统中都有噪音。例如在汽车中,噪声误差可能来自于电机的误差、风阻等外界因素,而且是波动的。我们把问题简化一下,假设外界因素不变,外界因素就是小车实际输出速度减1。还是上面的例子,小车当前速度为0.2,目标速度为1。输出y和输入x之间的关系是y=1*x。比例系数Kp=0.5,常数误差为-0.1,随着时间的增加,输出与输入的关系如下。直观的折线图如下所示:最终输出稳定在0.8,因为我们的初始值为0.2,最终与目标差0.2,补偿为0.1,误差恰好为-0.1,也就是说我们没有补偿。如果我们需要速度达到1怎么办???方法是增大比例系数Kp。误差0.8的时候,误差1.9的时候,误差2的时候,已经完全震荡了。结论:比例控制引入了无法消除的稳态误差。增大比例常数可以减小稳态误差,但过大会引起系统振荡,变得不稳定。3、积分调整为了消除稳态误差,第二次加入积分,采用PI(比例积分控制)。积分控制就是把所有的历史误差加起来乘以积分常数。公式如下:u(t)--------------输出曲线,pid输出值随时间变化曲线Kp--------------比例系数e(t)--------------偏差曲线,设定值与实际值随时间t的偏差曲线------------------时间是关于固定点的,如果你学了高等数学还没有睡觉。在计算机系统中使用数学公式之前,必须将它们离散化。①表示时间t的输出值②表示时间t的输出误差③表示从时间0到t的累计误差。加入Ki参数后的折线图如下:只要有偏差,积分就会继续累加,直到误差为0,积分项就不再累加,变成常数,可以抵消稳态误差。4、微分调节中引入积分可以消除稳态误差,但会增加超调量,随着Ki的增大,超调量也会增加。为了消除超调,我们引入微分作用的积分,即e(t)曲线的斜率。将公式离散化,使ek为当前误差,ek-1为上次误差,故①为误差曲线的斜率。PID公式还有其他的写法,本质和u(t)离散化后一样------------输出曲线,pid输出值随时间变化曲线Kp---------------比例系数e(t)------------偏差曲线,设定值与实际值随时间Ti的偏差曲线-----------------积分时间Td------------微分时间T----------------PID调节周期的参数如下在前面的例子中加上微分项,Ki=0.3。折线图总结如下:分化可以削弱超调趋势。5.总结PID调节示意图如下:可以发现,比例项是修正偏差的主要力量。积分项与过去状态有关,面积绝对值越大,其绝对值越大,其作用是消除累积偏差。微分项与斜率有关,很难解释。一般来说,它的作用是:当目标接近设定值时,会加速,当目标远离设定值时,会阻止移动。差异化因此可以增加系统稳定性,因为到达目的地后,离开将受到阻碍。6、增量式PID上面我们讲解的是位置PID,还有一种增量式PID,输出的不是目标值,而是与前一个值的差值。直觉上它将是u(t)-u(t-1)。那么u(t)-u(t-1)的公式就是位置型PID控制器的基本特性:使用偏差,容易产生累积偏差。位置型PID适用于执行器中无整体元件的对象。位置类型的输出直接对应对象的输出,对系统的影响比较大。增量式PID控制器的基本特点:增量式PID算法不需要累加,控制量增量的确定只与前几次的偏差值有关,计算偏差的影响很小。增量式PID算法获得的是控制量的增量,对系统的影响相对较小。采用增量式PID算法,易于实现手动到自动的无扰动切换。7.代码编程位置PID/**************************************************************************位置pid****************************************************************************/doublePID(doubleActual,doubleSET){staticdoubleE_sum,Error_last;//上一次误差doublekp=20.767,ki=1.867,kd=115.55;doublepid_out;doubleError_now;//当前误差Error_now=SET-Actual;//当前误差//if(Error_now>-0.9&&Error_now<0.9)//防静电错误//{//Error_now=0;//Error_last=0;//E_sum+=Error_now;//误差累加//if(E_sum>484)E_sum=484;//积分限制范围,防止积分饱和//if(E_sum<-484)E_sum=-484;pid_out=kp*Error_now+ki*E_sum+kd*(Error_now-Error_last);//pid计算公式Error_last=error_now;//if(pid>900)pid=900;//输出限制//if(pid<-900)pid=-900;return-pid_out;}增量PIDerror=target_speed-current_speed;P_error=error;I_error=error-left_motor.L_error;D_error=error-2*left_motor.L_error+left_motor.LL_error;add=(s16)(KP*P_error+KI*I_error+KD*D_error);left_motor.ESC_output_PWM+=add;left_motor.LL_error=left_motor.L_error;left_motor.L_error=error;本文转载自微信公众号《知乎编程》,可以通过以下二维码关注和转载本文,请联系知编程公众号。