PID控制技術深度剖析:從基礎原理到高級應用(六)

PID 控制技術深度剖析:從基礎原理到高級應用

在這里插入圖片描述
在這里插入圖片描述
最近在項目中有要開始進行PID的控制了,隔了很久沒有做PID控制的東西了,所以想正好借這個機會,溫習一下和PID有關的內容。

系列文章目錄

PID控制技術深度剖析:從基礎原理到高級應用(一)
PID控制技術深度剖析:從基礎原理到高級應用(二)
PID控制技術深度剖析:從基礎原理到高級應用(三)
PID控制技術深度剖析:從基礎原理到高級應用(四)
PID控制技術深度剖析:從基礎原理到高級應用(五)


文章目錄

  • PID 控制技術深度剖析:從基礎原理到高級應用
  • 系列文章目錄
    • 七、PID 控制的 C 語言實現示例
      • 7.1 位置式 PID 控制的 C 語言實現
      • 7.2 增量式 PID 控制的 C 語言實現
      • 7.3 抗積分飽和 PID 控制的 C 語言實現
      • 7.4 模糊 PID 控制的 C 語言實現
      • 7.5 自適應 PID 控制的 C 語言實現
    • 八、總結與展望
      • 8.1 PID 控制的優勢與局限
      • 8.2 PID 控制的發展趨勢
      • 8.3 實際應用建議


七、PID 控制的 C 語言實現示例

7.1 位置式 PID 控制的 C 語言實現

以下是一個位置式 PID 控制器的 C 語言實現示例:

typedef struct {float Kp;        // 比例系數float Ki;        // 積分系數float Kd;        // 微分系數float setpoint;  // 設定值float last_error; // 上一次的誤差float integral;  // 積分項float output_min; // 輸出最小值限制float output_max; // 輸出最大值限制
} PIDController;// PID控制器初始化函數
void PID_Init(PIDController *pid, float Kp, float Ki, float Kd, float setpoint, float output_min, float output_max) {pid->Kp = Kp;pid->Ki = Ki;pid->Kd = Kd;pid->setpoint = setpoint;pid->last_error = 0.0;pid->integral = 0.0;pid->output_min = output_min;pid->output_max = output_max;
}// PID計算函數
float PID_Compute(PIDController *pid, float feedback) {float error = pid->setpoint - feedback;float P = pid->Kp * error;pid->integral += error;float I = pid->Ki * pid->integral;float D = pid->Kd * (error - pid->last_error);float output = P + I + D;// 輸出限幅if (output > pid->output_max) {output = pid->output_max;} else if (output < pid->output_min) {output = pid->output_min;}// 保存當前誤差用于下一次計算pid->last_error = error;return output;
}

代碼說明

  1. PIDController結構體包含了 PID 控制器的所有參數和狀態變量。

  2. PID_Init函數用于初始化 PID 控制器的參數。

  3. PID_Compute函數根據當前反饋值計算控制輸出,實現了位置式 PID 算法。

  4. 代碼中包含了輸出限幅處理,防止控制量超出安全范圍。

  5. 積分項integral累積了所有歷史誤差,這是位置式 PID 的關鍵特性。

7.2 增量式 PID 控制的 C 語言實現

以下是一個增量式 PID 控制器的 C 語言實現示例:

typedef struct {float Kp;        // 比例系數float Ki;        // 積分系數float Kd;        // 微分系數float setpoint;  // 設定值float last_error; // 上一次的誤差float prev_error; // 上上次的誤差float output_min; // 輸出最小值限制float output_max; // 輸出最大值限制
} IncrementalPIDController;// 增量式PID控制器初始化函數
void IncrementalPID_Init(IncrementalPIDController *pid, float Kp, float Ki, float Kd, float setpoint, float output_min, float output_max) {pid->Kp = Kp;pid->Ki = Ki;pid->Kd = Kd;pid->setpoint = setpoint;pid->last_error = 0.0;pid->prev_error = 0.0;pid->output_min = output_min;pid->output_max = output_max;
}// 增量式PID計算函數
float IncrementalPID_Compute(IncrementalPIDController *pid, float feedback) {float error = pid->setpoint - feedback;float delta_P = pid->Kp * (error - pid->last_error);float delta_I = pid->Ki * error;float delta_D = pid->Kd * (error - 2 * pid->last_error + pid->prev_error);float delta_output = delta_P + delta_I + delta_D;// 輸出限幅if (delta_output > pid->output_max) {delta_output = pid->output_max;} else if (delta_output < pid->output_min) {delta_output = pid->output_min;}// 保存誤差用于下一次計算pid->prev_error = pid->last_error;pid->last_error = error;return delta_output;
}

代碼說明

  1. IncrementalPIDController結構體包含了增量式 PID 控制器的所有參數和狀態變量。

  2. IncrementalPID_Init函數用于初始化增量式 PID 控制器的參數。

  3. IncrementalPID_Compute函數根據當前反饋值計算控制量增量,實現了增量式 PID 算法。

  4. 增量式 PID 不需要積分項,而是通過計算當前誤差與前兩次誤差的關系來確定控制增量。

  5. 每次調用IncrementalPID_Compute函數返回的是控制量的增量,而不是絕對輸出值。

7.3 抗積分飽和 PID 控制的 C 語言實現

積分飽和是 PID 控制中常見的問題,當誤差持續存在時,積分項會不斷累積導致輸出飽和。以下是一個具有抗積分飽和功能的 PID 控制器實現示例:

typedef struct {float Kp;        // 比例系數float Ki;        // 積分系數float Kd;        // 微分系數float setpoint;  // 設定值float last_error; // 上一次的誤差float integral;  // 積分項float output_min; // 輸出最小值限制float output_max; // 輸出最大值限制
} AntiWindupPIDController;// 抗積分飽和PID初始化函數
void AntiWindupPID_Init(AntiWindupPIDController *pid, float Kp, float Ki, float Kd, float setpoint, float output_min, float output_max) {pid->Kp = Kp;pid->Ki = Ki;pid->Kd = Kd;pid->setpoint = setpoint;pid->last_error = 0.0;pid->integral = 0.0;pid->output_min = output_min;pid->output_max = output_max;
}// 抗積分飽和PID計算函數
float AntiWindupPID_Compute(AntiWindupPIDController *pid, float feedback) {float error = pid->setpoint - feedback;float P = pid->Kp * error;// 條件積分:只有當輸出未達到極限時才更新積分項if (!((P > pid->output_max && error > 0) || (P < pid->output_min && error < 0))) {pid->integral += error;}float I = pid->Ki * pid->integral;float D = pid->Kd * (error - pid->last_error);float output = P + I + D;// 輸出限幅if (output > pid->output_max) {output = pid->output_max;} else if (output < pid->output_min) {output = pid->output_min;}// 保存當前誤差用于下一次計算pid->last_error = error;return output;
}

代碼說明

  1. 在計算積分項時,首先檢查當前的比例項輸出是否已經達到了輸出限制。

  2. 如果比例項輸出已經達到限制,說明系統已經處于飽和狀態,此時停止積分項的累積,避免積分飽和。

  3. 只有當輸出未達到限制時,才繼續累積積分項,這樣可以有效防止積分飽和導致的控制性能下降。

  4. 其他部分與標準的位置式 PID 實現類似。

7.4 模糊 PID 控制的 C 語言實現

以下是一個模糊 PID 控制器的 C 語言實現示例:

// 模糊PID控制器結構體
typedef struct {PIDController pid;          // 基礎PID控制器FuzzyController fuzzy;      // 模糊控制器float error;                // 當前誤差float last_error;           // 上一次誤差float error_rate;           // 誤差變化率
} FuzzyPIDController;// 模糊PID初始化函數
void FuzzyPID_Init(FuzzyPIDController *fpid, float Kp, float Ki, float Kd, float setpoint, float output_min, float output_max) {PID_Init(&fpid->pid, Kp, Ki, Kd, setpoint, output_min, output_max);Fuzzy_Init(&fpid->fuzzy); // 模糊控制器初始化fpid->error = 0.0;fpid->last_error = 0.0;fpid->error_rate = 0.0;
}// 模糊PID計算函數
float FuzzyPID_Compute(FuzzyPIDController *fpid, float feedback) {// 計算誤差和誤差變化率fpid->error = fpid->pid.setpoint - feedback;fpid->error_rate = (fpid->error - fpid->last_error) / sample_time;// 模糊推理調整PID參數Fuzzy_AdjustParameters(&fpid->fuzzy, fpid->error, fpid->error_rate);// 更新PID參數PID_SetParameters(&fpid->pid, fpid->fuzzy.Kp, fpid->fuzzy.Ki, fpid->fuzzy.Kd);// 計算PID輸出float output = PID_Compute(&fpid->pid, feedback);// 保存當前誤差用于下一次計算fpid->last_error = fpid->error;return output;
}

代碼說明

  1. 模糊 PID 控制器由一個基礎 PID 控制器和一個模糊控制器組成。

  2. 模糊控制器根據當前誤差和誤差變化率調整 PID 參數。

  3. Fuzzy_AdjustParameters函數實現模糊推理過程,根據輸入的誤差和誤差變化率調整 PID 參數。

  4. 模糊 PID 控制器的參數調整周期通常與 PID 計算周期相同,或者略長。

  5. 模糊控制器的具體實現需要根據模糊規則和隸屬函數來設計。

7.5 自適應 PID 控制的 C 語言實現

以下是一個基于模型參考的自適應 PID 控制器的 C 語言實現示例:

// 自適應PID控制器結構體
typedef struct {PIDController pid;          // 基礎PID控制器ReferenceModel ref_model;   // 參考模型float error;                // 當前誤差float last_error;           // 上一次誤差float output;               // 控制器輸出
} AdaptivePIDController;// 自適應PID初始化函數
void AdaptivePID_Init(AdaptivePIDController *apid, float Kp, float Ki, float Kd, float setpoint, float output_min, float output_max) {PID_Init(&apid->pid, Kp, Ki, Kd, setpoint, output_min, output_max);ReferenceModel_Init(&apid->ref_model); // 參考模型初始化apid->error = 0.0;apid->last_error = 0.0;apid->output = 0.0;
}// 自適應PID計算函數
float AdaptivePID_Compute(AdaptivePIDController *apid, float feedback) {// 計算誤差和誤差變化率apid->error = apid->pid.setpoint - feedback;float error_rate = (apid->error - apid->last_error) / sample_time;// 計算參考模型的輸出float ref_output = ReferenceModel_Output(&apid->ref_model, apid->pid.setpoint);// 計算模型誤差float model_error = apid->output - ref_output;// 自適應調整PID參數apid->pid.Kp += adaptive_rate * model_error * apid->error;apid->pid.Ki += adaptive_rate * model_error * apid->error * sample_time;apid->pid.Kd += adaptive_rate * model_error * error_rate / sample_time;// 限制PID參數范圍if (apid->pid.Kp < 0) apid->pid.Kp = 0;if (apid->pid.Ki < 0) apid->pid.Ki = 0;if (apid->pid.Kd < 0) apid->pid.Kd = 0;// 計算PID輸出apid->output = PID_Compute(&apid->pid, feedback);// 保存當前誤差用于下一次計算apid->last_error = apid->error;return apid->output;
}

代碼說明

  1. 自適應 PID 控制器由一個基礎 PID 控制器和一個參考模型組成。

  2. 參考模型定義了期望的系統響應特性。

  3. 根據參考模型的輸出與實際系統輸出的誤差,調整 PID 參數,使得實際系統的響應盡可能接近參考模型的響應。

  4. 自適應調整律基于模型參考自適應控制理論,通常采用梯度下降法或 Lyapunov 穩定性理論設計。

  5. adaptive_rate是自適應增益,控制參數調整的速度。

八、總結與展望

8.1 PID 控制的優勢與局限

PID 控制作為一種經典的控制算法,具有以下優勢:

  1. 結構簡單:PID 控制器由三個基本環節組成,結構簡單,易于理解和實現(2)。

  2. 魯棒性強:對模型精度要求不高,在一定的參數范圍內都能保持較好的控制性能(11)。

  3. 適用范圍廣:適用于各種線性和部分非線性系統,在工業控制中得到廣泛應用(11)。

  4. 理論成熟:經過多年的研究和應用,PID 控制的理論基礎已經非常成熟,有多種參數整定方法可供選擇(11)。

  5. 實現方便:無論是硬件實現還是軟件實現都相對簡單,對計算資源要求不高(6)。

然而,PID 控制也存在一些局限性:

  1. 參數整定困難:對于復雜系統,PID 參數的整定需要豐富的經驗和技巧,有時需要反復試湊(11)。

  2. 對非線性系統適應性差:對于強非線性系統,固定參數的 PID 控制器難以獲得滿意的控制效果(12)。

  3. 對時變系統適應性差:當系統特性隨時間變化時,固定參數的 PID 控制器性能會下降(47)。

  4. 對復雜多變量系統控制效果不佳:對于多變量、強耦合的系統,單一的 PID 控制器難以實現理想的控制效果(12)。

8.2 PID 控制的發展趨勢

隨著控制理論和計算機技術的發展,PID 控制也在不斷發展和完善,主要發展趨勢包括:

  1. 智能化:將模糊邏輯、神經網絡、遺傳算法等智能計算技術與 PID 控制相結合,形成智能 PID 控制,提高對復雜系統的控制能力(32)。

  2. 自適應化:開發具有在線辨識和參數自調整能力的自適應 PID 控制器,適應系統特性的變化(47)。

  3. 網絡化:基于網絡的 PID 控制技術,實現遠程監控和分布式控制(12)。

  4. 集成化:將 PID 控制與其他先進控制策略(如預測控制、魯棒控制等)集成,形成復合控制策略,提高控制性能(12)。

  5. 參數整定自動化:開發自動整定工具,減少人工干預,提高整定效率和精度(14)。

8.3 實際應用建議

基于本文的分析,針對 PID 控制的實際應用,提出以下建議:

  1. 根據系統特性選擇合適的 PID 類型:對于大滯后系統,選擇位置式 PID;對于快速響應系統,選擇增量式 PID;對于易受干擾的系統,考慮使用抗積分飽和 PID(22)。

  2. 合理選擇參數整定方法:簡單系統可采用手動試湊法;工業過程控制可采用齊格勒 - 尼科爾斯法或科恩 - 庫恩法;復雜系統可采用基于模型的方法或智能優化算法(11)。

  3. 重視抗干擾措施:根據系統特點,采取積分限幅、微分先行、濾波等抗干擾措施,提高控制系統的魯棒性(6)。

  4. 結合先進控制策略:對于復雜系統,考慮將 PID 控制與模糊控制、自適應控制等先進控制策略結合,提高控制性能(32)。

  5. 進行充分的測試和驗證:在實際應用前,對 PID 控制器進行充分的測試和驗證,確保其在各種工況下都能穩定可靠地工作(12)。

  6. 持續優化和調整:隨著系統特性的變化和控制要求的提高,需要持續優化和調整 PID 參數,確保控制性能始終處于最佳狀態(11)。

PID 控制雖然已有幾十年的歷史,但仍然是工業控制中最常用的控制算法之一。隨著控制理論和計算機技術的不斷發展,PID 控制將繼續發揮重要作用,并在新的應用領域展現出強大的生命力。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921304.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921304.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921304.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PCL關鍵點提取

1. 核心概念:什么是關鍵點?為什么需要關鍵點? 關鍵詞:信息冗余、計算效率、突出特征 “想象一下,我們有一片密集的點云,包含幾十萬個點。如果我們直接在每個點上都計算像FPFH這樣的局部特征,計算量會非常大,極其耗時,而且很多點所處的區域(比如平坦的墻面)特征非常…

vcruntime140_1.dll缺失怎么辦?暗黑破壞神游戲vcruntime140_1.dll缺失的4個解決方法

你是否遇到過這樣的情況&#xff1a; 玩《暗黑破壞神》《英雄聯盟》《GTA5》的時候&#xff0c;游戲忽然閃退&#xff0c;彈窗提示&#xff1a; “無法啟動&#xff0c;因為計算機中丟失 vcruntime140_1.dll” 這不是某一個游戲的問題&#xff0c;而是 Windows 系統運行庫缺失…

遷移學習-ResNet

好的&#xff0c;我將為你撰寫一篇關于ResNet遷移學習的技術博客。以下是博客的主要內容&#xff1a;ResNet遷移學習&#xff1a;原理、實踐與效果深度解析1. 深度學習中遷移學習的重要性與ResNet的獨特價值遷移學習&#xff08;Transfer Learning&#xff09;是機器學習中一種…

極大似然估計與概率圖模型:統計建模的黃金組合

在數據驅動的時代&#xff0c;如何從海量信息中提取有價值的規律&#xff1f;統計建模提供了兩大核心工具&#xff1a;極大似然估計&#xff08;MLE&#xff09;幫助我們根據數據推斷模型參數&#xff0c;而概率圖模型&#xff08;PGM&#xff09;則通過圖形化語言描述變量間的…

解析豆科系統發育沖突原因

生命之樹是進化生物學的核心&#xff0c;但由于 不完全譜系排序&#xff08;ILS&#xff09;、雜交 和 多倍化 等復雜過程&#xff0c;解析深層且難解的系統發育關系仍然是一個挑戰。**豆科&#xff08;Leguminosae&#xff09;**這一物種豐富且生態多樣化家族的理解&#xff0…

從Java全棧到前端框架:一次真實的面試對話與技術解析

從Java全棧到前端框架&#xff1a;一次真實的面試對話與技術解析 在一次真實的面試中&#xff0c;一位擁有多年經驗的Java全棧開發工程師&#xff0c;被問及了多個涉及前后端技術棧的問題。他的回答既專業又自然&#xff0c;展現了扎實的技術功底和豐富的實戰經驗。 面試官&…

阿瓦隆 A1566HA 2U 480T礦機參數解析:性能與能效深入分析

在礦機行業&#xff0c;AvaLON是一個備受關注的品牌&#xff0c;尤其在比特幣&#xff08;BTC&#xff09;和比特幣現金&#xff08;BCH&#xff09;挖礦領域&#xff0c;憑借其強勁的算力和高效能效&#xff0c;在市場中占據了一席之地。本文將針對阿瓦隆 A1566HA 2U 480T礦機…

小迪安全v2023學習筆記(七十八講)—— 數據庫安全RedisCouchDBH2database未授權CVE

文章目錄前記服務攻防——第七十八天數據庫安全&Redis&CouchDB&H2database&未授權訪問&CVE漏洞前置知識復現環境服務判斷對象類別利用方法數據庫應用 - Redis-未授權訪問&CVE漏洞前置知識案例演示沙箱繞過RCE - CVE-2022-0543未授權訪問 - CNVD-2019-2…

HTML + CSS 創建圖片倒影的 5 種方法

HTML CSS 創建圖片倒影的 5 種方法 目標&#xff1a;掌握多種生成“圖片倒影 / Reflection”效果的實現思路&#xff0c;理解兼容性、性能差異與最佳實踐&#xff0c;方便在真實業務&#xff08;商品展示、相冊、登陸頁面視覺強化&#xff09;中安全使用。 總覽對比 方法核心…

一個文件被打開io流和不打卡 inode

1. 磁盤 最小基本單位 扇區 機器磁盤的io效率 &#xff08;讀和取&#xff09;2. 文件系統 對磁盤分區 &#xff0c;最小的文件單位塊組&#xff0c;快組內部已經劃分好區域&#xff0c;巴拉巴拉&#xff0c;總之&#xff0c;每次使用數據&#xff0c;以操作系統的處理都是塊級…

ThermoSeek:熱穩定蛋白數據庫

這篇論文提出了ThermoSeek&#xff0c;一個綜合性的網絡資源&#xff0c;用于分析來自嗜熱和嗜冷物種的蛋白質序列和結構。具體來說&#xff0c;數據收集&#xff1a;從美國國家生物技術信息中心&#xff08;NCBI&#xff09;的基因組數據庫中收集了物種的分類ID&#xff0c;并…

leetcode算法刷題的第二十七天

1.leetcode 56.合并區間 題目鏈接 class Solution { public:static bool cmp(const vector<int>& a,const vector<int>& b){return a[0]<b[0];}vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<v…

解決 Apache/WAF SSL 證書鏈不完整導致的 PKIX path building failed 問題

文章目錄解決 Apache/WAF SSL 證書鏈不完整導致的 PKIX path building failed 問題為什么會出現證書鏈錯誤&#xff1f;常見場景直連服務器正常&#xff0c;但經過 WAF 出錯Windows/Linux 下證書文件說明引入 WAF 或其他中間層&#xff1a;解決方法方法一&#xff1a;單獨配置 …

十一、標準化和軟件知識產權基礎知識

1 標準化基礎知識 1.1 基本概念 1.1.1 標準的分類 1.1.1.1 按使用范圍分類 國際標準&#xff1a;由國際組織如 ISO、IEC 制定的標準。國家標準&#xff1a;由國家標準化機構制定的標準&#xff0c;如中國的 GB&#xff0c;美國 ANSI。行業標準&#xff1a;由行業主管部門制定的…

計算機畢設選題:基于Python數據挖掘的高考志愿推薦系統

精彩專欄推薦訂閱&#xff1a;在 下方專欄&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主頁&#xff1a;計算機畢設木哥&#x1f525; &#x1f496; 文章目錄 一、項目介紹二…

什么是PCB工藝邊?獵板給您分享設計要點

什么是PCB工藝邊&#xff1f;獵板給您分享設計要點在PCB設計和制造領域&#xff0c;工藝邊是一個看似簡單卻至關重要的概念&#xff0c;它直接關系到生產流程的順暢性與最終產品的質量。本文將為您詳細解析PCB工藝邊的定義、作用、設計要點&#xff0c;并分享獵板PCB在高精度制…

Rustdesk搭建與客戶端修改與編譯

Rustdesk是一個開源的遠程桌面工具&#xff0c;客戶端可以自己定制修改編譯 這里主要記錄一下搭建的過程 服務端搭建 主要是參考了這篇文章&#xff0c;感覺作者分享~ 在 Linux VPS 上創建 RustDesk 服務器 - 知乎 https://zhuanlan.zhihu.com/p/1922729751656765374 這里主要…

數字人系統源碼搭建與定制化開發:從技術架構到落地實踐

隨著元宇宙、直播電商、智能客服等領域的爆發&#xff0c;數字人從概念走向商業化落地&#xff0c;其定制化需求也從 “單一形象展示” 升級為 “多場景交互能力”。本文將從技術底層出發&#xff0c;拆解數字人系統的源碼搭建邏輯&#xff0c;結合定制化開發中的核心痛點&…

2025國賽C題創新論文+代碼可視化 NIPT 的時點選擇與胎兒的異常判定

2025國賽C題創新論文代碼可視化 NIPT 的時點選擇與胎兒的異常判定基于多通道LED光譜優化的人體節律調節與睡眠質量評估模型摘要無創產前檢測&#xff08;NIPT&#xff09;通過分析孕婦血漿中胎兒游離DNA來篩查染色體異常&#xff0c;其準確性很大程度上依賴于胎兒Y染色體濃度的…

2021/07 JLPT聽力原文 問題一 4番

4番&#xff1a;女の人が新しい商品の紹介をしています。よく頭が痛くなる人は、どの商品を選びますか。女&#xff1a;こちら、新発売の中國茶をご案內します。今回皆様にご紹介いたしますのは、月?星?虹?空のお茶の4種類でございます。さあ、どうぞ召し上がってください。…