终于把PID的原理搞懂了

PID算法学习
比例-积分-微分控制器
一、位式控制
二、PID控制
sv设定值 /pv当前值

三、PID算法分析
必须对传感器的值进行检测(从被控对象中取值-采样)
1.从开机以来传感器所有采样点的一个数据序列
X1、X2、X3、…Xk-2、Xk-1、Xk
2.分析采样点的数据序列,可以挖掘出3个方向上的信息
①Ek=Sv-Xk
1)Ek >0 当前未达标
2)Ek =0 已经达标
3)Ek <0 当前已经超标
***OUT=Kp•Ek(比例)一般在控制中输出PWM信号,通过调节PWM占空比,从而实现控制。
缺点:当Ek=0时,不会进行控制,因此这也是比例控制的缺点,为了克服这种不良影响,可以在比例控制中加入一个小的常量OUT0,即使为0,也会有一定的输出,只不过该输出很小,但是有时候也会出现适得其反的效果。
OUT=Kp•Ek+OUT0(常量,比较小。)

②Ek=Sv-Xk
X1、X2、X3、…Xk-2、Xk-1、Xk
在每一时刻都会产生一个误差,将其记录下来即为一个误差序列:
E1、E2、E3…Ek-2、Ek-1、Ek
这些误差中有正有负,大于零说明未达标,小于零即为已达标。
Sk= E1+E2+E3…Ek+Ek-1+Ek
1)Sk>0 过去这段时间,大多数是未达标的。
2)Sk=0过去这段时间,大多数是已达标的(可能性很小)。
3)Sk<0过去这段时间,大多数是已超达标的。
IOUT=Kp•Sk(由于是将历史阶段相加起来的,所以类似积分控制,所以也称为积分控制。)
这个仅仅代表历史这段时间的问题,而当前这段时间却不知道。

③E1、E2、E3…Ek-2、Ek-1、Ek前一个时刻到现在这个时刻之间的差值,最近两次的偏差相减,
Dk=Ek-Ek-1 得到两次变化的偏差
1)Dk>0 后一时刻的偏差值大于前一时刻的偏差值,如下图1所示。
2)Dk=0
3)Dk<0 后一时刻的偏差值小于前一时刻的偏差值,如下图2所示。

用前一时刻的变化作为下一时刻变化的依据,例如倒数第三次的是3°,倒数第二次是5°,可以看到两次之间的差值为两度,可以预见倒数第一次是7°。
所以微分算法实际上就是用这个Dk的值
DOUT=Kp•Dk,不能单独行动。偏差有了变化趋势才会发生改变。
加入独立行动,就一定会出现误差。
为了不使偏差没有变化率的情况出现,在后面加上一个OUT0,使其在没有误差变化率的时候仍然有输出。
DOUT=Kp•Dk+ OUT0
通过设置Kp从而实现夸大控制,从而有效控制输出。

PID的输出推导:
PID(OUT)=POUT+IOUT+DOUT
=(Kp•Ek+OUT)+(Kp•Sk+OUT)+(Kp•Dk+OUT)
=Kp(Ek+Sk+Dk)+OUT
通过算出来的数字进行PMW控制(脉冲的宽度)。
Sk的处理,T是采样周期。
Sk=1/T1 ∑_(k=0)^n▒〖Ek•T〗 T是计算周期(采样周期),在写程序时要能够调节,不能设置成为固定的。
T_i积分常量-积分时间。
因为比例控制说明当前的状态,假如当前状态是差值比较大,比例环节认为应该加大输出。
对于积分环节而言,是对历史而言的,因此把当前状态和之前状态差值比较大,的时候,通过累加,积分环节仍然是差值较大,所以积分环节也会认为后一阶段应该加大输出。
综合以上可知,比例环节和积分环节会达成一致“意见”,把这段时间称为积分时间常数。
Sk=1/T1 ∑_(k=0)^n▒〖Ek•T〗 时间常数在分母上,所以时间常数越大,输出越小。
时间越大,相当于把之前多个历史误差数据加了进来,而长时间的误差可能没有意义,因此输出较小。
如果选择太小,考察的时间太小,稍微有一点波动就会产生很大的影响,例如:超市里办积分卡,假如,张三,过去一年都没去,而超市只考察某一天的消费使用情况,恰好张三今天买了五千元的东西,超市工作人员就会认为张三消费信用较好,这是不符合实际的,相反李四过去一年消费3万+,而恰恰今天没有消费,则被认为消费信用差,这当然与实际情况也是有较大出入的。
假如从开机时起,设定温度是100°。
第1时刻:70°
第2时刻:80°
第3时刻:90°

第X时刻100°
第X时刻第一次达到100°,这是误差为0,比例项几乎不输出响应,而之前这些时刻累计的误差是正值,在第一次达到100°时,误差累计仍然是正值,因此积分项还会加大输出,从而导致第X时刻超过100°(过冲),于是误差出现负值,一段时间过后,就开始出现误差累计为负,从而减小输出,如此反复下去,直到无限接近100°,在100°上下波动。

积分项在缺点是:会出现过冲,所以在某些状态下,会将Ti设置的较大,另外有时不会将积分环节过早加进去,当其到达70%-80%时才会将积分加入进去。(积分分离)
注意,一断达标(第一次达标后),比例项是不起作用的,但是积分项会参与继续控制。
可以理解为,在未达标之前,积分环节协助输出,但是达标后,才会重点参与进去。

Dk的处理,变换率:
Dk=TdEk-Ek-1)/T Td也是一个可调常数,T一般不能取值太大,否则不能及时反应出剧烈的变换。
PD(当达成一致时,微分就会提醒比例加大)

单片机中的PID表达式
OUT=(K_p∙E_k )+K_p∙(T/Tn∙∑_0^n▒E_k )+(K_p∙(T_D/T)∙(E_k-E_(k-1) ))+OUT

位置式PID & 增量式PID

传感器读回来的值,这个函数使得传感器的温度值和pid结合在一起。

对于计算得到的PID数值,对应一个PWM脉冲宽度,最大值有可能>1000,也有可能<0,因此,对于计算得到的这个数值,不应该作为最终值,而应该定义一个临时变量进行临时存储,进行比较。
进行一个判断
if(out>>pid.pwmcycle)
{
pid.OUT=pid.pwmcycle;
}
if(out<0)
{
pid.OUT=;
}

pid.OUT=out;

你可能感兴趣的:(控制理论)