Arduino与PID算法应用

这次萌生出写一篇Arduino和PID算法结合的文章,其实是因为刚忙完实验的事情,而实验进行过程中曾尝试着应用PID算法。虽然最后并没有用上,思考之后,我决定还是把它贴出来。

什么是PID?

PID控制是二阶线性控制,对输入偏差进行比例(P)、积分(I)、微分(D)运算来控制输出,一般用于闭环控制。

比例(P)控制
比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有 比例控制时系统输出存在 稳态误差(Steady-state error)。
积分(I)控制
在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的 或简称有差系统(System with Steady-state Error)。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积 分项也会随着时间的增加而加大,它推动控制器的输出增大使 稳态误差进一步减小,直到接近于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后几乎无稳 态误差。
微分(D)控制
在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。自动控制系统在克服误差的调节过程中可能会出现 振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用, 其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入 “比例”项往往是不够的,比例项的作用仅是放大误差的 幅值,而需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能 够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+ 微分(PD)控制器能改善系统在 调节过程中的动态特性。


详细点的引用某位网友

比例调节作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的不稳定。
积分调节作用:是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行,直至无差,积分调节停止,积分调节输出一常值。积分作用的强弱取决与积分时间常数Ti,Ti越小,积分作用就越强。反之Ti大则积分作用弱,加入积分调节可使系统稳定性下降,动态响应变慢。积分作用常与另两种调节规律结合,组成PI调节器或PID调节器。
微分调节作用,微分作用反映系统偏差信号的变化率,具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强的加微分调节,对系统抗干扰不利。此外,微分反应的是变化率,而当输入没有变化时,微分作用输出为零。微分作用不能单独使用,需要与另外两种调节规律相结合,组成 PD或PID控制器。



PID应用于Arduino

PID可分为位置式PID、增进式PID和步进式PID。具体区别我也不能说出一二,利用Arduino通过L298N实现对pwm控制的是采用位置式PID,主要用PD,可不用I。


位置式PID的公式:



PD控制器应用于Arduino中,主要是将误差送至pwm中来控制电路电流。

公式为:u(k)=Kp*e(k)+Kd*[e(k)-e(k-1)]   其中e(k)为误差(目标与实际之差)


代码例子


double v, error;

  error = readValue1 - Pid1.target;

  v = error - Pid1.preError;

  Pid1.power = (int) Pid1.Kd * v + Pid1.Kp * error;//公式

  Pid1.flag = Pid1.power > 0;//设定方向

  Pid1.power = abs(Pid1.power);

  if(Pid1.power>255) Pid1.power = 255;

  Pid1.preError = error;


    digitalWrite(i1Pin, Pid1.flag);

    digitalWrite(i2Pin, !Pid1.flag);

    analogWrite(power1Pin, Pid1.power);



参考资料:

http://blog.gkong.com/liaochangchu_117560.ashx

http://lql990832.blog.163.com/blog/static/75304655200992434744316/

http://www.cnblogs.com/CYP01/p/3575288.html

你可能感兴趣的:(Arduino与PID算法应用)