1. 营销策划师首页

pid控制 pid控制 大早上花五分钟更新几句理论分析——二位式控制

pid控制 pid控制
大早上花五分钟更新几句理论分析——二位式控制比例控制是一个始终有误差的控制算法,你没有误差我就不控制了。即我们得到了简单的PID数学模型:我们已经得到了PID控制器的数学模型,现在开始要将PID控制器从数学模型转换到实际算法。我们上面也已经得到了处理后的Sk与Dk,下面再一次整理PID数学模型(即数学公式):后面还有积分分离,以及位置PID控制器、增量PID控制器的数学模型的建立和分析等等。

【目录】(由目录看更新进度)1.二位式控制器2.PID控制器-2.1.理论分析--1)比例项--2)积分项--3)微分项--4)比例积分微分控制--5)数学模型中SkDk的确定--6PID数学模型-2.2 位置PID控制器代码

1、二位式控制器

Sv:用户设定值(给定信号)

Pv:控制对象当前状态值(反馈信号)

E:偏差值(偏差信号)

二位式控制:

当Sv>Pv:系统满功率运行。

当Sv

举个例子,比如我们要想让烙铁温度固定在100摄氏度。于是我们在烙铁上绑上一个热电偶作为传感元件,实时反馈烙铁温度值。

插上电烙铁,当温度值并没有达到100度时,烙铁是满功率运行,当温度一旦达到100摄氏度,烙铁立刻断电,即零功率运行。

这就是二位式控制,也就是只有“开”和“关”两种状态。要么全部摞上去,要么一点也不给它。

那么二位式控制的缺点也就很明显了,对于滞后性的系统,或者惯性元件,控制精度会非常的差。特别是温度这种大滞后系统,效果可想而知。

举个例子,还是烙铁。当温度不满足要求的时候,系统处于满功率运行状态,当温度一旦达到要求,则系统马上断电不再通电压。而此时若你再细心一点,就会发现:即使温度达到了,电源已经断开了,但是烙铁的温度还在继续上升,在上升一段时间后,才会转为下降。与此同时,当温度降下来低于要求温度时,电压立刻再次满功率加载上去,但是温度值却依旧下降,下降一段时间后,才慢慢回升。再例如电机,假如你有一块带500线编码器的直流电机,你希望电机转五圈,也就是2500个脉冲后停止,当你使用二位式控制,你就会发现:虽然电机在转完2500个脉冲的瞬间就已经断电,但是电机依旧会再转上半圈甚至几圈才慢慢减速直至停止。

这是为什么?温度为什么不听话还要继续上升、下降?电机为什么还要多转那么一些?两开花吗?

因为它们是滞后性系统,或者惯性系统。 

二位式控制搞不了它们,甚至后来又出现了三位式、五位式控制,效果的确更不错了一些,但精度还是差强人意。

精度始终提不上去。

直到出现了PID控制。

2、PID控制器

2.1:理论分析

理论分析——预备知识

%ignore_pre_4%

深夜了码字都飘了,找时间继续更新。。。。。

大早上花五分钟自习室更新几句

理论分析——开始分析

假定从早上开机上电,我们每隔一秒钟就通过传感器取一个反馈信号。X(1)X(2)X(3)X(4)……………X(k-2)X(k)   //从开机以来,传感器的所有采样点的数据序列。X(1)为开机第一秒的反馈值,X(k)为当前时刻的反馈值分析采样点的数据序列,我们可以挖掘出三方面的信息,即PID.

首先分别单独分析P、I、D三项。(1)P控制(比例控制)

Ek=Sv-X(k)   //用户设定值减去第k时刻(也就是当前时刻)的反馈值,得出一个偏差值。反映了当前时刻用户设定值与反馈值的偏差程度。[分析]Ek>0:代表当前控制未达标(当前时刻反馈值小于用户期望值,而“当前时刻反馈值”代表的就是当前时刻执行元件(即负载)的状态,故所以当前控制未达标)Ek=0:代表控制刚好达标Ek<0:代表当前控制已超标比例控制器是根据Ek值线性输出控制信号,对负载做出控制。那么具体做法就是:

刘金琨 先进pid控制_pid算法控制_pid控制

Pout=Kp*Ek //[输出信号大小] 正比于 [当前偏差值] Kp:放大系数,可以认为是一个放大器或者衰减器。 Kp作用:顾名思义就是用于整个比例控制器的增益。 通俗来说就是将反馈回来的偏差值Ek进行有意的放大或者缩小,然后作为输出量输出。

比例控制缺点:由公式我们可以看出,无论Ek>0还是Ek<0,Pout都会有输出,而当Ek=0时,Pout=0无输出信号,不输出信号即负载处于失控状态,那么此时无论环境或者其他因素都有可能作为扰动信号使得此时的系统产生波动。也就是说:比例控制遵循的是,你有了偏差我才会控制,你没有偏差我就不起作用了,一旦达到目标我就不管了,生死与我再不相干。所以比例控制在控制系统的控制过程中总是有误差,故比例控制又称为"有差控制"。

总结:

比例控制的输出信号大小正比于当前偏差值。

比例控制遵循的是有了偏差我才会控制,你没有偏差我就不起作用了。

比例控制是一个始终有误差的控制算法,你没有误差我就不控制了。

其实这里有一个可以避免偏差为0时系统零输出的方法,具体做法就是:Pout=Kp*Ek+OUT0    //即加一个维持输出OUT0,那么即使Ek=0时也会有Pout=OUT0,Pout也就不会再有零输出情况发生。这个方法在你使用 单比例控制 时可以使用且效果不错。

这里插播一条知识点:PWM(Pulse Width Modulation 脉冲宽度调制)

首先为什么介绍PWM呢?因为PWM才是PID发挥的关键所在点,若没有PWM技术作为基础,PID控制器就无法实现输出大小的无级调节,无级调节在这里可以理解为是PID输出多少就加载到负载上多少。

T为周期,Ton为导通时间,Toff为关断时间。Ton+Toff=T;比如T=1000,且输出信号以1ms为步进单位的话,那么我输出的脉宽就有1000种可能性:1/1000~1000/1000。也就是负载在1/1000~1000/1000的功率下运行,具体是多少功率就要看控制器的输出大小与周期值大小,即占空比大小了。输出值越大,脉宽就越宽,负载在一个周期内导通的时间就越长。即:我通过改变负载在一个控制周期内工作与停止的时间比例,来达到调整输出电压的目的,也可以理解为调整输出到负载的功率。如果没看懂的话那就来点实际的:在以1ms为基准单位,周期值为T=1000时,若Ton=300,就代表执行元件导通300ms,那么Toff=700就代表断开700ms,则此时我的输出就是(300/1000)*U    //输出电压Uout=(Ton/T)*U映射到比例控制中那就是:(Pout=Kp*Ek),Ek越大,则Pout越大,脉宽越宽,输出电压越高。

如果还是不是特别清楚的话,可以百度下PWM,如下:(百度百科解释的是更棒和更合理的,但是对于不太了解PWM的同学来讲,看起来还是比较头疼的。。)

脉宽调制(PWM)基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。例如,把正弦半波波形分成N等份,就可把正弦半波看成由N个彼此相连的脉冲所组成的波形。这些脉冲宽度相等,都等于 ∏/n ,但幅值不等,且脉冲顶部不是水平直线,而是曲线,各脉冲的幅值按正弦规律变化。如果把上述脉冲序列用同样数量的等幅而不等宽的矩形脉冲序列代替,使矩形脉冲的中点和相应正弦等分的中点重合,且使矩形脉冲和相应正弦部分面积(即冲量)相等,就得到一组脉冲序列,这就是PWM波形。可以看出,各脉冲宽度是按正弦规律变化的。根据冲量相等效果相同的原理,PWM波形和正弦半波是等效的。对于正弦的负半周,也可以用同样的方法得到PWM波形。

(2)I控制(积分控制)

{X(1)X(2)X(3)X(4)……………X(k-2)X(k)}    //从开机以来,传感器的所有采样点的数据序列。X(1)为开机第一秒的反馈值,X(k)为当前时刻的反馈值我们将开机以来每个反馈值都依次与用户期望值Sv相减,即可得出对应的偏差序列:{E(1)E(2)E(3)E(4)…………E(k-2)E(k-1)E(k)}    //历史所有采样点的偏差序列。将这些历史偏差求代数和:Sk=E(1)+E(2)+E(3)+E(4)…………E(k-2)+E(k-1)+E(k)   //反映的是历史上偏差值的整体情况。[分析]Sk>0:在过去时间,大多数是未达标的,即整体是未达标的。Sk=0:在过去时间,控制效果整体是比较合理的。Sk<0:在过去时间,大多数是超标的。积分控制器公式为:Iout=Kp*Sk   //[输出信号大小] 正比于 [过去总体偏差值]Iout:比例控制器的输出。Kp:增益系数。Sk:历史偏差之和即历史上的整体偏差情况如果都是不达标的,那么我积分控制器就会有一个正的输出量使得你输出继续增强;若你历史上整体偏差情况是超标的,那么我就输出一个负的输出量使你降低输出,甚至输出负值,即如果是温度控制系统,那么输出负值就相当于开启冷风。这时可能有同学会说,所有历史偏差加起来,岂不是一个非常大非常大的数?那还得了?假设:我们模拟一下烙铁从上电开始的状态,Sv=100度。时刻|   x1    x2    x3    x4     x5温度|   25  28  98  103  101偏差|   75  72  2   -3   -1Ek |   E1    E2    E3    E4     E5由表得:所有的历史偏差有正有负,正数说明控制没有达标,负数说明已经超标。所以这些正正负负的历史偏差全部加起来,会慢慢正负抵消,直至抵消至0

积分控制缺点:1.历史上的一些问题,它老是会加入到现在时刻的控制过程中来,相当于一个扰动干扰当前的控制效果。2.当历史状态极好时(Sk=0),积分控制器就会零输出(Iout=0),系统失控。3.历史上是好的,并不代表系统现在时刻的状态就是好的,而若真正等到历史上出问题再来产生控制输出,可能就已经来不及了。所以积分控制的遵循的是:你现在是不是好的我都不管,我只看你以前整体怎么样。就相当于一个人在小时候喜欢偷偷的拿一些别的同学的东西,而长大后改掉了这种坏毛病,但是系统会认为你这个人是不行的,我不管你有没有改过自新,你以前不对,那你现在就是不对的。积分控制还有一个作用就是:通过历史上这些数据,预测出控制对象有可能会发生的变化,提前做出控制,将问题控制在没有发生之前。

积分控制器同样可通过加维持输出OUT0,以消除零输出系统失控的现象。

Iout=Kp*Sk+OUT0

(3)D控制(微分控制)

{X(1)X(2)X(3)X(4)……………X(k-2)X(k)}    //从开机以来,传感器的所有采样点的数据序列。X(1)为开机第一秒的反馈值,X(k)为当前时刻的反馈值我们将开机以来每个反馈值都依次与用户期望值Sv相减,即可得出对应的偏差序列:{E(1)E(2)E(3)E(4)…………E(k-2)E(k-1)E(k)}    //历史所有采样点的偏差序列。那么此时从[前一时刻的偏差E(k-1)]  [当前这一时刻的偏差E(k)] 的差值,即偏差之差为:Dk = E(k) - E(k-1);  //差值的差,所以这是反映的是两个时刻的偏差的变化趋势。[分析]Dk>0:这个时刻的偏差比上一时刻的偏差还要大,所以偏差为增大趋势,系统状态越来越偏离目标。     此时可以试想一下,上次偏差小,本次偏差大,若此时建立时间t为x轴、偏差E为y轴的坐标系,便能发现两次偏差的斜率为正(“”左低右高)。且Dk越大越陡Dk=0:两个时刻的偏差相对没有改变,两次偏差值相等。系统无变化。     斜率为0(“—”左右平)Dk<0:这个时刻的偏差比上一时刻的偏差小,所以偏差为减小趋势,系统状态越来越接近目标。     斜率为负(“/”左高右低)。且Dk越小越陡微分控制器公式为:Dout = Kp * Dk

微分控制器同样可通过加维持输出OUT0,以消除零输出系统失控的现象。

Dout=Kp*Dk+OUT0

(4)PID控制(比例积分微分控制)

PIDout = Pout+Iout+Dout;//将P、I、D三种算法加起来,它们就会相互之间优缺点弥补。PIDout =(Kp * Ek+OUT0)+(Kp * Sk+OUT0)+(Kp * Dk+OUT0);PIDout = Kp * (Ek + Sk + Dk)+OUT0;//得出PID算法的简单数学模型

即我们得到了简单的PID数学模型:

PIDout = Kp * (Ek + Sk + Dk)+OUT0;

因为“Ek、Sk、Dk”是可以测算的,而“Kp、OUT0”可由人为确定。

故以此时已有的条件,已经可以得到最终的PID输出,即“PIDout”。

(5)数学模型中Sk、Dk的确定

我们已经得到了PID控制器的数学模型,现在开始要将PID控制器从数学模型转换到实际算法。即进行一些参数(Sk与Dk)的处理。

(1)Sk的处理

Sk = frac{ 1 }{ Ti }cdot TcdotSigma Ek

Ti:积分时间常数//数学上指积分项运行的时间,物理上指考察历史数据的范围大小。T:控制周期(或称采样周期、计算周期)//即我多长时间算一次PID,多长时间更新一次PID,间隔时间。

pid控制_pid算法控制_刘金琨 先进pid控制

NOTETi越大(1/Ti)越小,积分项输出就越小。即:Ti越大,就越削弱输出。

故此时Sk的确定,需要确定两个参数:T与Ti。

(2)Dk的处理

Dk =Tdcdot frac{ Ek-Ek_1 }{ T }

Td:微分时间常数//反应微分项运行的时间。T:控制周期(或称采样周期、计算周期)//即我多长时间算一次PID,多长时间更新一次PID,间隔时间。NOTE1:Td越大,微分项输出就越大。即:Td越大,就越增强输出。NOTE2:偏差不变情况下,T越大,此时公式后半部分就越小,即偏差变化趋势越小,即偏差斜率越平坦(如下图),这会造成的结果是:有时系统明明已经发生了非常非常剧烈的变化,但却因为我控制周期设置太长了,使得系统对变化趋势很不敏感,而导致系统并未检测到该剧烈变化。这就可以理解为“T若过大,则微分项失效”故控制周期T切勿取过大。

故此时Dk的确定,需要确定两个参数:Td与T(与Sk中的是同一个T)。

图明显左边斜率高,右边斜率低。(6)PID数学模型

我们上面也已经得到了处理后的Sk与Dk,下面再一次整理PID数学模型(即数学公式):

三个项相加: PIDout=(Kpcdot Ek)+(Kpcdotfrac{ 1 }{ Ti }cdot TcdotSigma Ek)+(Kpcdot Tdcdot frac{ Ek-Ek_1 }{ T })+OUT0

此时经过PID运算后直接算出一个数字“PIDout”这个数字就是本周期的控制输出,也是加载到执行机构上的脉宽值。比如满PWM为1000的情况下,本次输出PIDout=200,则本周期控制占空比就为 frac{ 200 }{ 1000} 。

2.2 位置PID控制器代码

/*****变量定义************/int 	Error,Error_last,                            //本次偏差,上次偏差	Integral_Error,Differential_Error,           //偏差的积分,偏差的微分	Proportion_OUT,Integral_OUT,Differential_OUT,//比例项输出,积分项输出,微分项输出	T,Ti,Td,                                     //控制周期,积分时间常数,微分时间常数        PID_OUT;                                     //PID最终输出float 	Kp,Ki,Kd;//比例项系数,积分项系数,微分项系数/******PID函数**********函数入口:目标值Target,反馈值Feedback函数返回:PID最终输出*/int PID_Controller(float Target,float Feedback){	Ki = Kp * T * (1/Ti);//积分项系数,即提取出积分项公式中所有可人为设定的参数	Kd = Kp * Td * (1/T);//微分项系数,即提取出微分项公式中所有可人为设定的参数		Error 			= Target - Feedback;		//偏差	Integral_Error 		= Integral_Error + Error;	//偏差的积分	Differential_Error 	= Error - Error_last;		//偏差的微分		Proportion_OUT 		= Kp * Error;										//比例项输出 = Kp * 偏差	Integral_OUT 		= Ki * Integral_Error;	//积分项输出 = Ki * 偏差的积分	Differential_OUT 	= Kd * Differential_Error;	//微分项输出 = Kd * 偏差的微分		PID_OUT = Proportion_OUT + Integral_OUT + Differential_OUT;        //PID最终输出 = 比例项输出 + 积分项输出 + 微分项输出		return PID_OUT;}

后面还有积分分离pid控制,以及位置PID控制器、增量PID控制器的数学模型的建立和分析等等。

我是打算遵循十分通俗易懂的方式去写的,所以每一句话会按照已学知识的情况下尽量通俗的表达pid控制,如果大家有看不明白的地方可以提问。

文章写的有些急促,还有很多detail没有加进去,大家可以先收藏一下,坐等更新~~

这是我的另一篇文章

发表评论

邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息