赞
踩
PID算法是控制行业最经典、最简单、而又最能体现反馈控制思想的算法。对于一般的研发人员来说,设计和实现PID算法是完成自动控制系统的基本要求。
PID,就是对输入偏差进行比例积分微分运算,运算的叠加结果去控制执行机构。其中调节器就是人的大脑,就是一个调节系统的核心。任何一个控制系统,只要具备了带有 PID的大脑或者说是控制方法,那它就是自动调节系统基本的调节器具有两个输入量:被调量和设定值:被调量就是反映被调节对象的实际波动的量值(变化),设定值就是人们设定的值,也就是人们期望被调量需要达到的值(固定)只要记住这三个量:设定值、被调量、输出指令。事实上,为了描述方便,习惯上更精简为两个量:输入偏差和输出指令。输入偏差是被调量和设定值之间的差值
P 就是比例,就是输入偏差乘以一个系数(提高响应速度);
I 就是积分,就是对输入偏差进行积分运算(减少误差);
D 就是微分,对输入偏差进行微分运算(抑制震荡)。
PID 算法的一般形式如下图所示:
控制器本身就是比例、积分、微分三个环节的加和。这里我们规定(在t时刻):
①输入量为 r(t); ②输出量为 c(t); ③偏差量为 e(t)=rin(t)-rout(t);
在我们的微处理器里面,因为控制器是通过软件实现其控制算法的,所以必 须对模拟调节器进行离散化处理,这样它只需根据采样时刻的偏差值计算控制 量。因此,我们需要使用离散的差分方程代替连续的微分方程。模拟PID控制原理:如图所示是一个小功率直流电机的调速原理图。给定速度n0(t)与实际转n(t)速进行比较 ,其差值e(t) ,经过 PID 控制器调整后输出电压控制信号 , 经过功率放大后,驱动直流电动机改变其转速。
常规的模拟 PID 控制系统原理框图如下图所示:
该系统由模拟 PID 控制器和被控对象组成。图中,r(t) 是给定值,y(t) 是系统的实际输出值,给定值与实际输出值构成控制偏差 e(t):
e(t) = r(t) - y(t)
e(t) 作为 PID 控制的输入, 作为 PID 控制器的输出和被控对象的输入。 所以模拟 PID 控制器的控制规律为
由于计算机控制是一种采样控制, 它只能根据采样时刻的偏差计算控制量,而不能像模拟控制那样连续输出控制量量, 进行连续控制。 由于这一特点式中的积分项和微分项不能直接使用,必须进行离散化处理。离散化处理的方法为:以T作为采样周期,作为采样序号,则离散采样时间对应着连续时间 ,用矩形法数值积分近似代替积分,用一阶后向差分近似代替微分,最后可以得到离散的 PID 表达式为:
全量式或位置式 PID 控制算法
算法的缺点是: 由于全量输出, 所以每次输出均与过去状态有关, 计算时要对 ek 进行累加,工作量大; 并且,因为计算机输出的 对应的是执行机构的实际位置, 如果计算机出现故障,输出的 将大幅度变化,会引起执行机构的大幅度变化,有可能因此造成严重的生产事故在实生产际中是不允许的。增量式 PID 控制算法可以避免着重现象发生。
- //①定义PID变量结构体
- struct _pid{
- float SetSpeed; //定义设定值
- float ActualSpeed; //定义实际值
- float err; //定义偏差值
- float err_last; //定义上一个偏差值
- float Kp,Ki,Kd; //定义比例、积分、微分系数
- float voltage; //定义电压值(控制执行器的变量)
- float integral; //定义积分值
- }pid;
- //②初始化变量
- //统一初始化变量,尤其是 Kp,Ki,Kd 三个参数,调试过程当中,对于要求的控制效果,可以通过调节这三个量直接进行调节。
- void PID_init(){
- printf("PID_init begin \n");
- pid.SetSpeed=0.0;
- pid.ActualSpeed=0.0;
- pid.err=0.0;
- pid.err_last=0.0;
- pid.voltage=0.0;
- pid.integral=0.0;
- pid.Kp=0.2;
- pid.Ki=0.015;
- pid.Kd=0.2;
- printf("PID_init end \n");
- }
- //③编写控制算法
- //注意:这里用了最基本的算法实现形式,没有考虑死区问题,没有设定上下限,只是对公式的一种直接的实现
- float PID_realize(float speed)
- {
- pid.SetSpeed=speed;
- pid.err=pid.SetSpeed-pid.ActualSpeed;
-
- pid.integral+=pid.err;
- pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
- pid.err_last=pid.err;
- pid.ActualSpeed=pid.voltage*1.0;
-
- return pid.ActualSpeed;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
增量式PID是指数字控制器的输出只是控制量的增量∆uk。当执行机构需要的控制量是增量,而不是位置量的绝对数值时,可以使用增量式PID控制算法进行控制。 增量式PID控制算法可以通过位置式离散PID 表达式推导出,可以得到控制器的第 k-1个采样时刻的输出值为:
增量式PID控制算法与位置式PID算法相比,计算量小的多,因此在实际中得到广泛的应用
- struct _pid
- {
- float SetSpeed; //定义设定值
- float ActualSpeed; //定义实际值
- float err; //定义偏差值
- float err_next; //定义上一个偏差值
- float err_last; //定义最上前的偏差值
- float Kp,Ki,Kd; //定义比例、积分、微分系数
- }pid;
-
- void PID_init()
- {
- pid.SetSpeed=0.0;
- pid.ActualSpeed=0.0;
- pid.err=0.0;
- pid.err_last=0.0;
- pid.err_next=0.0;
- pid.Kp=0.2;//比例常数
- pid.Ki=0.015;//积分时间常数
- pid.Kd=0.2;//微分时间常数
- }
-
- float PID_realize(float speed)
- {
- pid.SetSpeed=speed;
- pid.err=pid.SetSpeed-pid.ActualSpeed;
- float incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);
- pid.ActualSpeed+=incrementSpeed;
- pid.err_last=pid.err_next;
- pid.err_next=pid.err;
-
- return pid.ActualSpeed;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
所谓P,就是比例作用,是把调节器的输入偏差乘以一个系数,作为调节器的输出。而调节器的输入偏差就是被调量减去设定值的差值。当设定值不变的时候,调节器的输出只与被调量的波动有关。概念性公式如下:
输出波动=被调量波动*比例增益 (注:当设定值不变)
通过概念性公式,我们可以得到如下结论,对于一个单回路调节系统,单纯的比例作用 下:输出的波形与被调量的波形完全相似。
一句话简述:被调量变化多少,输出乘以比例系数的积就变化多少。或者说:被调量与输出的波形完全相似
几个输出曲线和被调量曲线的推论:
只要被调量变化,输出就变化;被调量不变化,不管静态偏差有多大,输出也不 会变化。
I 就是积分作用就是如果调节器的输如偏差不等于零,就让调节器的输出按照一定的速度一直朝一个方向累加下去。 积分相当于一个斜率发生器。启动这个发生器的前提是调节器的输如偏差不等于零,斜 率的大小与两个参数有关:输入偏差的大小、积分时间。
纯积分作用可以存在,但是很可能没有实用意义,那么单纯积分作用的特性总结如下:
D 就是微分作用。单纯的微分作用是不存在的,一句话就就是被调量不动,输出不动;被调量一动,输出马上跳
根据微分作用的特点,咱们可以得出如下曲线的推论:
总结:
整定参数的方法有理论计算法和经验试凑法两种理论计算法需要大 量的计算,对于初学者和数学底子薄弱的人会望而却步,并且计算效果还需要进一步的修改 整定,所以,在实际应用过程中,理论计算法比较少。经验试凑法最广为人知的就是第一章提到的整定口诀了,该方法提供了一个大致整 定的方向形性思路我们可以依靠分析比例、积分、微分的基本性质,判读趋势图中,比例、积分、微分的 基本曲线特征,从而对 PID 参数进行整定。这个方法虽然基本等同于经验试凑法,但是它又 比传统的经验试凑法更快速更直观的,更容易整定。因而,我把这种依靠对趋势图的判读, 整定参数的办法,称之为:趋势读定法。
趋势读定法三要素:设定值、被调量、输出。三个曲线缺一不可。
关于 P、I、D 三个参数的主要作 用,可以大致又不完全地概况为:P 用于提高响应速度、I 用于减小静差、D用于抑制震荡。
首先我们需要明确我们的控制目标,也就是满足控制系统的 3 个要求:
①稳定性
②快速性
③准确性
具体的评估指标有最大超调量、上升时间、静差等。
最大超调量是响应曲线的最大峰值与稳态值的差,是评估系统稳定性的一个重要指标;
上升时间是指响应曲线从原始工作状态出发,第一次到达输出稳态值所需的时间,是评估系统快速性的一个重要指标;
静差是被控量的稳定值与给定值之差,一般用于衡量系统的准确性,如下图所示:
首先设I和D值为零,然后把P值从0逐渐增大,直到系统震荡。
这个时候因为P值比较大,出现了震荡。可能大家会疑惑,为什么I值为零, 但是没有静差呢?因为这个时候的 P 值已经很大了,静差一般是在P值较小而 I值为零的时候出现的。为了验证我们的想法,我们对PID参数进行调整。
如我们所设想的,在P值较小的时候出现了静差,响应速度也明显降低。所以增大P值可以一定程度上消除静差,提高响应速度,但是会导致系统震荡,而加入微分控制可以有效抑制震荡。下面我们尝试一组新的 PID 参数:
加入微分控制之后,很明显系统的震荡得到了抑制,震荡次数减少。事物都有两面性,微分控制也是弊端的。可以看到,系统的响应明显变慢了,因为引入微分控制相当于增大了系统的阻尼。这个时候我们需要结合P值和I值进行进一步的优化。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。