萬物皆可PID:深入理解控制算法在OpenBMC風扇調速中的應用

引言:智能散熱,不僅僅是“開”和“關”

想象一下服務器中的風扇管理。最簡單的策略是“bang-bang”控制(雙位控制):溫度超過閾值,風扇全速運轉;溫度低于閾值,風扇低速或停止。這種策略簡單粗暴,但會導致風扇轉速頻繁突變,噪音大,且功耗不優。

現代數據中心對能效和噪音的要求極高,我們需要更精細、更平滑的控制策略。這就是 PID 控制算法 大顯身手的舞臺。而 OpenBMC,作為服務器的智能管理大腦,正是實現這種高級控制策略的完美平臺。

本篇博客將深入剖析 PID 的原理,并詳細講解如何在 OpenBMC 中實現一個高效、穩定的風扇調速系統。

第一部分:PID 是什么?—— 直觀理解

PID 是 Proportional(比例)、Integral(積分)、Derivative(微分)的縮寫,是一種經典且應用極其廣泛的反饋控制算法。

它的核心思想非常直觀:根據當前的誤差(目標值與實際值的差)、誤差的積累(歷史)以及誤差的變化趨勢(未來),綜合計算出一個控制輸出,使系統達到并穩定在目標狀態。

讓我們用一個比喻來理解:

你正在用熱水龍頭調節淋浴的水溫。

  • P(比例): 水太冷了,你會猛地開大熱水(誤差大,動作就大)。水接近理想溫度時,你會微微調節(誤差小,動作就小)。這是對當前狀態的即時反應。
  • I(積分): 你發現即使比例調節了,水溫還是長期比目標低一點(靜態誤差)。于是你持續地、慢慢地把熱水再開大一點,直到誤差消除。這是對歷史誤差的糾正。
  • D(微分): 你突然感覺到水流變燙了(溫度正在快速升高!)。你會下意識地猛地回調熱水龍頭,以抑制這個過快的上升趨勢,防止燙傷。這是對未來變化的預測和抑制。

PID 控制器就是將這三部分的動作科學地結合起來。

第二部分:PID 的數學本質與離散化

1. 連續時間域的公式

經典的 PID 公式如下:

u(t)=Kpe(t)+Ki∫0te(τ)dτ+Kdde(t)dt u(t) = K_p e(t) + K_i \int_{0}^{t} e(\tau) d\tau + K_d \frac{de(t)}{dt} u(t)=Kp?e(t)+Ki?0t?e(τ)dτ+Kd?dtde(t)?

其中:

  • $ u(t) $ : 控制器的輸出(例如,發送給風扇的 PWM 占空比)。
  • $ e(t) $ : 誤差,$ e(t) = setpoint - current_value $ (例如,目標溫度 - 當前溫度)。
  • $ K_p $ : 比例增益系數。
  • $ K_i $ : 積分增益系數。
  • $ K_d $ : 微分增益系數。
2. 離散化(如何在 OpenBMC 中實現)

計算機系統是離散的,OpenBMC 中的控制循環每隔 Δt\Delta tΔt 時間(如 5 秒)執行一次。我們需要將連續公式離散化:

un=Kpen+Ki∑i=0neiΔt+Kden?en?1Δt u_n = K_p e_n + K_i \sum_{i=0}^{n} e_i \Delta t + K_d \frac{e_n - e_{n-1}}{\Delta t} un?=Kp?en?+Ki?i=0n?ei?Δt+Kd?Δten??en?1??

其中 $ n $ 表示第 $ n $ 個采樣時刻。

這個公式是編寫代碼的基礎。在實際編程中,我們通常會做一些變換和優化,例如避免積分項一直累加(積分飽和問題)。

第三部分:OpenBMC 中的 PID 實戰開發流程

OpenBMC 中通常使用 PID 控制器Zone 的概念來管理散熱。一個 Zone 代表一個散熱區域,包含多個傳感器和多個風扇。

步驟一:系統建模與參數整定

這是最難也是最關鍵的一步。你需要為你的服務器系統找到合適的 $ K_p $, $ K_i $, $ K_d $ 參數。

  1. 理論分析: 了解你的系統特性(延遲、慣性等)。風扇調速系統通常有一定延遲和慣性。
  2. 經驗法(試湊法): 著名的 Ziegler-Nichols 方法。
    • 先將 $ K_i $ 和 $ K_d $ 設為 0。
    • 逐漸增大 $ K_p $,直到系統開始出現等幅振蕩(風扇轉速在目標值附近有規律地波動)。記下此時的臨界增益 $ K_u $ 和振蕩周期 $ T_u $。
    • 根據 Z-N 規則表設置參數:
      控制器類型$ K_p $$ K_i $$ K_d $
      P$ 0.5 K_u $--
      PI$ 0.45 K_u $$ 1.2 K_p / T_u $-
      PID$ 0.6 K_u $$ 2 K_p / T_u $$ K_p T_u / 8 $
  3. 仿真與測試: 在安全的環境下(如實驗室)進行參數測試,觀察系統的響應速度、超調量和穩定性。
步驟二:OpenBMC 代碼實現

OpenBMC 的風扇控制邏輯通常位于 phosphor-pid-control 倉庫或相關的應用程序中。以下是一個高度簡化的代碼邏輯示例,演示了核心思想。

1. 定義 PID 控制器類 (pid.cpp/pid.hpp)

// pid.hpp
#pragma onceclass PIDController {
public:PIDController(double kp, double ki, double kd, double dt, double minOut, double maxOut);double calculate(double setpoint, double pv);private:double kp_, ki_, kd_, dt_;double minOutput_, maxOutput_; // 輸出限幅,例如PWM范圍是0-100%double integral_ = 0;double prevError_ = 0;bool firstIteration_ = true;
};
// pid.cpp
#include "pid.hpp"
#include <algorithm>PIDController::PIDController(double kp, double ki, double kd, double dt, double minOut, double maxOut): kp_(kp), ki_(ki), kd_(kd), dt_(dt), minOutput_(minOut), maxOutput_(maxOut) {}double PIDController::calculate(double setpoint, double pv) {double error = setpoint - pv;// 比例項double proportional = kp_ * error;// 積分項 (防止首次運行微分項計算錯誤)integral_ += error * dt_;// 積分抗飽和:如果輸出已經限幅,則停止積分累積double integralTerm = ki_ * integral_;// 簡單的積分限幅// integral_ = std::clamp(integral_, minOutput_ / ki_, maxOutput_ / ki_);// 微分項double derivative = 0;if (!firstIteration_) {derivative = kd_ * (error - prevError_) / dt_;} else {firstIteration_ = false;}prevError_ = error;// 計算總輸出double output = proportional + integralTerm + derivative;// 輸出限幅output = std::clamp(output, minOutput_, maxOutput_);return output;
}

2. 集成到風扇控制服務中

這通常是一個運行在 BMC 上的守護進程(Daemon),它會循環執行以下邏輯:

// 偽代碼,基于phosphor-pid-control的結構
int main() {// 1. 從配置文件中讀取參數(目標溫度、PID參數、傳感器和風扇映射關系)auto config = loadConfig("/etc/pid/zone0.config");// 2. 為每個散熱區域(Zone)創建一個PID控制器PIDController pid(config.kp, config.ki, config.kd, config.interval, 0, 100); // PWM 0-100%while (true) {// 3. 讀取當前溫度(過程變量PV)// 通常是讀取一個Zone內所有傳感器的最大值或加權平均值double currentTemp = readMaxSensorTemperature(config.sensors);// 4. 計算需要的風扇轉速(PWM值)double outputPwm = pid.calculate(config.setpoint, currentTemp);// 5. 將輸出應用到所有關聯的風扇setFanPwm(config.fans, outputPwm);// 6. 等待下一個控制周期sleep(config.interval);}
}
步驟三:高級特性與優化

一個工業級的 PID 實現還會包含許多優化:

  1. 積分抗飽和 (Anti-windup): 當輸出因為限幅而無法再增大時,應停止積分項的累積,防止系統“飽和”后恢復過慢。上面的代碼提供了一個簡單的思路。
  2. 微分先行 (Derivative on Measurement): 只對過程變量 (PV) 進行微分,而不是對誤差 (e) 微分。這可以在目標值 (Setpoint) 突變時,避免微分項的劇烈沖擊。
  3. 平滑濾波: 對傳感器讀數進行濾波(如移動平均),防止噪聲干擾導致微分項計算混亂,造成輸出震蕩。
  4. 分檔/曲線控制: 并非所有情況都需要 PID。OpenBMC 通常支持配置多個溫度檔位(table),例如:
    • Temp < 50°C -> PWM = 20%
    • 50°C < Temp < 70°C -> 啟用 PID 控制,目標值 65°C
    • Temp > 90°C -> PWM = 100% (緊急全速冷卻)
  5. 配置文件: 使用 JSON 或其他格式的配置文件,方便不同服務器機型靈活配置參數,而無需重新編譯代碼。
// /etc/pid/zone0.config 示例
{"zone": "zone0","setpoint": 65.0,"kp": 0.8,"ki": 0.05,"kd": 0.1,"interval": 5,"sensors": ["/xyz/openbmc_project/sensors/temp/CPU0", "/xyz/openbmc_project/sensors/temp/CPU1"],"fans": ["fan0", "fan1", "fan2"],"min_pwm": 20,"max_pwm": 100
}

第四部分:調試與監控

在 OpenBMC 中,調試 PID 系統非常方便:

  1. 日志: 控制循環的每一次計算都可以輸出調試日志,記錄 error, P, I, D, output 的值。
  2. Redfish/IPMI: 通過標準的管理接口實時查詢風扇轉速、溫度、PWM 值。
  3. 繪圖: 將日志數據導出并用 Python (Matplotlib) 或 Excel 繪制成曲線圖,直觀地觀察系統的動態響應過程,這是調整 PID 參數的利器。

總結

PID 控制器是 OpenBMC 智能散熱管理的“心臟”。它將簡單的風扇開關控制,升級為一個動態、平滑、高效的自動化系統。

核心流程回顧:

  1. 理解原理: 掌握 P、I、D 三個分量的物理意義和數學表達。
  2. 參數整定: 為你的特定服務器平臺找到最佳的 $ K_p $, $ K_i $, $ K_d $ 參數。
  3. 代碼實現: 在 OpenBMC 的守護進程中實現離散化的 PID 算法,并集成傳感器和風扇控制接口。
  4. 優化加固: 加入抗飽和、濾波等機制,確保工業級可靠性。
  5. 調試驗證: 通過日志和繪圖工具不斷迭代優化,最終實現一個響應迅速、穩定安靜、節能高效的散熱系統。

通過駕馭 PID 算法,你可以讓 OpenBMC 真正發揮出硬件平臺的最大潛力,在保障設備安全的前提下,為用戶帶來極致的能效和體驗。

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

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

相關文章

CH347應用 USB轉I2C功能之:開源項目i2c-tools工具的使用(2)

目錄前言開源地址使用說明i2cdetecti2cdumpi2cset前言 上一篇博客中介紹了CH347配合i2c-tools在Linux下的使用&#xff0c;但我們能不能在Windows中也是用i2c-tools進行I2C設備的調試呢。這里我將i2cdetect、i2cdump、i2cset三個常用的工具移植至Windows平臺&#xff0c;并進行…

代碼隨想錄算法訓練營第50天 | 圖論理論基礎、深搜理論基礎、98. 所有可達路徑、廣搜理論基礎

圖論理論基礎 題目鏈接/文章講解&#xff1a;https://www.programmercarl.com/kamacoder/%E5%9B%BE%E8%AE%BA%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 了解圖的基本概念&#xff0c;連通性&#xff0c;圖的構造&#xff0c;圖的遍歷方式 深搜理論基礎 題目鏈接/文章講解&…

華為HCIE-云計算培訓課程有哪些?

華為HCIE云計算認證是華為公司推出的高級別認證&#xff0c;對于想要在云計算領域發展&#xff0c;提高專業技能和競爭力的人來說具備極高的價值。接下里就來聊聊華為HCIE云計算的培訓課程都有哪些&#xff1f;如何高效備考呢&#xff1f;一&#xff0c;HCIE云計算培訓課程1、理…

DCS控制回路優化:基于WebSocket的實時參數遠程調校方法論

說起來&#xff0c;我前段時間剛啃完一個化工廠DCS控制回路優化的硬骨頭&#xff0c;用WebSocket搞成了實時參數遠程調校&#xff0c;現在回想起來&#xff0c;滿是能跟大家嘮的實操經驗&#xff0c;說不定你們以后碰到類似情況&#xff0c;能少走些冤枉路。先跟大家交代下背景…

《JVM如何排查OOM》

目錄 一、什么是OOM&#xff1f; 二、OOM排查的整體思路 三、OOM排查工具大全 四、實戰&#xff1a;不同OOM場景的排查方法 場景1&#xff1a;Java heap space 場景2&#xff1a;Metaspace 場景3&#xff1a;GC overhead limit exceeded 五、高級排查技巧 1. 使用Arth…

ubuntu22.04 安裝Docker

一、更新系統包索引sudo apt update && sudo apt upgrade -y二、安裝必要依賴安裝 curl、gnupg等工具&#xff0c;用于添加 Docker 官方 GPG 密鑰和倉庫&#xff1a;sudo apt install -y ca-certificates curl gnupg三、添加 Docker 官方 GPG 密鑰sudo install -m 0755…

高低壓隔離器的技術演進與行業賦能

電力電子系統的安全架構與效率升級&#xff0c;始終依賴高低壓電路間的可靠隔離。高低壓隔離器作為能量傳輸與信號控制的核心媒介&#xff0c;通過持續迭代的絕緣技術與結構創新&#xff0c;為新能源裝備、工業驅動系統提供底層安全屏障。其阻斷電位差傳導、抑制電磁干擾的能力…

嵌入式 - ARM5

一、led點燈代碼優化1. 配置寄存器volatile1.??禁止優化??不對該變量的讀寫操作進行任何優化&#xff08;如刪除“冗余”讀取或延遲寫入&#xff09;。2.??強制內存訪問??每次訪問該變量時&#xff0c;必須直接從內存&#xff08;或硬件寄存器&#xff09;中讀取或寫入…

SSH登錄管理

兩種配置方法-密碼 -密鑰&#xff08;免密&#xff09;ansible 默認 rhel9 禁止 root 用密碼登陸&#xff0c;不禁止用密鑰登陸 ---修改方式----vim /etc/ssh/sshd_config 修改此文件#PermitRootLogin prohibit-passwordPermitRootLogin yes 改為允許systemctl res…

遠程連接--向日葵

下載安裝卸載 向日葵語言設置 點擊下面的圖標,點擊"設置": 問題解決 向日葵被連接之后自動黑屏 取消下面的勾選框: 向日葵連接之后黑屏 檢查系統的協議: echo $XDG_SESSION_TYPE 如果是: wayland 需要切換為x11. 設置永久默認使用 X11: sudo vi /etc/gdm3/custom…

Liunx執行source /etc/profile 報錯, -bash: HISTTIMEFORMAT: readonly variable

今天在配置java環境變量時&#xff0c;執行source /etc/profile報錯&#xff0c;系統是統信OS&#xff0c;花了好長時間才解決&#xff0c;在這記錄一下&#xff0c;希望能幫助到大家問題截圖提示HISTTIMEFORMAT和PROMPT_COMMAND變量時只讀變量&#xff0c;不能設置屬性值解決辦…

什么是達林頓管?

簡單來說&#xff0c;達林頓管是一個“電流放大器中的大力士”。它的核心目的是用非常小的輸入電流&#xff08;基極電流&#xff09;去控制一個非常大的輸出電流&#xff08;集電極電流&#xff09;。達林頓管是由兩個三極管串聯而成&#xff0c;放大倍數是兩個三極管的放大倍…

嵌入式Linux學習_rk3588移植無線網卡驅動

記錄移植無線網卡驅動遇到的各種問題&#xff1a; 從官網上下載8821的驅動源碼復制一份上面的CONFIG_PLATFORM_ARM_RK2818&#xff0c;改成3588&#xff0c;然后選項改成y&#xff0c;并把autodetect關掉。 找到CONFIG_PLATFORM_ARM_RK2818&#xff0c;復制一份&#xff0c;改成…

MCP專題五、MCP 的未來趨勢與展望

MCP專題五:MCP 的未來趨勢與展望 5.1 引言 本專題前四章我們系統性地學習了 MCP(Model Context Protocol)的 發展背景、核心機制、Python 實戰方法以及典型應用場景。可以看到,MCP 并不僅僅是一個技術標準,它更像是 大模型與外部世界溝通的橋梁,推動了 AI 應用從“實驗…

C++ Dijkstra堆優化算法

時間復雜度為&#xff1a;O((nm)logn)算法特點&#xff1a;非負邊權、單源最短路、頂點數、邊數<1000000&#xff0c;數據結構前置&#xff1a;領接表、哈希表、二叉堆算法&#xff1a;第一步&#xff0c;建圖&#xff0c;任何算法我們都要去思考&#xff0c;用什么數據結構…

網頁設計作業02

<!DOCTYPE html> <html> <head><meta charset"utf-8"/><title>網頁設計作業</title> </head> <body><h2>問卷調查</h2><p><strong>1、你是通過什么途徑來到綠葉學習網的&#xff1f;</s…

每日算法題推送-->今日專題——雙指針法

題目1&#xff1a;https://leetcode.cn/problems/move-zeroes 小編剛看到這道題的時候&#xff0c;想到的第一個方法就是建立一個與原數組等大的新的數組&#xff0c;然后遍歷原數組&#xff0c;如果遇到元素值不為0的元素&#xff0c;就將這個元素放到新數組中&#xff0c;直到…

告別單次對話:上下文工程如何重塑AI應用架構

1. 前言人工智能應用開發領域正在經歷一場靜悄悄的變革。去年此時&#xff0c;提示工程&#xff08;Prompt Engineering&#xff09;還是各大技術論壇的熱門話題&#xff0c;開發者們熱衷于分享各種精心設計的提示詞模板&#xff0c;試圖通過單次交互獲得理想的大模型輸出。然而…

PM2 管理后端(設置項目自啟動)

查看pm2管理pm2 list ┌────┬──────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──…

CCN中商再獲三項知識產權,為數字化服務添動能

上海中商網絡股份有限公司&#xff08;CCN中商&#xff09;依托持續的研發投入與深厚的技術積淀&#xff0c;在知識產權領域再獲重要突破——成功收獲三項知識產權&#xff0c;囊括實用新型專利《一種3D霓彩智感雙條光柱印刷用全自動生產線》、發明專利《一種一物一碼關聯系統及…