(轉)安富萊stm32 pid介紹以例子
第15章 ControllerFunctions的使用(PID控制)
本期教程主要講解控制函式中PID部分,PID的應用十分廣泛,希望初學的同學認真學習這部分知識。
15.1 PID介紹
15.2 PID形象解釋
15.3 CMSIS的PID庫
15.4 浮點數PID庫
15.5 定點數Q31格式PID庫
15.6 定點數Q15格式PID庫
15.7
15.8 總結
15.1 PID介紹
當今的自動控制技術都是基於反饋的概念。反饋理論的要素包括三個部分:測量、比較和執行。測量關心的變數,與期望值相比較,用這個偏差糾正調節控制系統的響應。
15.1.1 概述
這個理論和應用的關鍵是,做出正確的測量和比較後,如何才能更好地糾正系統。
PID(比例(proportion)、積分(integration)、微分(differentiation))控制器作為最早實用化的控制器已有近百年曆史,現在仍然是應用最廣泛的工業控制器。
PID控制器由比例單元(P)、積分單元(I)和微分單元(D)組成。其輸入e (t)與輸出u (t)的關係為
u(t)=kp[e(t)+1/TI∫e(t)dt+TD*de(t)/dt] 式中積分的上下限分別是0和t
因此它的傳遞函式為:G(s)=U(s)/E(s)=kp[1+1/(TI*s)+TD*s]
其中kp為比例係數; TI為積分時間常數; TD為微分時間常數
15.1.2 基本用途
它由於用途廣泛、使用靈活,已有系列化產品,使用中只需設定三個引數(Kp, Ti和Td)即可。在很多情況下,並不一定需要全部三個單元,可以取其中的一到兩個單元,但比例控制單元是必不可少的。
首先,PID應用範圍廣。雖然很多工業過程是非線性或時變的,但通過對其簡化可以變成基本線性和動態特性不隨時間變化的系統,這樣PID就可控制了。
其次,PID引數較易整定。也就是,PID引數Kp,Ti和Td可以根據過程的動態特性及時整定。如果過程的動態特性變化,例如可能由負載的變化引起系統動態特性變化,PID引數就可以重新整定。
第三,PID控制器在實踐中也不斷的得到改進,下面兩個改進的例子。
在工廠,總是能看到許多回路都處於手動狀態,原因是很難讓過程在“自動”模式下平穩工作。由於這些不足,採用PID的工業控制系統總是受產品質量、安全、產量和能源浪費等問題的困擾。PID引數自整定就是為了處理PID引數整定這個問題而產生的。現在,自動整定或自身整定的PID控制器已是商業單迴路控制器和分散控制系統的一個標準。
在一些情況下針對特定的系統設計的PID控制器控制得很好,但它們仍存在一些問題需要解決:
如果自整定要以模型為基礎,為了PID引數的重新整定線上尋找和保持好過程模型是較難的。閉環工作時,要求在過程中插入一個測試訊號。這個方法會引起擾動,所以基於模型的PID引數自整定在工業應用不是太好。
如果自整定是基於控制律的,經常難以把由負載干擾引起的影響和過程動態特性變化引起的影響區分開來,因此受到干擾的影響控制器會產生超調,產生一個不必要的自適應轉換。另外,由於基於控制律的系統沒有成熟的穩定性分析方法,引數整定可靠與否存在很多問題。
因此,許多自身整定引數的PID控制器經常工作在自動整定模式而不是連續的自身整定模式。自動整定通常是指根據開環狀態確定的簡單過程模型自動計算PID引數。
PID在控制非線性、時變、耦合及引數和結構不確定的複雜過程時,工作得不是太好。最重要的是,如果PID控制器不能控制複雜過程,無論怎麼調引數都沒用。
雖然有這些缺點,但簡單的PID控制器有時卻是最好的控制器。
15.1.3 現實意義
目前工業自動化水平已成為衡量各行各業現代化水平的一個重要標誌。同時,控制理論的發展也經歷了古典控制理論、現代控制理論和智慧控制理論三個階段。智慧控制的典型例項是模糊全自動洗衣機等。自動控制系統可分為開環控制系統和閉環控制系統。一個控制系統包括控制器、感測器、變送器、執行機構、輸入輸出介面。控制器的輸出經過輸出介面、執行機構,加到被控系統上;控制系統的被控量,經過感測器,變送器,通過輸入介面送到控制器。不同的控制系統,其感測器、變送器、執行機構是不一樣的。比如壓力控制系統要採用壓力感測器,電加熱控制系統的感測器是溫度感測器。目前,PID控制及其控制器或智慧PID控制器(儀表)已經很多,產品已在工程實際中得到了廣泛的應用,有各種各樣的PID控制器產品,各大公司均開發了具有PID引數自整定功能的智慧調節器 (intelligentregulator),其中PID控制器引數的自動調整是通過智慧化調整或自校正、自適應演算法來實現。有利用PID控制實現的壓力、溫度、流量、液位控制器,能實現PID控制功能的可程式設計控制器(PLC),還有可實現PID控制的PC系統等等。可程式設計控制器(PLC) 是利用其閉環控制模組來實現PID控制,而可程式設計控制器(PLC)可以直接與ControlNet相連,如Rockwell的PLC-5等。還有可以實現 PID控制功能的控制器,如Rockwell 的Logix產品系列,它可以直接與ControlNet相連,利用網路來實現其遠端控制功能。
15.1.4 系統分類
l 開環系統
開環控制系統(open-loop control system)是指被控物件的輸出(被控制量)對控制器(controller)的輸入沒有影響。在這種控制系統中,不依賴將被控量反送回來以形成任何閉環迴路。
l 閉環系統
閉環控制系統(closed-loop control system)是指被控物件的輸出(被控制量)會反送回來影響控制器的輸入,形成一個或多個閉環。閉環控制系統有正反饋和負反饋,若反饋訊號與系統給定值訊號相反,則稱為負反饋( Negative Feedback),若極性相同,則稱為正反饋,一般閉環控制系統均採用負反饋,又稱負反饋控制系統。閉環控制系統的例子很多。比如人就是一個具有負反饋的閉環控制系統,眼睛便是感測器,充當反饋,人體系統能通過不斷的修正最後作出各種正確的動作。如果沒有眼睛,就沒有了反饋迴路,也就成了一個開環控制系統。另例,當一臺真正的全自動洗衣機具有能連續檢查衣物是否洗淨,並在洗淨之後能自動切斷電源,它就是一個閉環控制系統。
l 階躍響應
階躍響應是指將一個階躍輸入(step function)加到系統上時,系統的輸出。穩態誤差是指系統的響應進入穩態後,系統的期望輸出與實際輸出之差。控制系統的效能可以用穩、準、快三個字來描述。穩是指系統的穩定性(stability),一個系統要能正常工作,首先必須是穩定的,從階躍響應上看應該是收斂的;準是指控制系統的準確性、控制精度,通常用穩態誤差(Steady-stateerror)來描述,它表示系統輸出穩態值與期望值之差;快是指控制系統響應的快速性,通常用上升時間來定量描述。
15.1.5 調節方法
PID是工業生產中最常用的一種控制方式,PID調節儀表也是工業控制中最常用的儀表之一,PID 適用於需要進行高精度測量控制的系統,可根據被控物件自動演算出最佳PID控制引數。
PID引數自整定控制儀可選擇外給定(或閥位)控制功能。可取代伺服放大器直接驅動執行機構(如閥門等)。PID外給定(或閥位)控制儀可自動跟隨外部給定值(或閥位反饋值)進行控制輸出(模擬量控制輸出或繼電器正轉、反轉控制輸出)。可實現自動/手動無擾動切換。手動切換至自動時,採用逼近法計算,以實現手動/自動的平穩切換。PID外給定(或閥位)控制儀可同時顯示測量訊號及閥位反饋訊號。
PID光柱顯示控制儀集數字儀表與模擬儀表於一體,可對測量值及控制目標值進行數字量顯示(雙LED數碼顯示),並同時對測量值及控制目標值進行相對模擬量顯示(雙光柱顯示),顯示方式為雙LED數碼顯示+雙光柱模擬量顯示,使測量值的顯示更為清晰直觀。
PID引數自整定控制儀可隨意改變儀表的輸入訊號型別。採用最新無跳線技術,只需設定儀表內部引數,即可將儀表從一種輸入訊號改為另一種輸入訊號。
PID引數自整定控制儀可選擇帶有一路模擬量控制輸出(或開關量控制輸出、繼電器和可控矽正轉、反轉控制)及一路模擬量變送輸出,可適用於各種測量控制場合。
PID引數自整定控制儀支援多機通訊,具有多種標準序列雙向通訊功能,可選擇多種通訊方式,如RS-232、RS-485、RS-422等,通訊波特率300~9600bps 儀表內部引數自由設定。可與各種帶序列輸入輸出的裝置(如電腦、可程式設計控制器、PLC 等)進行通訊,構成管理系統。
1.PID常用口訣:
引數整定找最佳,從小到大順序查
先是比例後積分,最後再把微分加
曲線振盪很頻繁,比例度盤要放大
曲線漂浮繞大灣,比例度盤往小扳
曲線偏離回覆慢,積分時間往下降
曲線波動週期長,積分時間再加長
曲線振盪頻率快,先把微分降下來
動差大來波動慢。微分時間應加長
理想曲線兩個波,前高後低4比1
一看二調多分析,調節質量不會低
2.PID控制器引數的工程整定,各種調節系統中P.I.D引數經驗資料以下可參照:
溫度T: P=20~60%,T=180~600s,D=3-180s
壓力P: P=30~70%,T=24~180s,
液位L: P=20~80%,T=60~300s,
流量F: P=40~100%,T=6~60s。
15.1.6 原理特點
在工程實際中,應用最為廣泛的調節器控制規律為比例、積分、微分控制,簡稱PID控制,又稱PID調節。PID控制器問世至今已有近70年曆史,它以其結構簡單、穩定性好、工作可靠、調整方便而成為工業控制的主要技術之一。當被控物件的結構和引數不能完全掌握,或得不到精確的數學模型時,控制理論的其它技術難以採用時,系統控制器的結構和引數必須依靠經驗和現場除錯來確定,這時應用PID控制技術最為方便。即當我們不完全瞭解一個系統和被控物件,或不能通過有效的測量手段來獲得系統引數時,最適合用PID控制技術。PID控制,實際中也有PI和PD控制。PID控制器就是根據系統的誤差,利用比例、積分、微分計算出控制量進行控制的。
比例控制
比例控制是一種最簡單的控制方式。其控制器的輸出與輸入誤差訊號成比例關係。當僅有比例控制時系統輸出存在穩態誤差(Steady-stateerror)。
積分控制
在積分控制中,控制器的輸出與輸入誤差訊號的積分成正比關係。對一個自動控制系統,如果在進入穩態後存在穩態誤差,則稱這個控制系統是有穩態誤差的或簡稱有差系統(System withSteady-state Error)。為了消除穩態誤差,在控制器中必須引入“積分項”。積分項對誤差取決於時間的積分,隨著時間的增加,積分項會增大。這樣,即便誤差很小,積分項也會隨著時間的增加而加大,它推動控制器的輸出增大使穩態誤差進一步減小,直到等於零。因此,比例+積分(PI)控制器,可以使系統在進入穩態後無穩態誤差。
微分控制
在微分控制中,控制器的輸出與輸入誤差訊號的微分(即誤差的變化率)成正比關係。自動控制系統在克服誤差的調節過程中可能會出現振盪甚至失穩。其原因是由於存在有較大慣性元件(環節)或有滯後(delay)元件,具有抑制誤差的作用,其變化總是落後於誤差的變化。解決的辦法是使抑制誤差的作用的變化“超前”,即在誤差接近零時,抑制誤差的作用就應該是零。這就是說,在控制器中僅引入 “比例”項往往是不夠的,比例項的作用僅是放大誤差的幅值,而目前需要增加的是“微分項”,它能預測誤差變化的趨勢,這樣,具有比例+微分的控制器,就能夠提前使抑制誤差的控制作用等於零,甚至為負值,從而避免了被控量的嚴重超調。所以對有較大慣性或滯後的被控物件,比例+微分(PD)控制器能改善系統在調節過程中的動態特性。
15.1.7 引數整定
PID控制器的引數整定是控制系統設計的核心內容。它是根據被控過程的特性確定PID控制器的比例係數、積分時間和微分時間的大小。
PID控制器引數整定的方法很多,概括起來有兩大類:一是理論計算整定法。它主要是依據系統的數學模型,經過理論計算確定控制器引數。這種方法所得到的計算資料未必可以直接用,還必須通過工程實際進行調整和修改。二是工程整定方法,它主要依賴工程經驗,直接在控制系統的試驗中進行,且方法簡單、易於掌握,在工程實際中被廣泛採用。
PID控制器引數的工程整定方法,主要有臨界比例法、反應曲線法和衰減法。三種方法各有其特點,其共同點都是通過試驗,然後按照工程經驗公式對控制器引數進行整定。但無論採用哪一種方法所得到的控制器引數,都需要在實際執行中進行最後調整與完善。現在一般採用的是臨界比例法。
利用該方法進行 PID控制器引數的整定步驟如下:
(1)首先預選擇一個足夠短的取樣週期讓系統工作;
(2)僅加入比例控制環節,直到系統對輸入的階躍響應出現臨界振盪,記下這時的比例放大係數和臨界振盪週期;
(3)在一定的控制度下通過公式計算得到PID控制器的引數。
此條應該不屬於大的,抽象的PID控制理論的內容了,而是PID理論的具體應用。
15.1.8 預製調整
比例增益
變頻器的 PID 功能是利用目標訊號和反饋訊號的差值來調節輸出頻率的,一方面,我們希望目標訊號和反饋訊號無限接近,即差值很小,從而滿足調節的精度:另一方面,我們又希望調節訊號具有一定的幅度,以保證調節的靈敏度。解決這一矛盾的方法就是事先將差值訊號進行放大。比例增益 P 就是用來設定差值訊號的放大係數的。任何一種變頻器的引數 P 都給出一個可設定的數值範圍,一般在初次除錯時, P 可按中間偏大值預置.或者暫時默認出廠值,待裝置運轉時再按實際情況細調。
積分時間
如上所述.比例增益 P 越大,調節靈敏度越高,但由於傳動系統和控制電路都有慣性,調節結果達到最佳值時不能立即停止,導致“超調”,然後反過來調整,再次超調,形成振盪。為此引入積分環節 I ,其效果是,使經過比例增益 P 放大後的差值訊號在積分時間內逐漸增大 ( 或減小 ) ,從而減緩其變化速度,防止振盪。但積分時間 I 太長,又會當反饋訊號急劇變化時,被控物理量難以迅速恢復。因此, I 的取值與拖動系統的時間常數有關:拖動系統的時間常數較小時,積分時間應短些;拖動系統的時間常數較大時,積分時間應長些。
微分時間
如上所述.比例增益 P 越大,調節靈敏度越高,但由於傳動系統和控制電路都有慣性,調節結果達到最佳值時不能立即停止,導致“超調”,然後反過來調整,再次超調,形成振盪。為此引入積分環節 I ,其效果是,使經過比例增益 P 放大後的差值訊號在積分時間內逐漸增大 ( 或減小 ) ,從而減緩其變化速度,防止振盪。但積分時間 I 太長,又會當反饋訊號急劇變化時,被控物理量難以迅速恢復。因此, I 的取值與拖動系統的時間常數有關:拖動系統的時間常數較小時,積分時間應短些;拖動系統的時間常數較大時,積分時間應長些。
調整原則
PID 引數的預置是相輔相成的,執行現場應根據實際情況進行如下細調,被控物理量在目標值附近振盪,首先加大積分時間 I ,如仍有振盪,可適當減小比例增益 P。被控物理量在發生變化後難以恢復,首先加大比例增益 P ,如果恢復仍較緩慢,可適當減小積分時間 I ,還可加大微分時間 D。
15.2 PID形象解釋
這個解釋形象的說明了引數P,I,D的使用。(內容來自網上)
小明接到這樣一個任務:有一個水缸點漏水(而且漏水的速度還不一定固定不變),要求水面高度維持在某個位置,一旦發現水面高度低於要求位置,就要往水缸里加水。小明接到任務後就一直守在水缸旁邊,時間長就覺得無聊,就跑到房裡看小說了,每30分鐘來檢查一次水面高度。水漏得太快,每次小明來檢查時,水都快漏完了,離要求的高度相差很遠,小明改為每3分鐘來檢查一次,結果每次來水都沒怎麼漏,不需要加水,來得太頻繁做的是無用功。幾次試驗後,確定每10分鐘來檢查一次。這個檢查時間就稱為取樣週期。
開始小明用瓢加水,水龍頭離水缸有十幾米的距離,經常要跑好幾趟才加夠水,於是小明又改為用桶加,一加就是一桶,跑的次數少了,加水的速度也快了,但好幾次將缸給加溢位了,不小心弄溼了幾次鞋,小明又動腦筋,我不用瓢也不用桶,老子用盆,幾次下來,發現剛剛好,不用跑太多次,也不會讓水溢位。這個加水工具的大小就稱為比例係數。
小明又發現水雖然不會加過量溢位了,有時會高過要求位置比較多,還是有打溼鞋的危險。他又想了個辦法,在水缸上裝一個漏斗,每次加水不直接倒進水缸,而是倒進漏斗讓它慢慢加。這樣溢位的問題解決了,但加水的速度又慢了,有時還趕不上漏水的速度。於是他試著變換不同大小口徑的漏斗來控制加水的速度,最後終於找到了滿意的漏斗。漏斗的時間就稱為積分時間 。
小明終於喘了一口,但任務的要求突然嚴了,水位控制的及時性要求大大提高,一旦水位過低,必須立即將水加到要求位置,而且不能高出太多,否則不給工錢。小明又為難了!於是他又開努腦筋,終於讓它想到一個辦法,常放一盆備用水在旁邊,一發現水位低了,不經過漏斗就是一盆水下去,這樣及時性是保證了,但水位有時會高多了。他又在要求水面位置上面一點將水鑿一孔,再接一根管子到下面的備用桶裡這樣多出的水會從上面的孔裡漏出來。這個水漏出的快慢就稱為微分時間。
15.3 CMSIS的PID庫
PID庫使用的演算法如下:
y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
A0 = Kp + Ki + Kd
A1 = (-Kp ) - (2 * Kd )
A2 = Kd
框圖如下:
PID控制器計算一個“誤差”值作為測得的輸出和參考輸入之間的差值。PID控制器通過調整輸入引數來使這個誤差最小。比例值決定是誤差的反應,積分值是決定誤差之和的反應,微分值決定誤差的改變頻率。
15.4 浮點數PID庫15.4.1 arm_pid_f32
函式定義如下:
static __INLINE float32_tarm_pid_f32(arm_pid_instance_f32 * S, float32_t in)
引數定義:
[in]*S is an instance of the floating-point PID Control structure
[in]in input sample to process
return outprocessed output sample.
注意事項:
1. 資料型別arm_pid_instance_f32的定義如下:
1. /**
2. * @brief Instance structure for the floating-point PID Control.
3. */
4. typedefstruct
5. {
6. float32_t A0; /**< The derivedgain, A0 = Kp + Ki + Kd . */
7. float32_t A1; /**< The derivedgain, A1 = -Kp - 2Kd. */
8. float32_t A2; /**< The derivedgain, A2 = Kd . */
9. float32_t state[3]; /**< The state array oflength 3. */
10. float32_t Kp; /**< The proportional gain. */
11. float32_t Ki; /**< The integral gain. */
12. float32_t Kd; /**< The derivative gain. */
13. } arm_pid_instance_f32;
複製程式碼
2. 這個函式在檔案arm_math.h檔案裡面。
15.4.2 arm_pid_init_f32
函式定義如下:
voidarm_pid_init_f32(arm_pid_instance_f32 * S, int32_t resetStateFlag)
引數定義:
[in] *S points to an instance of the PIDstructure.
[in]resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
注意事項:
1. 這個函式是通過使用者配置了Kp,Ki,Kd後,獲得A0,A1和A2。
2. 通過設定標誌resetStateFlag,使用者也可以選擇是否初始化所有相關變數為0。
15.4.3 arm_pid_reset_f32
函式定義如下:
voidarm_pid_reset_f32(arm_pid_instance_f32 * S)
引數定義:
[in] *S Instance pointer of PID control data structure.
注意事項:
1.這個函式比較的簡單,僅是復位相關變數為0.15.5 定點數Q31格式PID庫15.5.1 arm_pid_q31
函式定義如下:
static __INLINE q31_t arm_pid_q31(arm_pid_instance_q31 * S,q31_t in)
引數定義:
[in,out] *S points to an instance of the Q31 PID Controlstructure
[in] in input sample to process
return out processed output sample.
注意事項:
1. 這個函式使用了內部的64位累加器。
2. 64位累加器的資料格式是2.62,這樣的話,只有一個保護位,為了防止溢位,輸入引數需要右移兩位,右移兩位是因為函式內部有四個加數需要進行加法運算。所有運算結束後2.62格式的資料會被擷取成1.31格式,並作飽和運算。
3. 資料型別arm_pid_instance_q31的定義如下:
1. /**
2. * @brief Instance structure for the Q31 PID Control.
3. */
4. typedefstruct
5. {
6. q31_t A0; /**< Thederived gain, A0 = Kp + Ki + Kd . */
7. q31_t A1; /**< Thederived gain, A1 = -Kp - 2Kd. */
8. q31_t A2; /**< Thederived gain, A2 = Kd . */
9. q31_t state[3]; /**< The state array oflength 3. */
10. q31_t Kp; /**< Theproportional gain. */
11. q31_t Ki; /**< Theintegral gain. */
12. q31_t Kd; /**< Thederivative gain. */
13. } arm_pid_instance_q31;
複製程式碼
15.5.2 arm_pid_init_q31
函式定義如下:
void arm_pid_init_q31(arm_pid_instance_q31 * S, int32_tresetStateFlag)
引數定義:
[in] *S points to an instance of the PID structure.
[in] resetStateFlag flag to reset thestate. 0 = no change in state 1 = reset the state.
注意事項:
1. 這個函式是通過使用者配置了Kp,Ki,Kd後,獲得A0,A1和A2。
2. 通過設定標誌resetStateFlag,使用者也可以選擇是否初始化所有相關變數為0。
15.5.3 arm_pid_reset_q31
函式定義如下:
void arm_pid_reset_q31(arm_pid_instance_q31 * S)
引數定義:
[in] *S Instancepointer of PID control data structure.
注意事項:
1. 這個函式比較的簡單,僅是復位相關變數為0.
15.6 定點數Q15格式PID庫15.6.1 arm_pid_q15
函式定義如下:
static __INLINE q15_t arm_pid_q15(arm_pid_instance_q31 * S,q31_t in)
引數定義:
[in,out] *S points to an instance of the Q15 PID Controlstructure
[in] in input sample to process
return out processed output sample.
注意事項:
1. 這個函式使用了內部的64位累加器。
2. 輸入引數和內部變數都是用的1.15格式,它們相乘後是2.30格式,由於內部用的是64位累加器,那麼最終結果就是34.30格式,基本沒有溢位的危險。最終輸出結果需要丟棄低15位,並飽和成1.15格式的資料。
3. 資料型別arm_pid_instance_q31的定義如下:
1. /**
2. * @brief Instance structure for the Q15 PID Control.
3. */
4. typedefstruct
5. {
6. q15_t A0; /**< Thederived gain, A0 = Kp + Ki + Kd . */
7. q15_t A1; /**< Thederived gain, A1 = -Kp - 2Kd. */
8. q15_t A2; /**< Thederived gain, A2 = Kd . */
9. q15_t state[3]; /**< The state array oflength 3. */
10. q15_t Kp; /**< Theproportional gain. */
11. q15_t Ki; /**< Theintegral gain. */
12. q15_t Kd; /**< Thederivative gain. */
13. } arm_pid_instance_q15;
複製程式碼
15.6.2 arm_pid_init_q15
函式定義如下:
void arm_pid_init_q15(arm_pid_instance_q15 * S, int32_tresetStateFlag)
引數定義:
[in] *S points to an instance of the PID structure.
[in] resetStateFlag flag to reset thestate. 0 = no change in state 1 = reset the state.
注意事項:
1. 這個函式是通過使用者配置了Kp,Ki,Kd後,獲得A0,A1和A2。
2. 通過設定標誌resetStateFlag,使用者也可以選擇是否初始化所有相關變數為0。
15.6.3 arm_pid_reset_q15
函式定義如下:
void arm_pid_reset_q15(arm_pid_instance_q15 * S)
引數定義:
[in] *S Instancepointer of PID control data structure.
注意事項:
1. 這個函式比較的簡單,僅是復位相關變數為0.
15.7 例項講解
實驗目的:
1. 學習ControllerFunctions中浮點PID
實驗內容:
1. 不需要外部操作,實現PID的自動調節。
2. 使用者只需調節電阻器器即可(特別注意:這裡我僅調試出了PID正向調整,也就是PID函式的返回值是逐漸增大的,方向調整沒有實現)。
3. 使用者需要自制一個可變電阻器10K歐和一個電阻1K歐串聯,串聯後1K歐端接地,另一端接DAC輸出(使用引腳PA4),可變電阻和電阻連線的地方接ADC(使用引腳PF9)。使用前請將可變電阻調至1K歐。
4. 這裡特別注意,在初始化DAC的時候,我們是設定DAC輸出100(12位DAC輸出範圍0-4095)。這裡的目標是ADC採集得200以上就認為穩定。
實驗現象:
通過視窗上位機軟體SecureCRT(V5光盤裡面有此軟體)檢視列印資訊現象如下:
程式設計:
ADC和DAC的驅動及其實現請參考安富萊_STM32-V5開發板_使用者手冊的第18章和第19章。這裡我們重點說PID主函式。
1. /*
2. *********************************************************************************************************
3. * 函數名: main
4. * 功能說明: c程式入口
5. * 形 參:無
6. * 返回值: 錯誤程式碼(無需處理)
7. *********************************************************************************************************
8. */
9. intmain(void)
10. {
11. int16_ti;
12. arm_pid_instance_f32S;
13. float32_tout;
14. S.Kp =1; //比例因子 (1)
15. S.Ki =1; //積分因子
16. S.Kd =0; //微分因子
17. arm_pid_init_f32(&S,1); (2)
18.
19.
20. bsp_Init(); /* 硬體初始化 */
21. PrintfLogo(); /* 列印例程資訊到串列埠1 */
22.
23. bsp_StartAutoTimer(0,100); /* 啟動1個100ms的自動重灌的定時器 */ (3)
24.
25. /* 進入主程式迴圈體 */
26. while (1)
27. {
28. bsp_Idle(); /* 這個函式在bsp.c檔案。使用者可以修改這個函式實現CPU休眠和喂狗 */
29.
30. if(bsp_CheckTimer(0)) /* 判斷定時器超時時間 */
31. {
32. /* 每隔500ms 進來一次 */
33. bsp_LedToggle(4); /* 翻轉LED4的狀態 */
34.
35. uiAverage =0;
36. for(i = 0; i< 20; i++)
37. {
38. uiAverage +=ADC3ConvertedValue[i];
39. }
40. uiAverage =uiAverage/20;
41. if(uiAverage> 200) (4)
42. {
43. }
44. else
45. {
46. out =arm_pid_f32(&S, uiAverage); (5)
47. }
48. TIM_Cmd(TIM6,DISABLE);
49. for(i =0; i< 128; i++) (6)
50. {
51. Sine12bit[i]= (uint16_t)out % 4095;
52. }
53. TIM_Cmd(TIM6,ENABLE);
54. printf("out= %d uiAverage/20 = %d\r", (uint16_t)out % 4095, uiAverage);
55. }
56.
57. }
58. }
複製程式碼
1. 設定PID的引數。
2. 初始化PID變數。
3. 配置一個100ms的軟定時器,這個就是PID的取樣時間。
4. 如果ADC採集的引數超過200就認為穩定,不再需要做PID調節。
5. ADC採集的引數小於200的話,PID會自動的進行調節。
6. 將PID調節後的數值賦值給