PID控制算法理論學習基礎——單級PID控制

這是一篇我在學習PID控制算法的過程中的學習記錄。在一開始學習PID的時候,我也看了市面上許多的資料,好的資料固然有,但是更多的是不知所云。(有的是寫的太過深奧,有的則是照搬挪用,對原理則一問三不知)這一直讓我對PID摸不著頭腦。所以我打算從0開始去一層層學習它,直到自己掌握它的精髓。我不認為我有多聰明,所以相當多的部分我都寫的很詳細,覺得過于冗余的小伙伴可以跳著看。

我并不是計算機科學\電控類專業的學生,所以對知識的理解可能有不到位的地方,還請大家指正。

?最后,希望這篇長文對大家有所幫助,這也是我完成它的目標之一。

1.1 單級PID的原理理解

這里強烈建議還不理解PID基本原理的同學觀看視頻:【自動控制原理】12_PID控制器_Matlab/Simulink仿真【開場三分鐘閑話】_嗶哩嗶哩_bilibili

單級PID也就是只使用一個PID控制塊。一般講到PID,大家都喜歡用調節洗澡水的水溫來舉例:

  • Kp(比例項),即希望調節到的溫度與現在的溫度差的越大,我們擰動加熱旋鈕的幅度就越大,這個差值越小,我們擰動加熱旋鈕的幅度就越小;

  • Ki(積分項),即P比例調節控制了一段時間之后,發現實際值與期望值還是有誤差,那就繼續擰懂加熱旋鈕,這是一個在時間上不斷累積的過程,故為積分項;

  • Kd(微分項),當實際值與期望值的誤差的導數,也就是水溫變化的速度,這一項即控制達到期望值,即控制當前水溫到達目標水溫的速度。

然后將上面三項相加,就得到了基本的PID控制:

即下圖

談談我對于PID控制的一些理解:

  1. 首先面對一個需要PID的控制系統的時候,增大P(比例控制系數)可以使得系統的反應靈敏,但是相應地會無法避免地產生穩態誤差并且單純使用比例控制的系統無法消除這種誤差;

  2. 在得到一個較為靈敏同時擁有較小的穩態誤差的系統時,這時引入I(積分控制項),積分控制可以有效地消除穩態誤差,但是會使得系統達到穩態的時間延長,也是就是出現了震蕩;

  3. 在PI控制完成之后,一般來說對于一些對時間不是很敏感的系統都已經擁有較好的控制表現了,對于時間要求苛刻的系統就需要引入D(微分控制項)來進一步縮短系統達到穩態的時間(減少震蕩);

  4. D項的一個很不友好的特性就是對環境噪聲極其敏感,引入D之后很容易就會使得先前已經穩定的系統突然變混亂起來,所以通常也需要較多的時間類來獲取試驗D的取值。

以上就是一個簡單的PID控制系統的介紹。從實現來看,其實有著兩種不同的實現方式,一種叫位置式PID,另外一種則為增量式PID。其中位置式PID我較少在平衡控制等項目中見過,而增量式PID則大量運用在電機的控制上(驅動平衡類項目),下面來簡單說一下這兩種PID控制的實現。

1.2 單級PID的代碼實現

其中我們知道PID的公式如下:

但是我們會選用下面這個式子來進行實際的工程運用。可以看到除了積分變為累加之外(畢竟現實中數據都是一段一段不是連續的),D(微分項)中的形式變了,這是為了避免一個被稱為“微分沖擊”的現象,具體的原因在系列3中會有提到,這里可以暫時不去管它。

這里使用的是以tank_like模型(即四個電機的角度固定,靠轉動的差速轉彎的小車模型,與之相對的是Car_like模型,前面兩個輪子可以偏轉一定角度轉彎)的四輪小車為例,需要控制其四輪轉動同步(也就是能走直線)。

tank_like模型與Car_like模型:

為了能夠判斷小車每個輪子的轉動方向以及轉動的幅度,需要使用帶有編碼器的電機,或者使用光電門也是同樣的原理。這樣就能獲取到小車每一個輪子的實時速度值,與目標的速度 作差 后就是這個PID系統的輸入。

? 而小車上單片機向電機輸入的PWM波(可以控制小車電機油門),就這個PID系統的輸出。

如下圖:

//位置式PID
//定義所需要的變量
float Kp, Ki, Kd;
float Motor1_speed;//電機當前的速度
float target_speed;//我們需要電機達到的速度
float err_now;//當前速度與電機期望值的差,也就是當前的誤差值
float err_last;//上一次計算的誤差值
float err_Sum;//積分項,將累計時間內所有的誤差值
float output;//經過PID算法后輸出的數據,其實是一個控制PWM占空比的參數,我們只需要直接放在輸出PWM的函數里就好了//PID算法
err_now = target_speed -Motor1_speed;
err_Sum += err_now;
if(err_Sum > x) err_Sum = x;//這里需要設定一個極限值,以防積分變量溢出,其實一般來說并不會達到這個極限值,因為誤差并不都是正數
//沒有對D進行操作
output = Kp * err_now + Ki * err_Sum +Kd * (err_now - err_last);//PID公式
if(output > x) output = x;//這里需要對輸出也進行一個限制,這里倒不是限制溢出,而是PWM輸出的參數本身就有最大值,超過了就無效了。
TIM_SetCompare1(TIMx, output);//對產生PWM的定時器通道一進行輸出
err_last = err_now;//將使用完的當前誤差值賦給上一次的誤差值,進行下一輪循環

增量式PID的原理就是不直接使用每一次PID產生的輸出,而是將兩次PID產生的輸出相減,得到一個PID增量,再使用這個增量對系統進行輸出。與位置式PID不同的地方就在于因為需要使用到前后兩次的PID公式,那么也就需要當前誤差、上一次誤差與上上次的誤差。在得到輸出的增量之后就類似使用積分項一樣直接將時間上的每一次增量相加,得到的結果在TIM_SetCompare1()中輸出就可以,代碼就不贅述了。

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

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

相關文章

【Elasticsearch】function_score與rescore

它們倆都是用來“**干涉評分**”的,但**工作階段不同、性能開銷不同、能做的事也不同**。一句話總結:> **function_score** 在 **第一次算分** 時就動手腳; > **rescore** 在 **拿到 Top-N 結果后** 再“重新打分”。下面把“能干嘛”…

無廣告純凈體驗 WPS2016 精簡版:移除聯網模塊 + 非核心組件,古董電腦也能跑

各位辦公小能手們!今天給你們介紹一款超神的辦公軟件——WPS2016精簡版!它有多小呢?才33MB,簡直就是軟件界的小不點兒!別看它個頭小,功能可一點兒都不含糊,文字、表格、演示這三大功能它全都有。…

《PyWin32:Python與Windows的橋梁,解鎖系統自動化新姿勢》

什么是 PyWin32在 Windows 平臺的 Python 開發領域中,PyWin32 是一個舉足輕重的庫,它為 Python 開發者打開了一扇直接通往 Windows 操作系統底層功能的大門。簡單來說,PyWin32 是用于 Python 訪問 Windows API(Application Progra…

vite如何生成gzip,并在服務器上如何設置開啟

1. 安裝插件npm install vite-plugin-compression -D2. 在 vite.config.ts 中配置TypeScriptimport { defineConfig } from vite import compression from vite-plugin-compressionexport default defineConfig({plugins: [compression({algorithm: gzip,ext: .gz,threshold: 1…

1068萬預算!中國足協大模型項目招標,用AI技術驅動足球革命

中國足協啟動國際足聯“前進計劃”下的大數據模型項目,預算1068萬元。該項目將建立足球大數據分析平臺,利用AI技術為國家隊、青少年足球、業余球員及教練員裁判員提供精準數據分析服務,旨在通過科技手段提升中國足球競技水平。 中國足球迎來數…

AI產品經理面試寶典第12天:AI產品經理的思維與轉型路徑面試題與答法

多樣化思維:如何跳出單一框架解題? 面試官:AI產品常面臨復雜場景,請舉例說明你如何運用多樣化思維解決問題? 你的回答:我會從三個維度展開:多角度拆解需求本質,多層級融合思維模式,多變量尋找最優解。比如設計兒童教育機器人時,不僅考慮功能實現(技術層),還融入情…

vscode.window對象講解

一、vscode.window 核心架構圖 #mermaid-svg-fyCxPz1vVhkf96nE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-fyCxPz1vVhkf96nE .error-icon{fill:#552222;}#mermaid-svg-fyCxPz1vVhkf96nE .error-text{fill:#5522…

為什么一個 @Transactional 注解就能開啟事務?揭秘 Spring AOP 的底層魔法

你是否也曾深陷在各種“額外”邏輯的泥潭,為了給一個核心業務方法增加日志、權限校驗或緩存,而不得不將這些非核心代碼硬塞進業務類中,導致代碼臃腫、職責不清?是時候用代理設計模式 (Proxy Design Pattern) 來解脫了!…

《Spring 中上下文傳遞的那些事兒》Part 8:構建統一上下文框架設計與實現(實戰篇)

📝 Part 8:構建統一上下文框架設計與實現(實戰篇) 在實際項目中,我們往往需要處理多種上下文來源,例如: Web 請求上下文(RequestContextHolder)日志追蹤上下文&#xf…

配置驅動開發:初探零代碼構建嵌入式軟件配置工具

前言在嵌入式軟件開發中,硬件初始化與寄存器配置長期依賴人工編寫重復代碼。以STM32外設初始化為例,開發者需手動完成時鐘使能、引腳模式設置、參數配置等步驟,不僅耗時易錯(如位掩碼寫反、模式枚舉值混淆)&#xff0c…

Elasticsearch混合搜索深度解析(下):執行機制與完整流程

引言 在上篇中,我們發現了KNN結果通過SubSearch機制被保留的關鍵事實。本篇將繼續深入分析混合搜索的執行機制,揭示完整的處理流程,并解答之前的所有疑惑。 深入源碼分析 1. SubSearch的執行機制 1.1 KnnScoreDocQueryBuilder的實現 KNN結果被…

Apache HTTP Server 從安裝到配置

一、Apache 是什么?Apache(全稱 Apache HTTP Server)是當前最流行的開源Web服務器軟件之一,由Apache軟件基金會維護。它以穩定性高、模塊化設計和靈活的配置著稱,支持Linux、Windows等多平臺,是搭建個人博客…

php中調用對象的方法可以使用array($object, ‘methodName‘)?

是的,在PHP中,array($object, methodName) 是一種標準的回調語法,用于表示“調用某個對象的特定方法”。這種語法可以被許多函數(如 call_user_func()、call_user_func_array()、usort() 等)識別并執行。 語法原理 在P…

【設計模式】單例模式 餓漢式單例與懶漢式單例

單例模式(Singleton Pattern)詳解一、單例模式簡介 單例模式(Singleton Pattern) 是一種 創建型設計模式,它確保一個類只有一個實例,并提供一個全局訪問點來獲取這個實例。(對象創建型模式&…

vue3 el-table 行數據沾滿格自動換行

在使用 Vue 3 結合 Element Plus 的 <el-table> 組件時&#xff0c;如果你希望當表格中的行數據文本過長時能夠自動換行&#xff0c;而不是溢出到其他單元格或簡單地截斷&#xff0c;你可以通過以下幾種方式來實現&#xff1a;方法 1&#xff1a;使用 CSS最簡單的方法是通…

windows電腦遠程win系統服務器上的wsl2

情況 我自己使用win11筆記本電腦&#xff0c;想要遠程win11服務器上的wsl2 我這里只有服務器安裝了wsl2&#xff0c;win11筆記本沒有安裝 因此下面提到的Ubuntu終端指的是win服務器上的wsl2終端 一定要區分是在哪里輸入命令&#xff01;&#xff01; 安裝SSH 在服務器上&#x…

神經輻射場 (NeRF):重構三維世界的AI新視角

神經輻射場 (NeRF)&#xff1a;重構三維世界的AI新視角 舊金山蜿蜒起伏的街道上&#xff0c;一輛裝備12個攝像頭的Waymo自動駕駛測試車緩緩駛過。它記錄的280萬張街景圖像并未被簡單地拼接成平面地圖&#xff0c;而是被輸入一個名為Block-NeRF的神經網絡。數周后&#xff0c;一…

Kubernetes自動擴縮容方案對比與實踐指南

Kubernetes自動擴縮容方案對比與實踐指南 隨著微服務架構和容器化的廣泛采用&#xff0c;Kubernetes 自動擴縮容&#xff08;Autoscaling&#xff09;成為保障生產環境性能穩定與資源高效利用的關鍵技術。面對水平 Pod 擴縮容、垂直資源調整、集群節點擴縮容以及事件驅動擴縮容…

【CVPR2025】計算機視覺|SIREN: 元學習賦能!突破INR高分辨率圖像分類難題

論文地址&#xff1a;https://arxiv.org/pdf/2503.18123v1 代碼地址&#xff1a;https://github.com/SanderGielisse/MWT 關注UP CV縫合怪&#xff0c;分享最計算機視覺新即插即用模塊&#xff0c;并提供配套的論文資料與代碼。 https://space.bilibili.com/473764881 摘要 …

牛客周賽 Round 99

賽時成績如下&#xff1a;A. Round 99題目描述 對于給定的五位整數&#xff0c;檢查其中是否含有數字 99&#xff1b;換句話說&#xff0c;檢查是否存在相鄰的兩個數位&#xff0c;其值均為 。解題思路&#xff1a; 檢查相鄰的兩個數字是否均為9#include <bits/stdc.h> u…