系统振荡消失,记录此时的比例增益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%。
d.系统空载、带载联调,再对PID参数进行微调,直至满足要求
3 PID与智能车控制的联系
小车调速及转向通过输出PWM波得占空比来控制。肯定不是线性的,外界因素那么多,没人能证明是线性的。如果是线性的,直接用P就可以了。比如在PWM=60%时,速度是2M/S,那么你要它3M/S,就把PWM提高到90%。因为90/60=3/2,这样一来太完美了。完美是不可能的。那么不是线性的,要怎么怎么控制PWM使速度达到即定的速度呢?即要快,又要准,又要狠。(即快准狠)系统这个速度的调整过程就必须通过某个算法调整,一般PID就是这个所用的算法。可能你会想到,如果通过编码器测得现在的速度是2.0m/s,要达到2.3m/s的速度,那么把PWM增大一点不就行了吗?是的,增大PWM多少呢?必须要通过算法,因为PWM和速度是个什么关系,对于整个系统来说,谁也不知道。要一点一点的试,加个1%,不够,再加1%还是不够,那么第三次你还会加1%吗?很有可能就加2%了。通过PID三个参数得到一个表达式:△PWM=a *△V1+b *△V2+c *△V3,a b c是通过PID的那个长长的公式展开,然后约简后的数字,△V1 ,△V2 ,△V3 此前第一次调整后的速度差 ,第二次调整后的速度差,第三次依次类推。一句话,PID要使当前速度达到目标速度最快,需要建立如何调整PWM和速度之间的关系。输入就是前次速度,前前次速度,前前前次速度。输出就是PWM应该增加或减小多少。就从控制效果来说,加入了PID控制后,小车的速度能够上一个台阶,因为空度的实时性与精度提高了。
4 PID小车控制例程
//定义PID结构体
//***************************************************** typedef struct PID {
int SetPoint; //设定目标 Desired Value
double Proportion; //比例常数 Proportional Const double Integral; //积分常数 Integral Const double Derivative; //微分常数 Derivative Const int LastError; //Error[-1] int PrevError; //Error[-2] } PID;
//***************************************************** //定义相关宏
//***************************************************** #define P_DATA 100 #define I_DATA0.6 #define D_DATA1
#define HAVE_NEW_VELOCITY 0X01
//***************************************************** //声明PID实体
//***************************************************** static PID sPID;
static PID *sptr = &sPID;
//***************************************************** //PID参数初始化
//***************************************************** void IncPIDInit(void) {
sptr->LastError = 0; //Error[-1] sptr->PrevError = 0; //Error[-2]
sptr->Proportion = P_DATA; //比例常数 Proportional Const sptr->Integral = I_DATA; //积分常数Integral Const
sptr->Derivative = D_DATA; //微分常数 Derivative Const sptr->SetPoint =100; 目标是100 }
//***************************************************** //增量式PID控制设计
//***************************************************** int IncPIDCalc(int NextPoint) {
int iError, iIncpid; //当前误差
iError = sptr->SetPoint - NextPoint; //增量计算 iIncpid = sptr->Proportion * iError //E[k]项
- sptr->Integral * sptr->LastError //E[k-1]项 + sptr->Derivative * sptr->PrevError; //E[k-2]项 sptr->PrevError = sptr->LastError;
sptr->LastError = iError; //存储误差,用于下次计算
return(iIncpid);//返回增量值 }
Int g_CurrentVelocity; Int g_Flag; void main(void) {
DisableInterrupt InitMCu();
IncPIDInit();
g_CurrentVelocity=0;//全局变量也初始化 g_Flag=0;//全局变量也初始化 EnableInterrupt; While(1) {
if (g_Flag& HAVE_NEW_VELOCITY) {
PWMOUT+= IncPIDCalc(CurrentVelocity); g_Flag&=~ HAVE_NEW_VELOCITY; } } }
//**************************************** //采样周期T
//**************************************** Interrrupt TIME void {
CurrentVelocity =GetCurrentVelocity; g_Flag|= HAVE_NEW_VELOCITY; }
5结论
没有一种控制算法比PID调节规律更有效、更方便的了。现在一些时髦点的调节器基本源自PID。甚至可以这样说:PID调节器是其它控制调节算法的妈。因为PID解决了自动控制理论所要解决的最基本问题,既系统的稳定性、快速性和准确性。调节PID的参数,可实现在系统稳定的前提下,兼顾系统的带载能力和抗扰能力,同时,在PID调节器中引入积分项,系统增加了一个零积点,使之成为一阶或一阶以上的系统,这样系统阶跃响应的稳态误差就为零。由于自动控制系统被控对象的千差万别,PID的参数也必须随之变化,以满足系统的性能要求。它具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;而且在理论上可以证明,对于过程控制的典型对象──“一阶滞后+纯滞后”与“二阶滞后+纯滞后”的控制对象,其调节规律是连续系统动态品质校正的一种有效方,是一种最优控制。
参考文献
1. FreescaleCompany.MC9S12XS Family Reference Manual, Rev. 1.09,2009.9 2. 卓晴,黄开胜,邵贝贝.学做智能车.北京-北京航空航天大学出版社.2007 3. 仇慎谦.PID调节规律和过程控制南京-江苏科学技术出版社
4.尹怡欣,陶永华.新型PID控制及其应用.北京-机械工业出版社.1998
2017年7月4日