当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 >
PID算法的C程序实现方式,大神带你入门
时间:2018-04-24作者:华清远见

一、PID算法简介

在水温控制模型、智能车比赛、四轴飞行器稳定,平衡车速度等控制实现时,因为预设值与实际控制效果之间存在一定的偏差、实际输出与数据反馈之间存在一定的延时,往往不能得到理想的控制效果。PID作为应用为广泛的一种自动控制器,在实际控制中加入PID算法将能达到系统不断灵活变化的效果。

上面的提到的几种实例都可以称为惰性系统(过程控制对象具有“一介滞后+纯滞后”与“二介滞后+纯滞后 ”特点,说白了就是响应延迟+反馈延时),PID控制器是一种最优控制器。

顾名思义,P指是比例(Proportion),I指是积分(Integral),D指微分(Differential)。在电机调速系统中,输入信号为正,要求电机正转时,反馈信号也为正(PID算法时,误差=输入-反馈),同时电机转速越高,反馈信号越大。要想搞懂PID算法的原理,首先必须先明白P,I,D各自的含义及控制规律:

1.1比例P

Proportion(比例),就是输入偏差乘以一个常数。

比例调节器方程为:

y=Kp*e(t)

调节器的输出与输入偏差成正比。比例项部分其实就是对预设值和反馈值差值的放大倍数。

图示

图1 比例放大示意图

控制对象为电机时,比例Kp越大时,电机转速回归到输入值的速度将更快,及调节灵敏度就越高。从而,加Kp值,可以减少从非稳态到稳态的时间。但是同时也可能造成电机转速在预设值附近振荡的情形,即用力过猛,调整跨度太大,如果是舵机转向系统,会出现智能车摇摆S型前进,这就是Kp过大造成的,所以又引入积分I解决此问题。

1.2 积分I

Integral(积分),积分作用是指调节器的输出与输入偏差的积分成比例的作用。

积分方程为:

Ti是积分时间常数,它表示积分速度的大小,Ti越大,积分速度越慢,积分作用越弱。

图示

图2 积分调节示意图

积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,也就是积分项的调节存在明显的滞后,因为Ti代表的是时间常数,Ti值越大,时间越长,滞后效果越明显,增加系统的超调量。积分常数T I 越大,积分的积累作用越弱。增大积分常数T I 会减慢静态误差的消除过程,但可以减少超调量,提高系统的稳定性。所以,必须根据实际控制的具体要求来确定TI 。比如:当差值不是很大时,可以减小控制效果,维持原系统的输出值。但是还是要将偏差进行加法积累。当这个和累加超过预定值时,再一次性进行处理。从而避免了频繁控制而出现振荡现象。

1.3 微分D

Derivative(微分),微分项部分其实就是求电机转速的变化率。也就是前后两次差值的差。

微分调节器的微分方程为

图示

图3 微分控制器曲线

微分反应了偏差信号的变化规律,或者说是变化趋势,偏差的微分实际偏差的变化速率,变化越快,其微分绝对值越大。偏差增大时,其微分为正;偏差减小时,其微分为负。控制器输出量的微分部分与误差的微分成正比,反映了被控量变化的趋势。根据偏差信号的变化趋势来进行超前调节,从而增加了系统的快速性。Td值越大,超前控制作用就会越明显,可以在做到提前控制。比例仅仅是偏差的放大增幅,表示当前调节参数,微分是预测偏差的变化,相当于提前加入了控制数据。在比例微分调节器中,能够提前控制偏差,也有可能出现负值,避免了惰性系统的超调现象。

一、PID算法内容

2.1 PID算法选择

PID算法中有比例积分调节(PI),比例微分调节器(PD),可根据系统要求进行选择,通常为了改善调节品质,往往把比例、积分、微分三种作用组合起来,形成PID调节器。理想的PID微分方程为:

其中u(t) 调节器的输出信号;

e(t) 调节器的偏差信号,它等于给定值与测量值之差

Kp 为比例增益;

T i 积分时间

T d 微分时间

KP /T I 积分系数

KP / T D 微分系数

2.2 PID算法要求

PID需要在一个闭环系统里面(桥黑板)。闭环系统即在控制系统中,有执行处理单元,同时必须有输入反馈单元,电机系统中,必须有编码器、测速电机等测速设备。控制系统原理图如下:

图4 闭环PID控制系统

2.3 PID参数常用小口诀:

整定参数寻最佳,从小到大逐步查;

先调比例后积分,微分作用最后加;

曲线震荡很频繁,比例刻度要放大;

曲线漂浮波动大,比例刻度要拉小;

曲线偏离回复慢,积分时间往小降;

曲线波动周期长,积分时间要加长;

曲线震荡动作繁,微分时间要加长。

一、C代码实现

由于计算机控制是一种采样控制,它只能根据采样许可的偏差计算控制量,而不能象模拟控制那样连续输出控制量,进行连续控制。那么上面的PID公式不能直接使用,必须进行离散化处理

假设采样时间间隔为T,则在k时刻:

偏差为e(k);

积分为e(k)+e(k-1)+e(k-2)+...+e(0);

微分为(e(k)-e(k-1))/T;

从而公式离散化后如下:

k 采样信号,k=0,1,2,…

u k 第k 次采样时刻的计算机输出值

e k 第k 次采样时刻输入的偏差值

e k −1 第k-1 次采样时刻输入的偏差值。

实际上面的公式为位置式PID,运算较多,占用单片机资源,还可以推出增量式PID:

U(k) = P *e(k) + I *[e(k)+e(k-1)+...+e(0)]+ D *[e(k)-e(k-1)]。

简化后可以在C语言中写成:

u(k) = u(k)-u(k-1) = Kp(e(k) - e(k-1)) + Ki *e(k) + Kd(e(k)) - 2e(k-1) + e(k-2))

上面的表达式就是增量式表达形式,u(k)与最后三次计算偏差有关。

C语言理解代码:

//创建变量结构体

struct pid_type{

float Kp; //PI调节的比例常数

float Ti; //PI调节的积分常数

float T; //采样周期

float Ki;

float ek; //偏差e[k]

float ek1; //偏差e[k-1]

float ek2; //偏差e[k-2]

float uk; //u[k]

signed int uk1; //对u[k]四舍五入取整

signed int adjust; //调节器输出调整量

}pid;

//变量初始

void Pid_Init(void)

{

pid.Kp=4;

pid.Ti=0.005;

pid.T=0.001;

pid.Ki=0.6; //微分系数Kd=KpTd/T。根据实际调节

pid.ek=0;

pid.ek1=0;

pid.ek2=0;

pid.uk=0;

pid.uk1=0;

pid.adjust=0;

}

int PIDadjust(float ek) //PI调节算法

{

if( gabs(ek)<0.1 )

{

pid.adjust=0;

}

else

{

pid.uk=pid.Kp*(pid.ek-pid.ek1)+pid.Ki*pid.ek; //计算控制增量

pid.ek1=pid.ek;

pid.uk1=(signed int)pid.uk;

if(pid.uk>0)

{

if(piduk-piduk1>=0.5)

{

pi.uk1=pid.uk1+1;

}

}

if(piduk<0)

{

if(pid.uk1-pid.uk>=0.5)

{

pid.uk1=pid.uk1-1;

}

}

adjust=pid.uk1;

}

return adjust;

}

一、小结

增大比例系数P一般将加快系统的响应,在有静差的情况下有利于减小静差,但是过大的比例系数会使系统有比较大的超调,并产生振荡,使稳定性变坏。

增大积分时间I有利于减小超调,减小振荡,使系统的稳定性增加,但是系统静差消除时间变长。

增大微分时间D有利于加快系统的响应速度,使系统超调量减小,稳定性增加,但系统对扰动的抑制能力减弱。

也可以说比例系数P代表着现在,表明现在预设值与实际的偏差,积分代表着过去,是过去Ti时间内的偏差积累,可以减少震荡,微分D代表着未来,反应了偏差变化率,可以超前预测并提出控制。

这里有关PID资料的讲的非常好,推荐给大家:

1. https://blog.csdn.net/u010312937/article/details/53363831#t3《PID控制算法的C语言实现<完整版>》

2. https://blog.csdn.net/qq229596421/article/details/51419813

3. https://blog.csdn.net/msdnwolaile/article/details/51038196

祝君爽!!


发表评论

全国咨询电话:400-611-6270,双休日及节假日请致电值班手机:15010390966

在线咨询: 曹老师QQ(3337544669), 徐老师QQ(1462495461), 刘老师 QQ(3108687497)

企业培训洽谈专线:010-82600901,院校合作洽谈专线:010-82600350,在线咨询:QQ(248856300)

Copyright 2004-2018 华清远见教育集团 版权所有 ,京ICP备16055225号,京公海网安备11010802025203号