a.确定比例增益P
确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0,PID为纯比例调节。输入设定为系统允许的最大值的60%-70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。比例增益P调试完成。
b.确定积分时间常数Ti
比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。
c.确定积分时间常数Td
积分时间常数Td一般不用设定,为0即可。若要设定,与确定 P和Ti的方法相同,取不振荡时的30%。
前言
采用51单片机控制电机运转,本文主要是记录下PID调节过程中Kp、Ki、Kd参数对于波形的影响。本文仅仅是个人在学习过程中的记录,结果可能与实际不符,欢迎指正。
一、只有Kp调节,Ki=0,Kd=0.
确定比例系数Kp确定比例系数Kp时,首先去掉PID的积分项和微分项,可以令Ti=0、Td=0,使之成为纯比例调节。输入设定为系统允许输出最大值的60%~70%,比例系数Kp由0开始逐渐增大,直至系统出现振荡;再反过来,从此时的比例系数Kp逐渐减小,直至系统振荡消失。记录此时的比例系数Kp,设定PID的比例系数Kp为当前值的60%~70%。
unsigned int speed=244;
unsigned int set=100; //设定速度, 166*60%=99.6
void pid(unsigned int count)
{
ek=set-count; //偏差值
Uk=Kp*(ek-ek1);
speed=speed+Uk; //244是中间值 1是-166rpm/min 499是+166rpm/min
}
Kp=0.1; 系统一直无法进入稳态
Kp=0.5;系统一直无法进入稳态
Kp=1; 稳态count为40
Kp=2; 稳态count为57
Kp=2.5; 稳态count约为57
Kp=3; 稳态count约为66
Kp=4; 稳态count约为72
小结:Kp=2时,系统能进入稳态,且震荡较小。可初步定为2.
二、Kp=2,Kd=0,进行Ki调节
比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。
void pid(unsigned int count)
{
ek=set-count; //偏差值
Uk=Kp*(ek-ek1)+Ki*ek;
speed=speed+Uk; //244是中间值 1是-166rpm/min 499是+166rpm/min
}
Ki=Kp*T/Ti = 2/Ti ;
Ki = 0.01 ,Ti=200 ,count值为57
Ki = 0.05 ,Ti=40 ,count值为81
Ki = 0.1 ,Ti=20 ,count值为91
Ki = 0.2 ,Ti=10 ,count值为95
Ki = 0.4 ,Ti=5 ,count值为97
Ki = 0.5 ,Ti=4 ,count值为98
Ki = 0.6 ,Ti=3.33 ,count值为98~99
Ki = 0.7 ,Ti=2.85 ,count值为98~99
Ki = 0.8 ,Ti=2.5 ,count值为84,积分饱和
Ki = 0.9,积分饱和
代码加入抗饱和积分
void pid(unsigned int count)
{
ek=set-count; //偏差值
Uk=Kp*(ek-ek1)+Ki*ek;
speed=speed+Uk; //244是中间值 1是-166rpm/min 499是+166rpm/min
if(speed>495)speed=495; //最大163r/s 抗积分饱和
if(speed<244) speed=244;
}
Ki = 0.8 ,Ti=2.5 ,count值为98~99
Ki = 1,Ti=0.5 ,count值为98~100
小结:Ki的数值大概在0.5~0.7,基本设定值set与count差不多
三、Kp=2,Ki=0.7,进行Kd调节
积分时间常数Td一般不用设定,为0即可。若要设定,与确定 P和Ti的方法相同,取不振荡时的30%。
Ki = 0.7 ,count值为98~99
函数加入Kd项。增量式PID
void pid(unsigned int count)
{
ek=set-count; //偏差值
Uk=Kp*(ek-ek1)+Ki*ek+Kd*(ek-2*ek1+ek2);
speed=speed+Uk; //244是中间值 1是-166rpm/min 499是+166rpm/min
if(speed>495)speed=495; //最大163r/s 抗积分饱和
if(speed<244) speed=244;
}
下图是加了Kd项的波形。按理说Kd=0,波形应该一直。可以发现波形与未加Kd项的不一样,这可能是51单片机处理速度问题,导致加了Kd项处理变慢,导致采集的点变少,所以波形看起来更好一些。
Ki = 0.7,Kd = 0。
Ki = 0.7,Kd = 0.5
Ki = 0.7,Kd = 1
Ki = 0.7,Kd = 1.5
Ki = 0.7,Kd = 2
小结:从波形看,Kd项的影响并不大,仿真的波形也只能得到一个参考的数值,具体还是要以实际调试出来的为准。