PID自动(反馈)控制

自动(反馈)控制

1.1 概述

自动控制(automatic control)是指在没有人直接参与的情况下,利用外加的设备或装置,使机器、设备或生产过程的某个工作状态或参数自动地按照预定的规律运行。

1.2 来源与原始形态

自动化控制技术的广泛应用则开始于欧洲的工业革命时期。瓦特在发明蒸汽机的同时,应用反馈原理,于1788年发明了离心式调速器。当负载或蒸汽量供给发生变化时,离心式调速器能够自动调节进气阀的开度,从而控制蒸汽机的转速。

1.3 例子

空调温控,车速控制。

2  PID控制

2.1  闭环自动控制技术的基础

当今的闭环自动控制技术都是基于反馈的概念以减少不确定性。

2.2  反馈理论的要素:测量、比较和执行

测量关键的是被控变量的实际值,与期望值相比较,用这个偏差来纠正系统的响应,执行调节控制。

2.3  PID控制

在工程实际中,应用最为广泛的调节器控制规律为比例(proportion)、积分(integral)、微分(derivative)控制,简称PID控制,又称PID调节。

在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正。PID算法已经有100多年历史,在四轴飞行器,平衡小车、汽车定速巡航、温度控制器等场景均有应用。

2.3.1       PID控制原理

 

r(t):所需的设定值、目标值;

y(t):测量的过程输出值、实际值;eg.每0.1s得到的车轮速度。

e(t):偏差是设定值(目标值)与过程值(实际值)的差(r(t)-y(t));通过反馈慢慢使之为0。

u(t):经过计算得到的控制变量,输入到控制器中。

$u(t)=K_p·e(t)+K_d×\frac{e(t)-e(t-1)}{\delta t}$

P : proportion(非负比例系数),就是偏差乘以一个常数。

I : integral(非负积分系数),就是对偏差进行积分运算。

D : derivative(非负微分系数),对偏差进行微分运算。

 eg.控制小车:将小车速度设定值r(t)为3m/s,由光电码盘测得速度为3.2m/s,即过程输出值y(t);偏差e(t)为-0.2m/s。

P:将-0.2m/s乘以一个系数(正)输入到控制器中,以减小输出的占空比,则车轮转速将降低,向设定值靠近。KP越大则调节的灵敏度越大,但过大可能会使实际速度低于3m/s(超调)。

I:只经过比例调节的小车,可能稳定后的速度为3.1m/s,存在稳态误差-0.1m/s;虽然误差很小,但是因为积分项也会随着时间的增加而加大,它推动控制器的输出增大,从而使稳态误差进一步减小,直到等于0。

D:小车中有些组件存在较大惯性或者滞后性,其变化总是落后于误差的变化。假设经比例调节后实际速度为3.1m/s,则设定速度与实际速度的差值由-0.2m/s变为-0.1m/s,e(t)的差分为0.1m/s2,将此差分乘以系数(正)加到控制变量中,相比只有比例环节减缓了速度降低的趋势(减小超调量)

调整方式

上升时间

超调量

安定时间

稳态误差

稳定性

↑ Kp

减少 ↓

增加 ↑

小幅增加 ↗

减少 ↓

变差 ↓

↑ Ki

小幅减少 ↘

增加↑

增加 ↑

大幅减少↓↓

变差↓

↑ Kd

小幅减少 ↘

减少↓

减少↓

变动不大→

变好 ↑

 

上表是独立增加参数的影响

2.3.2  PID数学表达

$u(t)=K_pe(t)+K_d\frac{de(t)}{dt}+K_i\int_t^0e(t')dt'$

$K_p,K_i,K_d$都是非负的,先$K_p$(比例项,调整效果最大),再$K_d$(微分项),最后$K_i$(积分项,消除误差)

2.3.1      PID参数整定

1.PID参数调整特点

难点不是编程,而是控制器的参数整定。

输入r(t)为阶跃响应。下图为不同参数下的输出y(t)响应。

理想:稳定、振高少、收敛快

① $K_p$增加,$K_i$ 、$K_d$不变

 

②$K_p$不变,$K_i$ 增加(少量增加),$K_d$不变

 

③$K_p$、$K_i$不变,$K_d$增加

PID系统输出影响:

(1)增大比例系数 使系统反应灵敏,调节速度加快,并且可以减小稳态误差

但比例系数过大会使超调量增大,振荡次数增加,调节时间加长,动态性能变坏,比例系数太大甚至会使闭环系统不稳定

(2)增大微分系数 可以减小超调量和稳定时间

(3)增大积分系数 会减小稳态误差,但会增大超调量和稳定时间

2.3.4  离散型PID

在计算机上进行PID调节时只能用离散型PID。

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

偏差$e(k) = r(k) - y(k)$

积分环节用加和的形式表示,即$e(k) + e(k-1) + …$

差分环节用斜率的形式表示,即$e(k) - e(k-1)$

从而有位置式PID

 $u(k)=K_pe(k)+K_d\frac{e(k)-e(k-1)}{\delta t}+K_i·\sum_{j=1}^k e(j)$

两次的u(k)相减可以得到增量式PID:

 $\delta u(k) = u(k) - u(k-1)=K_p[e(k)-e(k-1)]+K_Ie(k)+K_D[e(k)-2e(k-1)+e(k-2)]$

(1)增大比例系数 使系统反应灵敏,调节速度加快,并且可以减小稳态误差

但是比例系数过大会使超调量增大,振荡次数增加,调节时间加长,动态性能变坏,比例系数太大甚至会使闭环系统不稳定

(2)增大微分系数 可以减小超调量和稳定时间

(3)增大积分系数 会减小稳态误差,但会增大超调量和稳定时间

PID中三个参数,大体对应于控制系统的三个最重要的方面:

P对应“稳”,即稳定性,放大控制作用;I对应“准”,消除稳态误差;D对应“快”,对误差进行预判、做出快速反应。

3 用控制器使一锅水的温度保持在50℃

1. Kp比例增益

Kp比例控制考虑当前误差,误差值和一个正值的常数Kp(表示比例)相乘。需要控制的量,比如水温,有它现在的当前值,也有我们期望的目标值。

①  当两者差距不大时,就让加热器“轻轻地”加热。

②  要是因为某些原因,温度降低了很多,就让加热器“稍稍用力”加热。

③ 要是当前温度比目标温度低得多,就让加热器“开足马力”加热,尽快让水温到达目标附近。

Kp越大,调节作用越激进,Kp调小会让调节作用更保守。

2. Kd微分增益

Kd微分控制考虑将来误差,计算误差的一阶导,并和一个正值的常数Kd相乘。

当比较接近目标时,P的控制作用就比较小了,越接近目标,P的作用越小。当有很多内在的或者外部的因素,使控制量发生小范围的摆动。由于P在接近目标时的作用小,整个系统不是特别稳定,总是在“抖动”,因此需要一个控制作用,让被控制的物理量的“变化速度”趋于0,即类似于“阻尼”的作用。

D的作用就是让物理量的速度趋于0,只要什么时候,这个量具有了速度,D就向相反的方向用力,尽力刹住这个变化。Kd参数越大,抑制能力就越强。

3. Ki积分增益

Ki积分控制考虑过去误差,将误差值过去一段时间和(误差和)乘以一个正值的常数Ki。设置一个积分量,只要偏差存在,就不断地对偏差进行积分(累加),并反应在调节力度上。

即使与目标值相差不是太大,但是随着时间的推移,只要没达到目标,这个积分量就不断增加。到了目标温度后,假设没有波动,积分值就不会再变动。

Ki的值越大,积分时乘的系数就越大,积分效果越明显,所以,I的作用就是,减小静态情况下的误差,让受控物理量尽可能接近目标值。

4 【走直线的问题】

小车差分驱动(左、右轮分别用电机驱动,通过改变两个电机的转速实现小车前进和转向)仍是主流。

两个电机驱动有差异且不可能完全相同,导致两个轮子转速不同,就使得小车本该直线行驶的轨迹发生偏移。

运转过程中的扰动,如轮子瞬间打滑、有微小的障碍物等因素,都会导致左右轮不同速,从而“走偏”。

5 闭环控制

来源:学会PID-基于板球平衡系统-初中基础就能听懂的简单讲_哔哩哔哩_bilibili  日期:2023/07/27

比例P

偏差量 = 目标量 - 小球位置

比例P = 偏差量 * 比例P系数

执行量 = 比例P

比例P的效果:距离目标量差距越大,把其拉回目标值的力量就越大

比例P的缺点:1.数值固定 2.不辩情形 3.单一时间点

比例P过小可由增幅器(积分I)补充,比例P过大可由抑制器(微分D)补充

积分I

增幅器(积分I)->利用过去累加经验,判断比例P是否需要帮助,从而增加数值

积分I = 积分I + 偏差量 * 积分I系数

①限制幅度

如果积分I>最大值,则令积分I=最大值

如果积分I<最小值,则令积分I=最小值

②不运行时清零

执行量 = 比例P + 积分I

微分D

抑制器(微分D)->预测未来,即用当前偏差量减去上一次偏差量就可能是下一次偏差量

再用下一次偏差量提前参与到计算中,防止P过大产出超出目标的问题

微分D = (偏差量 - 上一次偏差量) * 微分D系数

执行量 = 比例P + 积分I + 微分D

上一次偏差量 = 偏差量

伪代码

#计时
    运行时间 = (系统运行时间()- 计时)/1000
    计时 = 系统运行时间()
#PID部分
    for n in range(0,2):
        偏差量[n] = 目标量[n] - 小球位置[n]

        比例P[n] = 偏差量[n] * 比例系数P[n]

        积分I[n] = 积分I[n] + 偏差量[n] * 积分I系数[n] * 运行时间

        if 积分I[n]>积分I最大值[n]:
            积分I[n] = 积分I最大值[n]
        elif 积分I[n]<- 积分I最大值[n]:
            积分I[n]=-积分I最大值[n]
    
        微分D[n] = (偏差量[n] - 上一次偏差量[n]) * 微分D系数[n]/运行时间
        上一次偏差量[n] = 偏差量[n]

        执行量[n] = 比例P[n] + 积分I[n] + 微分D[n]
#控制平台倾斜
    控制平台(执行量)

【注】1.板球平衡需要x轴和y轴独立调节,故需要两套PID

(用for循环让PID运行2次,其中每个变量均由两个元素列表组成,可完成两组PID计算)

积分I与微分D通过时间维度获得,故其与时间息息相关——程序执行速度固定则无需考虑此问题,但程序执行速度会变,则应该考虑时间问题

因为经历了更长时间,所以积分I需要乘时间系数,而微分D预测未来则相反,即除时间系数。

闭环控制和PID的过程

1.设置目标量

2.通过传感器结果获得偏差量

3.偏差量输入PID输出执行量

4.执行量给执行器从而可以纠正执行器,从而达到想达到的效果

5.PID核心是比例P,积分I是增幅器,微分D是抑制器

PID调参的顺序和关联

①比例P:基础运行能力。太小不能达到目标,太大则会超出目标。

②积分I:补足P过小的问题,对小偏差量起作用。太小会使小偏差量无法回正,不能到目标。太大会使系统表现迟钝,导致超出目标。

③微分D:阻止超出目标。太小会超出目标,太大会对误差敏感,导致被调节对象在目标范围附近高频抖动。

调整的例子

假设画面宽度是240,其中舵机角度是50,其中50/240=0.2

step1 调P,计算偏差量和执行量的比例

step2 调D,能限制超出目标。有足够的限制力后,就可以增加P;每个周期小球移动50,抬高5:5/50=0.1。但实测0.1偏大了,所以调小

step3 调I,可以加快回正,解决小偏差。同时也可以减小P

无人机悬停的例子

来源:通俗易懂的 PID 控制算法讲解_哔哩哔哩_bilibili

目的:控制无人机悬停高度

可控部分:无人机螺旋桨的旋转速度(速度越快,螺旋桨产生的升力越大)

开环控制很难使无人机飞行到指定高度,因为无人机受到重力、空气扰动和阻力等各种不确定因素

将误差进行比例放大,微分阻尼,积分误差补偿

PID作为闭环控制单元实现了三个目的:

P是实现当前误差闭环控制,

I是实现过去一段时间Tn内的累积误差控制,

D则是对未来某个时间段Tv内的预测累积误差控制。

所以PID三个增益参数都是对时间状态的预测。

step1 设无人机安装了传感器,可以感知当前飞行高度

→可计算“当前高度”到“目标高度”的误差

→误差值越大,给无人机提供的升力就越大

【$F = 0.01 × error = K_p × error$】

$K_p$越大,升力和误差的比例越大,控制系统响应速度更快,但无人机接近目标高度时振荡更严重

step2 为解决系统震荡,通过微分,计算速度$v=\frac{d(error)}{dt}$→D算法可对无人机速度做出响应

无人机速度过快→D算法抵消一部分P算法计算得到的升力→减缓系统震荡

$K_d$从0.01增大至0.05,无人机震荡明显改善,再增大到比如0.1则会失控!!!所有参数不能被设置的过大!

要找到平衡点,防止过冲。(PID的每一个值被设置的过大都会产生不同的震荡效果,通常在信号处理中会用"过冲"来描述这个现象。)

btw, 工程上说微分默认就是差分

step3 无论如何调整$K_p$或$K_I$值,误差永远不会被消除为0

因为误差存在→无人机升力存在→无人机接近目标高度时,升力和重力会平衡→无人机不再继续上升

故需要累积误差值,让长期误差值得不到修正的无人机有更大的升力,迫使无人机上升

I会对误差累积,提供更大的升力。加入$K_I$让无人机慢慢朝目标高度靠拢,让误差消除为0

I每一次控制循环都会逐渐累加,但是累加的值是根据当前测量的“误差”决定的。如果当前误差逐渐趋于0,那么I就不再累加,逐渐趋于一个固定值。

这个时候整个系统达到稳定,I并不会无止境的一直累加上去的(比如在视频中的例子中,I的这部分会提供一个额外的向上的力,使得无人机能够攀爬到达指定的高度)

事实上,I除了会累“加”也会累“减”,这取决于当前测量的“误差值”的“正负”。

在线模拟程序: https://rossning92.github.io/pid-simulation

 算法伪代码

previous_error := 0
integral := 0

loop:
    error := setpoint - measured_value
    integral := integral + error × dt
    derivative := (error - previous_error) / dt
    output := Kp × error + Ki × integral + Kd × derivative
    previous_error := error
    wait(dt)
    goto loop

开源PID库

1.Python https://github.com/m-lundberg/simple-pid

2.C https://github.com/saxbophone/pid

3.Javascript https://github.com/Philmod/node-pid-controller

4.Java https://github.com/tekdemo/MiniPID-ava

 【Arduino 101】五分钟搞懂PID控制算法_哔哩哔哩_bilibili

6 PID分类及温度调节实例

来源:假如不调PID,小车会“魔怔”吗?一个例程整明白PID的意义_哔哩哔哩_bilibili

位置式PID

$u(t) = K_p[e(t) + \frac{1}{T_i}\int_0^te(t)dt + T_d\frac{de(t)}{dt}]$

离散位置PID

$u_k = K_p[e_k + \frac{T}{T_i}\sum_{j=0}^k e_j + T_d \frac{e_k-e_{k-1}}{T}]$

$K_p$控制器比例系数

$T_i$控制器积分时间,$\frac{K_p}{T_i}$积分系数

$T_d$控制器微分时间,$K_p · T_d$微分系数

比例调节(P)

  • 成比例的反映控制系统的偏差信号。
  • 偏差一旦产生,控制器立即产生控制作用,以减少偏差。
  • 通常随着值的加大,闭环系统的超调量加大,系统响应速度加快;但是当增加到一定程度,系统会变得不稳定。

积分调节(I)

  • 积分控制器不断积累系统误差,输出控制量,直至无差。
  • 强弱取决于积分时间常数T,越小,积分作用就越强。
  • 积分作用太强会使系统超调加大,甚至使系统出现振荡。

微分调节(D)

  • 微分控制可以减小超调量,克服振荡,提高系统稳定性。
  • 加快系统的动态响应速度,减小调整时间,从而改善系统的动态性能。

【舵机采用的】位置式PID优缺点

优点:1.非递推式算法可直接控制执行机构

2.在执行机构不带积分部件的对象中可以很好应用

缺点:1.每次输出均与过去的状态有关

2.计算时要对e(k)进行累加,运算工作量大

【电机采用的】增量式PID优缺点

优点:1.误动作时影响小,必要时可以通过逻辑判断的方法去掉出错数据

2.手动自动切换的冲击小,便于实现无扰动切换(计算机出现故障或单片机出现数据扰动时,PID仍能保持原值)

3.算式中不需要累加

缺点:积分截断效应大,有稳态误差

PID变式

位置式PID

增量式PID

串接式PID

积分分离式PID

ADRC

其他

基于Arduino的自动空调温度测试器

  • 实际生活中,需要在一天中的不同时间将空调的设定温度改变成不同的值,以始终保持舒适的环境。
  • 测试器使用温度传感器(DHT11)读取房间的当前温度。
  • 通过一个类似于空调遥控器的红外发射器向空调发送PID运算的输出指令。
  • 随着房间温度的变化,Arduino也会调整空调设定温度。
int main(void)
{
init();
setup();
for(;;){
loop();
if (serialEventRun)serialEventRun();
}
Return 0;
}
void setup(){
Serial.begin(9600);
Initialize device.
dht.begin();
Serial.println(F("DHTxx Unified Sensor Example));
//Print temperature sensor details.
sensor_t sensor;
dht.temperature().getSensor(&sensor);
Serial.println(F("-------------------------"));
Serial.println(F("Temperature Sensor"));
Serial.print (F("Sensor Type:"));Serial.println(sensor.name);
Serial.print (F("Driver Ver:"));Serial.println(sensor.version);
Serial.print (F("Unique ID:"));Serial.println(sensor.sensor_id);
Serial.print (F("Max Value:"));Serial.print(sensor.max_value);
Serial.println(F("C"));
Serial.print (F("Min Value:"));Serial.print(sensor.min_value);
Serial.println(F("C"));
Serial.print (F("Resolution:"));Serial.print(sensor.resolution);
Serial.println(F("C"));
Serial.printin((F("-------------------------"));
//Print humidity sensor details.
dht.humidity().getSensor(&sensor);
Serial.println(F("Humidity Sensor"));
Serial.print (F("Sensor Type: "));Serial.println(sensor.name);
Serial.print (F("Driver Ver: "));Serial.println(sensor.version);
Serial.print (F(Unique ID: "));Serial.println(sensor.sensor_id);
Serial.print (F("Max Value: "));Serial.print(sensor.max_value);
Serial.println(F("%"));
Serial.print (F("Min Value: "));Serial.print(sensor.min_value);
Serial.println(F("%"));

Serial.print (F(Resolution:"));Serial.print(sensor.resolution);
Serial.println(F("%"));
Serial.println((F("-------------------------"));
//Set delay between sensor readings based on sensor details.
delayMS sensor.min_delay 1000;
void loop(){
//Delay between measurements.
delay(delayMS);
//Get temperature event and print its value.
sensors_event_t event;
dht.temperature().getEvent(&event);
if (isnan(event.temperature)){
Serial.println(F("Error readina temperature!"));
}
else{
Serial.print(F(Temperature:"))
Serial.print(event.temperature);
Serial.println(F("C"));
}
//Get humidity event and print its value.
dht.humidity0.getEvent(&event);
if (isnan(event.relative_humidity)){
Serial.println(F("Error reading humidity!"));
}
else{
Serial.print(F("Humidity:"));
Serial.print(event.relative_humidity);
Serial.println(F(%"));
}
}

7 PID控制详述

来源:5分钟,带你推导位置式PID和增量式PID公式~_哔哩哔哩_bilibili

增量式PID的优势 

up主洋葱auto认为,之所以要分增量式PID是因为:

1.有的控制系统只需要输出控制增量,比如步进电机的控制。这种情况下用增量式正合适,没有积分计算,计算量也小。
2.对PID进行优化的时候,例如微分先行PID采用增量式PID表达式的时候,优化后的PID公式更简单,编程更容易,所以许多人喜欢用增量式表达式。
3.有的场景下需要做手动控制和自动控制的切换,用增量式表达式可以实现无扰切换
增量式表达式由于每次输出都是基于上次的结果+增量部分的计算结果,因此切换的时候只有增量部分会重新计算,最后的输出扰动很小
而位置式的要重新计算,PID控制的输出会比较大。

 

D像阻尼器,就像楞次定律hhh让目标更快达到稳态速度

积分I则致力于消除第一个尖峰,即超调量

 

积分饱和  

积分控制器的优化,应对积分饱和问题_哔哩哔哩_bilibili

 积分抗饱和!

保守一些→

微分饱和

对某些控制方法,低振幅的噪声不会对控制系统产生太大的影响,噪声问题会被掩盖
但对理想的PID控制器,有纯微分控制通道,会放大高频信号,把小的、注意不到的扰动放大到可能影响系统的程度

增大频率,虽然幅值没有改变,但斜率还是改变了。

降低高频噪声的幅值,从而减小微分值。

而再增加频率,又会让斜率变大。

结论:如果系统存在高频噪声,即使其幅值可能很小,但经过微分器后也会对系统产生不小的影响 

8 PID调优指南

1、基于模型的调优

 2.基于物理系统的设计

①手动调优

手动调节PID的增益系数,然后观察物理系统的实时响应,以逐渐将系统调整到理想状态

【注】

1、此调优过程的艺术性大于其技术性

2、需要了解每个通道对系统响应的影响

3、还要对PID增益如何影响系统有一定的感性认识,了解它们的特性后可以更好调优而不是瞎调

②在硬件上运行预定义的输入(常为阶跃输入),然后观察系统的开环响应

 再采用一些启发式算法,不需要系统模型,只需要系统响应、振荡周期啥的就可以计算系统的初始增益

 启发式算法只提供初始的猜测,运气好可能可以用,但之后往往还是需要手动调优以获得合适的参数

当然还可以对物理硬件进行建模

 

posted @ 2023-07-19 10:34  asandstar  阅读(1658)  评论(0编辑  收藏  举报