一、什么是PID 控制算法

PID 控制算法是比例(Proportional)- 積分(Integral)- 微分(Derivative) 控制的簡(jiǎn)稱,是工業(yè)控制、嵌入式系統(tǒng)中最經(jīng)典、應(yīng)用最廣泛的閉環(huán)控制算法。它的核心思想是通過(guò)偏差(設(shè)定值與實(shí)際值的差值)的比例、積分、微分三個(gè)環(huán)節(jié)的加權(quán)組合,計(jì)算出控制量,使系統(tǒng)的實(shí)際輸出快速、穩(wěn)定地逼近設(shè)定值。
二、核心公式(連續(xù)域)


比例環(huán)節(jié)(P)
核心作用:即時(shí)響應(yīng)偏差,偏差越大,控制量越大。
缺點(diǎn):僅用 P 控制會(huì)存在穩(wěn)態(tài)誤差(系統(tǒng)穩(wěn)定后,實(shí)際值與設(shè)定值仍有差距);Kp過(guò)大會(huì)導(dǎo)致系統(tǒng)震蕩。
積分環(huán)節(jié)(I)
核心作用:累積歷史偏差,只要存在偏差,積分項(xiàng)就會(huì)持續(xù)增大,直到偏差為 0,從而消除穩(wěn)態(tài)誤差。
缺點(diǎn):積分累積會(huì)導(dǎo)致系統(tǒng)超調(diào)(實(shí)際值超過(guò)設(shè)定值),甚至震蕩;系統(tǒng)啟動(dòng)初期積分飽和會(huì)影響響應(yīng)速度。
微分環(huán)節(jié)(D)
核心作用:預(yù)測(cè)偏差變化趨勢(shì),偏差變化越快,微分項(xiàng)輸出越大,提前抑制偏差的變化(類似 “阻尼” 作用)。
缺點(diǎn):對(duì)噪聲敏感(傳感器的微小波動(dòng)會(huì)被放大);Kd過(guò)大會(huì)導(dǎo)致系統(tǒng)響應(yīng)遲緩。
離散化公式(嵌入式系統(tǒng)常用)
嵌入式 MCU 是離散采樣系統(tǒng),無(wú)法直接計(jì)算連續(xù)的積分和微分,需要將上述的連續(xù)域PID 公式離散化,用數(shù)值積分和數(shù)值微分替代連續(xù)運(yùn)算,得到離散 PID 公式。
設(shè)系統(tǒng)采樣周期為 Ts,第 k 次采樣時(shí)刻的偏差為 e(k)=r(k)-y(k)(設(shè)定值-實(shí)際采樣值),則離散 PID 有兩種常用形式:
位置式PID

特點(diǎn):輸出 u(k) 是絕對(duì)控制量,也就是閥門開度(如電機(jī)的目標(biāo)占空比、舵機(jī)的目標(biāo)角度)。
C語(yǔ)言代碼(通用):
typedef struct {
float kp; // 比例系數(shù)
float ki; // 積分系數(shù)
float kd; // 微分系數(shù)
float set_point; // 設(shè)定值
float feedback; // 反饋值
float error; // 當(dāng)前誤差 (set_point - feedback)
float error_sum; // 誤差積分和(防止積分飽和)
float error_prev; // 上一次誤差(微分用)
float output_max; // 輸出最大值
float output_min; // 輸出最小值
} PID_Positional;
/**
- @brief 位置式 PID 核心計(jì)算(無(wú)初始化函數(shù),參數(shù)需外部賦值)
- @param pid: 位置式 PID 結(jié)構(gòu)體指針
- @param set_point: 設(shè)定值
- @param feedback: 反饋值
- @return 位置式 PID 輸出值
*/
float PID_Positional_Calc(PID_Positional *pid, float set_point, float feedback) {
if (pid == NULL) return 0.0f;
// 更新設(shè)定值和反饋值
pid->set_point = set_point;
pid->feedback = feedback;
// 計(jì)算當(dāng)前誤差
pid->error = pid->set_point - pid->feedback;
// 積分項(xiàng)(帶積分限幅,防止積分飽和)
pid->error_sum += pid->error;
// 積分限幅:根據(jù)輸出限幅和 ki 動(dòng)態(tài)約束(也可直接賦值固定值)
float integral_max = (pid->output_max / pid->ki) * 0.8f;
float integral_min = (pid->output_min / pid->ki) * 0.8f;
if (pid->error_sum > integral_max) pid->error_sum = integral_max;
if (pid->error_sum < integral_min) pid-?>error_sum = integral_min;
// 位置式 PID 核心公式
float output = pid->kp * pid->error + // 比例項(xiàng)
pid->ki * pid->error_sum + // 積分項(xiàng)
pid->kd * (pid->error - pid->error_prev); // 微分項(xiàng)
// 輸出限幅
if (output > pid->output_max) output = pid->output_max;
if (output < pid-?>output_min) output = pid->output_min;
// 更新上一次誤差
pid->error_prev = pid->error;
return output;
}
2.增量式 PID
計(jì)算相鄰兩次控制量的差值 Δ u(k),公式推導(dǎo):

特點(diǎn):輸出Δ u(k)是控制量增量,只需疊加到上一次的控制量上(在上一次的控制輸出上進(jìn)行加減):u(k)=u(k-1)+Δ u(k)。
C語(yǔ)言代碼(通用):
typedef struct {
float kp; // 比例系數(shù)
float ki; // 積分系數(shù)
float kd; // 微分系數(shù)
float set_point; // 設(shè)定值
float feedback; // 反饋值
float error; // 當(dāng)前誤差 (set_point - feedback)
float error_prev1; // 前1次誤差
float error_prev2; // 前2次誤差
float output_inc; // 增量輸出
float output_max; // 輸出最大值(用于增量限幅)
float output_min; // 輸出最小值(用于增量限幅)
} PID_Incremental;
/**
@brief 增量式 PID 核心計(jì)算(無(wú)初始化函數(shù),參數(shù)需外部賦值)
@param pid: 增量式 PID 結(jié)構(gòu)體指針
@param set_point: 設(shè)定值
@param feedback: 反饋值
@return 增量式 PID 輸出增量
*/
float PID_Incremental_Calc(PID_Incremental *pid, float set_point, float feedback) {
if (pid == NULL) return 0.0f;
// 更新設(shè)定值和反饋值
pid->set_point = set_point;
pid->feedback = feedback;
// 計(jì)算當(dāng)前誤差
pid->error = pid->set_point - pid->feedback;
// 增量式 PID 核心公式
pid->output_inc = pid->kp * (pid->error - pid->error_prev1) + // 比例增量
pid->ki * pid->error + // 積分增量
pid->kd * (pid->error - 2*pid->error_prev1 + pid->error_prev2); // 微分增量
// 增量限幅(避免單次增量過(guò)大)
float inc_max = (pid->output_max - pid->output_min) / 2;
if (pid->output_inc > inc_max) pid->output_inc = inc_max;
if (pid->output_inc < -inc_max) pid-?>output_inc = -inc_max;
// 更新誤差歷史(前2次 → 前1次,前1次 → 當(dāng)前)
pid->error_prev2 = pid->error_prev1;
pid->error_prev1 = pid->error;
return pid->output_inc;
}
三、嵌入式系統(tǒng)如何使用PID控制算法?
建立閉環(huán)反饋
明確被控對(duì)象
被控對(duì)象:比如溫度、機(jī)器人關(guān)節(jié)、直流電機(jī)轉(zhuǎn)速等;
選擇合適的采樣周期對(duì)被控變量進(jìn)行采樣
采集能反應(yīng)被控對(duì)象當(dāng)前狀態(tài)的信號(hào)
采樣周期的選擇依據(jù):
香農(nóng)采樣定理:采樣頻率至少是被控對(duì)象最高變化頻率的 2 倍,避免信號(hào)混疊;
被控對(duì)象響應(yīng)速度:比如直流電機(jī)響應(yīng)速度為 ms 級(jí),采樣周期設(shè)置為1~10ms;溫度這類慢響應(yīng)對(duì)象,采樣周期設(shè)置為1~5s;
由此我們得到了被控對(duì)象溫度的實(shí)際溫度
PID運(yùn)算出輸出量
將目標(biāo)值和采樣值送入PID公式進(jìn)行計(jì)算
需要注意:
抗積分飽和:當(dāng) PID 輸出達(dá)到執(zhí)行器最大 / 最小量程時(shí),停止積分累加;
積分分離:當(dāng)誤差|ek|大于設(shè)定閾值時(shí),暫停積分項(xiàng)運(yùn)算,避免積分飽和導(dǎo)致的超調(diào);
輸出到執(zhí)行器
將PID公式運(yùn)算出來(lái)的結(jié)果作用到輸出執(zhí)行器
需要注意:
數(shù)值限幅:運(yùn)算后必須將輸出量限制在執(zhí)行器的有效范圍(比如 PWM 占空比 0~100%、DAC 輸出 0~4095),避免輸出超限損壞執(zhí)行器;
PID參數(shù)的調(diào)參(Kp,Ki,Kd)
建立好閉環(huán)反饋環(huán)節(jié)后就可以對(duì)PID參數(shù)進(jìn)行整定了,我們實(shí)際最多使用的是經(jīng)驗(yàn)試湊法,這里只分享試湊法:
試湊法的核心邏輯:先調(diào) P,再調(diào) I,最后調(diào) D,每次只改一個(gè)參數(shù),觀察系統(tǒng)響應(yīng),逐步逼近最優(yōu)值。
只調(diào)比例環(huán)節(jié)(P),關(guān)閉 I 和 D
Ki=0,Kd=0,K_p 從 0 開始緩慢增大;直到響應(yīng)較快,實(shí)際值快速接近設(shè)定值,輕微震蕩后穩(wěn)定,穩(wěn)態(tài)誤差較小

(此時(shí)可能會(huì)有靜態(tài)誤差,即輸出一直達(dá)不到目標(biāo)值這種情況)
Kp過(guò)大-->系統(tǒng)可能會(huì)震蕩
Kp過(guò)小-->系統(tǒng)響應(yīng)較慢, 可能達(dá)不到目標(biāo)值
加入積分環(huán)節(jié)(I),消除穩(wěn)態(tài)誤差
為了消除靜態(tài)誤差,加入積分環(huán)節(jié),在Kp已有的基礎(chǔ)上,Kd=0,加入Ki,Ki 從 0 開始緩慢增大,直到系統(tǒng)能消除靜態(tài)誤差,并且不發(fā)生震蕩


(要注意抗積分飽和,不然系統(tǒng)極易發(fā)生震蕩)
Ki過(guò)大-->系統(tǒng)可能會(huì)震蕩
Ki過(guò)小-->系統(tǒng)依舊有靜差
加入微分環(huán)節(jié)(D),加快響應(yīng)
若已達(dá)到預(yù)期的控制效果可不引入微分環(huán)節(jié)。
若未達(dá)到預(yù)期的控制效果,可以在前面的基礎(chǔ)上使Kid從 0 開始緩慢增大,直到超調(diào)大幅減小,響應(yīng)速度基本不變,系統(tǒng)快速穩(wěn)定。
-
溫度控制
+關(guān)注
關(guān)注
7文章
312瀏覽量
39153 -
PID
+關(guān)注
關(guān)注
38文章
1503瀏覽量
91624 -
控制算法
+關(guān)注
關(guān)注
4文章
172瀏覽量
22795
發(fā)布評(píng)論請(qǐng)先 登錄
FOC控制中如何利用芯片內(nèi)部的運(yùn)放設(shè)計(jì)電流采樣電路?
堅(jiān)持繼續(xù)布局32位MCU,進(jìn)一步完善產(chǎn)品陣容,96Mhz主頻CW32L012新品發(fā)布!
**CW32L012****開發(fā)評(píng)估板的第一個(gè)程序**
CW32L012小型機(jī)器人控制評(píng)估板活動(dòng) 四足機(jī)器人+智能小車 開箱評(píng)測(cè)
基于單片機(jī)PID算法溫度控制系統(tǒng)設(shè)計(jì)資料分享
溫度控制的PID算法及C程序?qū)崿F(xiàn)
基于CW32的PID溫度控制案例分享
堅(jiān)持繼續(xù)布局32位MCU,進(jìn)一步完善產(chǎn)品陣容,96Mhz主頻CW32L012新品發(fā)布!
使用芯源CW32的CW32L012開發(fā)評(píng)估板做了spi屏幕驅(qū)動(dòng)
CW32L012小機(jī)器人的電機(jī)控制
CW32L012與STM32F103的三角運(yùn)算性能對(duì)比
CW32L012與STM32G431的CORDIC三角函數(shù)運(yùn)算性能對(duì)比
CW32L012的PID溫度控制——算法基礎(chǔ)
評(píng)論