日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言实现PID算法:位置式PID和增量式PID

發布時間:2025/6/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现PID算法:位置式PID和增量式PID 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原創者微信公眾號

PID算法可以說是在自動控制原理中比較經典的一套算法,在現實生活中應用的比較廣泛。

大學參加過電子競賽的朋友都應該玩過電機(或者說循跡小車),我們要控制電機按照設定的速度運轉,PID控制在其中起到了關鍵的作用。

說來慚愧,大學這門課程學的不咋滴,老師講的課基本沒聽進去過。直到后面接觸競賽,算是對PID有了很基礎的一點點認識,直到現在工作實際應用的比較廣泛才知道它的重要性。所以,這里特地回顧一下。

Ⅰ什么是PID

PID,即比例Proportion、積分Integral和微分Derivative三個單詞的縮寫。

閉環自動控制技術是基于反饋的概念以減少不確定性,在閉環自動控制原理中,我們把它叫做“PID控制器”,拿控制電機來說,參考下面模型:

下面引用一段網上經典的話:

在工業應用中PID及其衍生算法是應用最廣泛的算法之一,是當之無愧的萬能算法,如果能夠熟練掌握PID算法的設計與實現過程,對于一般的研發人員來講,應該是足夠應對一般研發問題了,而難能可貴的是,在我所接觸的控制算法當中,PID控制算法又是最簡單,最能體現反饋思想的控制算法,可謂經典中的經典。經典的未必是復雜的,經典的東西常常是簡單的,而且是最簡單的,想想牛頓的力學三大定律吧,想想愛因斯坦的質能方程吧,何等的簡單!簡單的不是原始的,簡單的也不是落后的,簡單到了美的程度。

ⅡPID原理

常規的模擬 PID 控制系統原理框圖如下:

該系統由模擬 PID 控制器和被控對象組成。

上面框圖中, r(t) 是給定值, y(t) 是系統的實際輸出值,給定值與實際輸出值構成控制偏差e(t) = r(t) ? y(t).

e(t)?作為 PID 控制的輸入,?u(t)作為 PID 控制器的輸出和被控對象的輸入。 所以模擬 PID 控制器的控制規律為:

三個重要的參數

Kp:控制器的比例系數.

Ti:控制器的積分時間,也稱積分系數.

Td:控制器的微分時間,也稱微分系數.

1、P - 比例部分

比例環節的作用是對偏差瞬間作出反應。偏差一旦產生控制器立即產生控制作用, 使控制量向減少偏差的方向變化。 控制作用的強弱取決于比例系數Kp, 比例系數Kp越大,控制作用越強, 則過渡過程越快, 控制過程的靜態偏差也就越小; 但是Kp越大,也越容易產生振蕩, 破壞系統的穩定性。 故而, 比例系數Kp選擇必須恰當, 才能過渡時間少, 靜差小而又穩定的效果。

2、I? - 積分部分

從積分部分的數學表達式可以知道, 只要存在偏差, 則它的控制作用就不斷的增加; 只有在偏差e(t)=0時, 它的積分才能是一個常數,控制作用才是一個不會增加的常數。 可見,積分部分可以消除系統的偏差。

積分環節的調節作用雖然會消除靜態誤差,但也會降低系統的響應速度,增加系統的超調量。積分常數Ti越大,積分的積累作用越弱,這時系統在過渡時不會產生振蕩; 但是增大積分常數Ti會減慢靜態誤差的消除過程,消除偏差所需的時間也較長, 但可以減少超調量,提高系統的穩定性。

當 Ti 較小時, 則積分的作用較強,這時系統過渡時間中有可能產生振蕩,不過消除偏差所需的時間較短。所以必須根據實際控制的具體要求來確定Ti 。

3、D - 微分部分

實際的控制系統除了希望消除靜態誤差外,還要求加快調節過程。在偏差出現的瞬間,或在偏差變化的瞬間, 不但要對偏差量做出立即響應(比例環節的作用), 而且要根據偏差的變化趨勢預先給出適當的糾正。為了實現這一作用,可在 PI 控制器的基礎上加入微分環節,形成 PID 控制器。

微分環節的作用使阻止偏差的變化。它是根據偏差的變化趨勢(變化速度)進行控制。偏差變化的越快,微分控制器的輸出就越大,并能在偏差值變大之前進行修正。微分作用的引入, 將有助于減小超調量, 克服振蕩, 使系統趨于穩定, 特別對髙階系統非常有利, 它加快了系統的跟蹤速度。但微分的作用對輸入信號的噪聲很敏感,對那些噪聲較大的系統一般不用微分, 或在微分起作用之前先對輸入信號進行濾波。

ⅢPID算法代碼

?PID 控制算法可以分為位置式 PID?和增量式 PID?控制算法。

兩者的區別:

(1)位置式PID控制的輸出與整個過去的狀態有關,用到了誤差的累加值;而增量式PID的輸出只與當前拍和前兩拍的誤差有關,因此位置式PID控制的累積誤差相對更大;

(2)增量式PID控制輸出的是控制量增量,并無積分作用,因此該方法適用于執行機構帶積分部件的對象,如步進電機等,而位置式PID適用于執行機構不帶積分部件的對象,如電液伺服閥。

(3)由于增量式PID輸出的是控制量增量,如果計算機出現故障,誤動作影響較小,而執行機構本身有記憶功能,可仍保持原位,不會嚴重影響系統的工作,而位置式的輸出直接對應對象的輸出,因此對系統影響較大。

下面給出公式直接體現的C語言源代碼(請結合項目修改源代碼):

1.位置式PID

typedef struct {float Kp; ? ? ? ? ? ? ? ? ? ? ? //比例系數Proportionalfloat Ki; ? ? ? ? ? ? ? ? ? ? ? //積分系數Integralfloat Kd; ? ? ? ? ? ? ? ? ? ? ? //微分系數Derivativefloat Ek; ? ? ? ? ? ? ? ? ? ? ? //當前誤差float Ek1; ? ? ? ? ? ? ? ? ? ? ?//前一次誤差 e(k-1)float Ek2; ? ? ? ? ? ? ? ? ? ? ?//再前一次誤差 e(k-2)float LocSum; ? ? ? ? ? ? ? ? ? //累計積分位置 }PID_LocTypeDef;/************************************************ 函數名稱 : PID_Loc 功 ? ?能 : PID位置(Location)計算 參 ? ?數 : SetValue ------ 設置值(期望值)ActualValue --- 實際值(反饋值)PID ----------- PID數據結構 返 回 值 : PIDLoc -------- PID位置 作 ? ?者 : strongerHuang *************************************************/ float PID_Loc(float SetValue, float ActualValue, PID_LocTypeDef *PID) {float PIDLoc; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//位置PID->Ek = SetValue - ActualValue;PID->LocSum += PID->Ek; ? ? ? ? ? ? ? ? ? ? ? ? //累計誤差PIDLoc = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd * (PID->Ek1 - PID->Ek);PID->Ek1 = PID->Ek; ?return PIDLoc; }

2.增量式PID

typedef struct {float Kp; ? ? ? ? ? ? ? ? ? ? ? //比例系數Proportionalfloat Ki; ? ? ? ? ? ? ? ? ? ? ? //積分系數Integralfloat Kd; ? ? ? ? ? ? ? ? ? ? ? //微分系數Derivativefloat Ek; ? ? ? ? ? ? ? ? ? ? ? //當前誤差float Ek1; ? ? ? ? ? ? ? ? ? ? ?//前一次誤差 e(k-1)float Ek2; ? ? ? ? ? ? ? ? ? ? ?//再前一次誤差 e(k-2) }PID_IncTypeDef;/************************************************ 函數名稱 : PID_Inc 功 ? ?能 : PID增量(Increment)計算 參 ? ?數 : SetValue ------ 設置值(期望值)ActualValue --- 實際值(反饋值)PID ----------- PID數據結構 返 回 值 : PIDInc -------- 本次PID增量(+/-) 作 ? ?者 : strongerHuang *************************************************/ float PID_Inc(float SetValue, float ActualValue, PID_IncTypeDef *PID) {float PIDInc; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//增量PID->Ek = SetValue - ActualValue;PIDInc = (PID->Kp * PID->Ek) - (PID->Ki * PID->Ek1) + (PID->Kd * PID->Ek2);PID->Ek2 = PID->Ek1;PID->Ek1 = PID->Ek; ?return PIDInc; }

總結

以上是生活随笔為你收集整理的C语言实现PID算法:位置式PID和增量式PID的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。