stm32直流電機控制—PID演算法篇
- 一、常用的控制演算法
- 1.控制系統的基本結構:
- 2.常用控制演算法:位式控制
- ①二位式控制演算法
- ②.具有回差的二位式控制演算法
- ③三位式控制演算法
- ④小結
- 二、PID控制演算法
- 1.PID控制演算法的基本思想
- 2.PID演算法分析
- 3.PID演算法數學模型
- 4.小結
- 三、STM32代碼控制說明
- 1.硬體電路搭建
- 2.軟體實作
一、常用的控制演算法
1.控制系統的基本結構:
控制系統的基本結構如圖:

控制目的:
控制的根本目的就是要使控制物件當前的狀態值與用戶的設定值相同(最大限度的接近),
基本思想:
用戶設定值SV與被控制物件當前的值PV兩者同時送入由特定硬體電路模型或特定的軟體演算法組成的控制演算法邏輯中,利用不同的控制演算法對SV和PV進行分析、判斷、處理,從而產生當前應該輸出的控制信號OUT,控制信號經過執行機構施加到控制物件上,從而產生預期的控制效果,
2.常用控制演算法:位式控制
①二位式控制演算法
二位式控制演算法具體控制邏輯如圖所示:

特點:
a. 二位式控制演算法輸出的控制量只有高低2種狀態,
b. 執行機構使控制物件要不全額作業,要不就停止作業,當PV低于SV時全額作業,PV大于或等于SV時就徹底停止作業,如果控制物件是一個1000W的加熱器,溫度不到時就1000W全功率運行,溫度達到時就停止作業,
c. 由于環境因素或控制系統傳輸延時或者控制物件本身的慣性等因素,控制效果往往是PV在SV的上下有一個較大的波動,
d. 在PV接近SV的臨界點時,控制輸出信號OUT往往在H和L之間頻繁轉換,導致執行部件的觸點頻繁開關動作,易產生干擾及縮短執行部件的壽命,
②.具有回差的二位式控制演算法
具有回差的二位式控制演算法具體控制邏輯如圖所示:

特點:
a. 取SV的正負10%左右作為回差調節上下限,高于上限才開始輸出L,低于下限才開始輸出H;
b.避免了一般二位式控制演算法在臨界點時執行部件頻繁動作,
c.因為控制物件只有全額運行或不運行兩種狀態,仍然存在一般二位式控制演算法的缺點:PV總是在SV附近波動,
③三位式控制演算法
三位式控制演算法具體控制邏輯如圖所示:

特點:
a.在二位式控制的基礎上對控制物件的功率分成0功率(停止作業)、半功率、全功率三種情況(即三位),
b.當前值低于設定值一定比例(一般10%)時OUT1和OUT2同時起控制作用,控制物件全功率運行;
c.當前值在設定值的正負10%范圍時,OUT1單獨作用,作業于半功率狀態;
d.當前值達到或超過設定值時OUT1和OUT2都停止輸出,控制物件停止作業,
e.相對一般二位式控制演算法,三位式演算法對控制物件的當前狀態值做了簡單的分析,并根據不同的當前狀態值輸出不同的控制信號,能夠較好的對輸出產生控制效果,
④小結
位式控制的主要特征:
a.控制演算法只關注控制當前的狀態值(PV)與設定值之間的差值—二者當前有差值就輸出控制信號,二者當前無差值就不輸出控制信號,
b…位式控制演算法的輸出信號狀態單一,只輸出了高低兩種狀態,這兩種狀態對應著控制物件的作業與不作業----如果是溫度控制系統,就是加熱器加熱與不加熱,
c.由于控制系統自身的延時或者控制物件自身的慣性,位式控制演算法只能使控制物件當前的狀態值在設定值附件波動,不能很好的跟蹤在設定值的附近甚至相等,
二、PID控制演算法
1.PID控制演算法的基本思想
PID控制控制演算法具體控制邏輯如圖所示:

PID演算法是一種具有預見性的控制演算法,其核心思想是:
①. PID演算法不但考慮控制物件的當前狀態值(現在狀態),而且還考慮控制物件過去一段時間的狀態值(歷史狀態)和最近一段時間的狀態值變化(預期),由這3方面共同決定當前的輸出控制信號;
②.PID控制演算法的運算結果是一個數,利用這個數來控制被控物件在多種作業狀態(比如加熱器的多種功率,閥門的多種開度等)作業,一般輸出形式為PWM,基本上滿足了按需輸出控制信號,根據情況隨時改變輸出的目的,
2.PID演算法分析
設某控制系統:用戶設定值為SV(也就是希望通過PID控制演算法使被控制物件的狀態值保持在SV的附件),
①從系統投入運行開始,控制演算法每隔一段時間對被控制物件的狀態值進行采樣,由此,可得到開機以來由各個采樣時間點被控制物件的狀態值所形成的資料序列:
X1,X2, X3, X4, … Xk-2,Xk-1,Xk
說明:
X1:開機以來的第一次采樣值
Xk: 目前的采樣值(最近一次的采樣值)
2>從這個采樣值序列中提取出三方面資訊:
①當前采樣值Xk與用戶設定值SV之間的差值:Ek
Ek =Sv-Xk
分析Ek:
Ek>0:說明當前狀態值未達標
Ek=0:說明當前控制狀態值正好滿足要求
Ek<0:說明當前狀態值已經超標
結論:Ek反應了控制物件當前值與設定值的偏差程度,可以根據Ek的大小對輸出信號OUT進行調整:偏差程度大OUT增大,偏差程度小OUT減小,即輸出信號的強弱與當前偏差程度的大小成比例,所以根據Ek的大小來給出控制信號OUT的當前值的演算法稱為比例控制(Proportion),用數學模型可以表示為:
POUT=(Kp*Ek)+Out0
Kp:一般稱之為比例系數,可以理解為硬體上的放大器(或衰減器),適當選取Kp將當前誤差值Ek
按一定的增益放大或縮小,以提高控制演算法的相應速度,
Out0:是一個常數,目的是為了當Ek為0時,確保輸出信號不為0,以不至于在當前值與設定值相等時控制器輸出信號OUT為0,系統處于無控制信號的失控狀態,
②將投入運行以來的各個采樣值都與設定值相減,可得到開機以來每個采樣時刻的偏差序列資料:
E1,E2,E3 …Ek-2,Ek-1,Ek
說明:
E1:開機的第一個采樣點與設定值的偏差
E1=SV-X1;
E2=SV-X2;
…
EK-2=SV-XK-2;
EK-1=SV-XK-1;
Ek: 當前的采樣值與設定值的偏差
EK=SV-XK
分析開機以來的誤差序列:
每個偏差值可能有:>0,<0,=0這三種可能的值,因為從開機到現在,控制演算法不斷輸出控制信號對被控物件進行控制,導致了過去這段時間有時候超標(Ex<0),有些時候未達標(Ex>0),有時候正好滿足要求(Ex=0);如果將這些偏差值進行累加求代數和得到Sk,即:
Sk=E1+E2+E3+…+Ek-2+Ek-1+Ek
分析Sk:
Sk>0:過去大多數時候未達標
Sk=0:過去控制效果較理想
Sk<0:過去大多數時候已經超標
結論:1.通過對Sk的分析,可以對控制演算法過去的控制效果進行綜合評估,體現了控制演算法按照原來的方式輸出的控制信號導致了現在的控制結果,所以應該利用這個值來對當前要輸出的控制信號OUT進行修正,以確保控制物件會在將來的一小段時間盡快達到用戶設定的值,
2.Sk實際上是過去每個時間點的誤差相加,與數學上的定積分運算類似,因此根據Sk對輸出信號進行調節的演算法稱積分(integral)演算法,所以積分控制的數學模型為:
IOUT=(kp* ((1/Ti)Exdt))+Out0
Kp是一常數,其目的類似硬體上的放大器,用于將Sk放大或衰減;
Out0是一常數,為了在歷史積分偏差值為0時確保系統有一個輸出值,避免失控;
Ti 是積分時間常數,取值越大會導致輸出量OUT會越小,可理解為歷史上已經很久的誤差值都影響了當前的輸出信號,取值越小,輸出OUT會越強烈,可理解為積分只考慮了最近一段時間的誤差,
實際中,如果系統已經運行“很長”一段時間了,那些早期采樣的偏差值可以忽略他們對當前控制的影響,所以應該根據情況選擇合理的Ti值方能得到良好的控制效果,
③最近兩次的偏差之差 Dk
Dk=Ek-Ek-1
說明:
Ek:當前的偏差
Ek-1: 基于當前的前一個采樣時刻的偏差值(即上一次的偏差值);
分析Dk:
Dk>0:說明從上一采樣時刻到當前誤差有增大趨勢
Dk=0:說明從上一采樣時刻到當前誤差平穩
Dk<0:說明從上一采樣時刻到當前誤差有減小趨勢

結論:
1. Dk能夠說明從上次采樣到當前采樣的這段時間被控制物件的狀態變化趨勢,這種變化的趨勢很可能會在一定程度上延續到下一個采樣時間點,所以可以根據這個變化趨勢(Dk的值)對輸出信號OUT進行調整,達到提前控制的目的,
2. Dk形如數學上的微分運算,反應了控制物件在一段時間內的變化趨勢及變化量,所以利用Dk對控制器輸出信號進行調節的演算法稱為微分(differential)演算法,可以用數學模型表達為:
DOUT=Kp*(Td(de/dt))+Out0
Kp:為一常數,可理解為硬體上的放大器或衰減器,用于對輸出信號OUT的增益進行調整;
Out0:為一常數,為了在Dk為0時確保OUT都有一個穩定的控制值,避免失控,
Td:叫微分時間常數,(猶如硬體上電感器的自感系數)Td越大導致OUT增大,對輸出信號產生強烈的影響,
3>PID演算法的形成
1.比例、積分、微分三種演算法的優缺點分析:
POUT=(KpEk)+ Out0 --比例演算法
IOUT=kp ( (1/Ti) Exdt)+Out0 --積分演算法
DOUT=Kp*(Td(de/dt))+Out0 --微分演算法
比例演算法: 只考慮控制物件當前誤差,當前有誤差才輸出控制信號,當前沒有誤差就不輸出控制信號,也就是說只要偏差已經產生了比例演算法才采取措施進行調整,所以單獨的比例演算法不可能將控制物件的狀態值控制在設定值上,始終在設定值上下波動;但是比例控制反應靈敏,有誤差馬上就反應到輸出,
積分演算法:考慮了被控制物件的歷史誤差情況,過去的誤差狀況參與了當前的輸出控制,但是在系統還沒有達到目標期間,往往會因為這些歷史的誤差對當前的控制產生了干擾(即拖后腿),使用不當反而攪亂當前的輸出,但是在系統進入穩定狀態后,特別是當前值與設定值沒有偏差時,積分演算法可以根據過去的偏差值輸出一個相對穩定的控制信號,以防止產生偏離目標,起到打預防針的效果,
微分演算法:單純的考慮了近期的變化率,當系統的偏差趨近于某一個固定值時(變化率為0),微分演算法不輸出信號對其偏差進行調整,所以微分演算法不能單獨使用,它只關心偏差的變化速度,不考慮是否有偏差(偏差變化率為0時偏差不一定是0).但是微分演算法能獲得控制物件近期的變化趨勢,它可以協助輸出信號盡早的抑制控制物件的變化,可以理解為將要有劇烈變化時就大幅度調整輸出信號進行抑制,避免了控制物件的大幅度變化,
以上三種演算法綜合起來產生一個當前的控制量對控制物件進行控制,它們的優缺點互補,即形成經典的PID演算法,
3.PID演算法數學模型
OUT=POUT+IOUT+DOUT
即:
OUT=((KpEk)+ Out0)+(kp ( (1/Ti) Exdt)+Out0)+ (Kp*(Td(de/dt))+Out0)
整理該式子得到:將各項的Out0歸并為OUT0,
OUT=kp(Ek+((1/Ti)Exdt))+(Td(de/dt)))+OUT0
3.PID演算法在單片機中的應用
1)PID演算法在單片機中應用時,對積分和微分項可以作近似變換:
對于積分項可改寫成:
n
I =1/Ti∑EkT
k=0
即用過去一段時間的采樣點的偏差值的代數和的代替積分,
T是采樣周期,也叫控制周期,每隔T時間段進行一次PID計算,
對于微分項可改寫成:
D=TD((Ek-Ek-1)/T)
Ek:本次偏差,Ek-1上次的偏差值
2)位置式PID演算法數學模型
由此可得到單片機中PID演算法的運算式:
OUT=kp(Ek+((1/Ti)Exdt))+(Td(de/dt)))+OUT0
=>
OUT=
n
Kp(En+(1/Ti∑EkT)+(TD((Ek-Ek-1)/T)))+out0
k=0
進一步展開得:
n
OUT=(KpEk) + (Kp(T/Ti)∑Ek) +(Kp*(TD/T)(EK-Ek-1)) +OUT0
k=0
令 Ki= Kp*(T/Ti);
KD=(Kp*(TD/T)
故:
n
OUT=(Kp*Ek) + (Ki∑Ek) +(KD(EK-Ek-1)) +OUT0
k=0
程式設計時利用C語言或匯編語言可以方便實作這個計算公式,OUT即為本次運算的結果,利用OUT可以去驅動執行機構輸出對應的控制信號,例如溫度控制就可以控制PWM的寬度,電磁閥就可以改變電磁線圈電流以改變閥門開度,或者是可控硅的導通角度等;
這種PID演算法計算出的結果(OUT值)表示當前控制器應該輸出的控制量,所以稱為位置式(直接輸出了執行機構應該達到的狀態值),
3)增量式PID演算法
位置式PID演算法計算量較大,比較消耗處理器的資源,在有些控制系統中,執行機構本身沒有記憶功能,比如MOS管是否導通完全取決于控制極電壓,可控硅是否導通取決于觸發信號,繼電器是否接通取決于線圈電流等,只要控制信號丟失,執行機構就停止,在這些應用中應該采用位置式PID,
也有一些執行機構本身具有記憶功能,比如步進電機,即使控制信號丟失,由于其自身的機械結構會保持在原來的位置等,在這些控制系統中,PID演算法沒有必要輸出本次應該到達的真實位置,只需要說明應該在上次的基礎上對輸出信號做多大的修正(可正可負)即可,這就是增量式PID演算法,
增量式PID計算出的是應該在當前控制信號上的調整值,如果計算出為正,則增強輸出信號;如果計算出為負則減弱輸出信號,
增量式PID演算法數學模型:
如果用OUTK-1表示上次的輸出控制信號值,那么當前的輸出值應該為OUTk,這兩者之間的關系為:
OUTK=OUTk-1+ △OUT
△OUT即為應該輸出的增量值;
上式變形得:
△OUT= OUTK- OUTk-1
本次的位置式演算法輸出:
n
OUTk=(KpEk) + (Ki∑Ek) +(KD(EK-Ek-1)) +OUT0 --1式
k=0
上次的位置式演算法輸出:
n-1
OUTk-1=(KpEk-1) +(Ki∑Ek) +(KD(EK-1-Ek-2)) +OUT0–2式
k=0
上述1式減2式即得到相鄰兩次的增量:
如前所述:
Ki= Kp*(T/Ti);
KD=(Kp*(TD/T)
△OUT= OUTK- OUTk-1=
kp(EK-EK-1)+((KpT)/Ti)Ek+(((KpTD)/T)*(Ek-2Ek-1+Ek-2))
EK:本次的偏差;
Ek-1:上次的偏差
Ek-2:上上次的偏差
Kp:演算法增益調節
Ti :積分時間
TD: 微分時間常數
結論:
增量式PID的計算只需要最近3次的偏差(本次偏差,上次偏差,上上次偏差),不需要處理器存盤大量的歷史偏差值,計算量也相對較少,容易實作,
4)關于Ti和TD的理解:
在PID控制演算法中,當前的輸出信號由比例項,積分項,微分項共同作用形成,當比例項輸出不為0時,如果積分項對運算輸出的貢獻作用與比例項對運算對輸出的貢獻一樣時(即同為正或同為負時),積分項相當于重復了一次比例項產生作用的時間,這個
時間就可以理解為積分時間,
當比例項不為0時,如果微分項在一段時間里計算的結果與比例項對輸出的貢獻相同(即同為正或同為負)時,微分項相當于在一段時間里重復了比例項的作用,這段時間可理解為就是微分時間,
實際應用中應該合理選擇Kp,Ti,Td以確保三者對輸出的貢獻平衡,從而使控制物件在設定值的附近,
4.小結
4PID是比例、積分、微分的簡稱,PID控制的難點不是編程,而是控制器的引數整定,引數整定的關鍵是正確地理解各引數的物理意義,PID控制的原理可以用人對爐溫的手動控制來理解,閱讀本文不需要高深的數學知識,
1.比例控制
有經驗的操作人員手動控制電加熱爐的爐溫,可以獲得非常好的控制品質,PID控制與人工控制的控制策略有很多相似的地方,
下面介紹操作人員怎樣用比例控制的思想來手動控制電加熱爐的爐溫,假設用熱電偶檢測爐溫,用數字儀表顯示溫度值,在控制程序中,操作人員用眼睛讀取爐溫,并與爐溫給定值比較,得到溫度的誤差值,然后用手操作電位器,調節加熱的電流,使爐溫保持在給定值附近,
操作人員知道爐溫穩定在給定值時電位器的大致位置(我們將它稱為位置L),并根據當時的溫度誤差值調整控制加熱電流的電位器的轉角,爐溫小于給定值時,誤差為正,在位置L的基礎上順時針增大電位器的轉角,以增大加熱的電流,爐溫大于給定值時,誤差為負,在位置L的基礎上反時針減小電位器的轉角,并令轉角與位置L的差值與誤差成正比,上述控制策略就是比例控制,即PID控制器輸出中的比例部分與誤差成正比,
倍訓中存在著各種各樣的延遲作用,例如調節電位器轉角后,到溫度上升到新的轉角對應的穩態值時有較大的時間延遲,由于延遲因素的存在,調節電位器轉角后不能馬上看到調節的效果,因此倍訓控制系統調節困難的主要原因是系統中的延遲作用,
比例控制的比例系數如果太小,即調節后的電位器轉角與位置L的差值太小,調節的力度不夠,使系統輸出量變化緩慢,調節所需的總時間過長,比例系數如果過大,即調節后電位器轉角與位置L的差值過大,調節力度太強,將造成調節過頭,甚至使溫度忽高忽低,來回震蕩,
增大比例系數使系統反應靈敏,調節速度加快,并且可以減小穩態誤差,但是比例系數過大會使超調量增大,振蕩次數增加,調節時間加長,動態性能變壞,比例系數太大甚至會使倍訓系統不穩定,
單純的比例控制很難保證調節得恰到好處,完全消除誤差,
2.積分控制
PID控制器中的積分對應于圖1中誤差曲線 與坐標軸包圍的面積(圖中的灰色部分),PID控制程式是周期性執行的,執行的周期稱為采樣周期,計算機的程式用圖1中各矩形面積之和來近似精確的積分,圖中的TS就是采樣周期,

4圖1 積分運算示意圖
每次PID運算時,在原來的積分值的基礎上,增加一個與當前的誤差值ev(n)成正比的微小部分,誤差為負值時,積分的增量為負,
手動調節溫度時,積分控制相當于根據當時的誤差值,周期性地微調電位器的角度,每次調節的角度增量值與當時的誤差值成正比,溫度低于設定值時誤差為正,積分項增大,使加熱電流逐漸增大,反之積分項減小,因此只要誤差不為零,控制器的輸出就會因為積分作用而不斷變化,積分調節的“大方向”是正確的,積分項有減小誤差的作用,一直要到系統處于穩定狀態,這時誤差恒為零,比例部分和微分部分均為零,積分部分才不再變化,并且剛好等于穩態時需要的控制器的輸出值,對應于上述溫度控制系統中電位器轉角的位置L,因此積分部分的作用是消除穩態誤差,提高控制精度,積分作用一般是必須的,
PID控制器輸出中的積分部分與誤差的積分成正比,因為積分時間TI在積分項的分母中,TI越小,積分項變化的速度越快,積分作用越強,
3.PI控制
控制器輸出中的積分項與當前的誤差值和過去歷次誤差值的累加值成正比,因此積分作用本身具有嚴重的滯后特性,對系統的穩定性不利,如果積分項的系數設定得不好,其負面作用很難通過積分作用本身迅速地修正,而比例項沒有延遲,只要誤差一出現,比例部分就會立即起作用,因此積分作用很少單獨使用,它一般與比例和微分聯合使用,組成PI或PID控制器,
PI和PID控制器既克服了單純的比例調節有穩態誤差的缺點,又避免了單純的積分調節回應慢、動態性能不好的缺點,因此被廣泛使用,
如果控制器有積分作用(例如采用PI或PID控制),積分能消除階躍輸入的穩態誤差,這時可以將比例系數調得小一些,
如果積分作用太強(即積分時間太小),相當于每次微調電位器的角度值過大,其累積的作用會使系統輸出的動態性能變差,超調量增大,甚至使系統不穩定,積分作用太弱(即積分時間太大),則消除穩態誤差的速度太慢,積分時間的值應取得適中,
4.微分作用
誤差的微分就是誤差的變化速率,誤差變化越快,其微分絕對值越大,誤差增大時,其微分為正;誤差減小時,其微分為負,控制器輸出量的微分部分與誤差的微分成正比,反映了被控量變化的趨勢,
有經驗的操作人員在溫度上升過快,但是尚未達到設定值時,根據溫度變化的趨勢,預感到溫度將會超過設定值,出現超調,于是調節電位器的轉角,提前減小加熱的電流,這相當于士兵射擊遠方的移動目標時,考慮到子彈運動的時間,需要一定的提前量一樣,

4圖2 階躍回應曲線
圖2中的c (∞)為被控量c (t)的穩態值或被控量的期望值,誤差e(t) = c (∞) - c (t),在圖2中啟動程序的上升階段,當 時,被控量尚未超過其穩態值,但是因為誤差e(t)不斷減小,誤差的微分和控制器輸出的微分部分為負值,減小了控制器的輸出量,相當于提前給出了制動作用,以阻礙被控量的上升,所以可以減少超調量,因此微分控制具有超前和預測的特性,在超調尚未出現之前,就能提前給出控制作用,
倍訓控制系統的振蕩甚至不穩定的根本原因在于有較大的滯后因素,因為微分項能預測誤差變化的趨勢,這種“超前”的作用可以抵消滯后因素的影響,適當的微分控制作用可以使超調量減小,增加系統的穩定性,
對于有較大的滯后特性的被控物件,如果PI控制的效果不理想,可以考慮增加微分控制,以改善系統在調節程序中的動態特性,如果將微分時間設定為0,微分部分將不起作用,
微分時間與微分作用的強弱成正比,微分時間越大,微分作用越強,如果微分時間太大,在誤差快速變化時,回應曲線上可能會出現“毛刺”,
微分控制的缺點是對干擾噪聲敏感,使系統抑制干擾的能力降低,為此可在微分部分增加慣性濾波環節,
5.采樣周期
PID控制程式是周期性執行的,執行的周期稱為采樣周期,采樣周期越小,采樣值越能反映模擬量的變化情況,但是太小會增加CPU的運算作業量,相鄰兩次采樣的差值幾乎沒有什么變化,將使PID控制器輸出的微分部分接近為零,所以也不宜將采樣周期取得過小,
應保證在被控量迅速變化時(例如啟動程序中的上升階段),能有足夠多的采樣點數,不致因為采樣點數過少而丟失被采集的模擬量中的重要資訊,
6.PID引數的調整方法
在整定PID控制器引數時,可以根據控制器的引數與系統動態性能和穩態性能之間的定性關系,用實驗的方法來調節控制器的引數,有經驗的除錯人員一般可以較快地得到較為滿意的除錯結果,在除錯中最重要的問題是在系統性能不能令人滿意時,知道應該調節哪一個引數,該引數應該增大還是減小,
為了減少需要整定的引數,首先可以采用PI控制器,為了保證系統的安全,在除錯開始時應設定比較保守的引數,例如比例系數不要太大,積分時間不要太小,以避免出現系統不穩定或超調量過大的例外情況,給出一個階躍給定信號,根據被控量的輸出波形可以獲得系統性能的資訊,例如超調量和調節時間,應根據PID引數與系統性能的關系,反復調節PID的引數,
如果階躍回應的超調量太大,經過多次振蕩才能穩定或者根本不穩定,應減小比例系數、增大積分時間,如果階躍回應沒有超調量,但是被控量上升過于緩慢,過渡程序時間太長,應按相反的方向調整引數,
如果消除誤差的速度較慢,可以適當減小積分時間,增強積分作用,
反復調節比例系數和積分時間,如果超調量仍然較大,可以加入微分控制,微分時間從0逐漸增大,反復調節控制器的比例、積分和微分部分的引數,
總之,PID引數的除錯是一個綜合的、各引數互相影響的程序,實際除錯程序中的多次嘗試是非常重要的,也是必須的,
三、STM32代碼控制說明
1.硬體電路搭建
本實驗使用司南電氣控制STM32單片機開發板 來實作使用PID演算法對啊直流電機的速度控制,實驗材料:
①司南電氣控制STM32單片機開發板
②帶編碼器的直流電機
③OLED顯示屏
接線如圖:

2.軟體實作
PID演算法,速度控制代碼如下:
PID pid; //存放PID演算法所需要的資料
void PID_Calc() //pid計算
{
u8 strr[2],str[2]; //檢測脈沖變數
float DelEk;
float ti,ki;
// float Iout;
// float Pout;
// float Dout;
float td;
float kd;
float out;
extern float pulse; //檢測脈沖變數
if(pid.C200ms<(pid.T)) //計算時間未到,200ms
{
return ;
}
LED4=!LED4;
//為什么是2.84?
/*
因為電機轉一圈黃色線向單片機輸出105.6個脈沖
=>pulse/105.6 (200ms的圈數)
=>(pulse/105.6)*5 (1s的圈數)
=>(pulse/105.6)*5*60 (1min的圈數)
=> pulse*2.48 (1min的圈數)
*/
pid.Pv = pulse * 2.84; //速度采樣
pid.Ek=pid.Sv-pid.Pv; //得到當前的偏差值
pid.Pout=pid.Kp*pid.Ek; //比例輸出
pid.SEk+=pid.Ek; //歷史偏差總和
DelEk=pid.Ek-pid.Ek_1; //最近兩次偏差之差
ti=pid.T/pid.Ti;
ki=ti*pid.Kp;
pid.Iout=ki*pid.SEk*pid.Kp; //積分輸出
td=pid.Td/pid.T;
kd=pid.Kp*td;
pid.Dout=kd*DelEk; //微分輸出
out= pid.Pout+ pid.Iout+ pid.Dout;
//
if(out>pid.pwmcycle)
{
pid.OUT=pid.pwmcycle;
}
else if(out<0)
{
pid.OUT=pid.OUT0;
}
else
{
pid.OUT=out;
}
//pid.OUT+=; //本次的計算結果
pid.Ek_1=pid.Ek; //更新偏差
TIM2->CCR1 = (u16)pid.OUT;TIM2->CCR4 = 0; //PWM輸出
TIM2->CCR2 = 0;TIM2->CCR3 =(u16)pid.OUT; //PWM輸出
sprintf(strr,"%0.1f\0",pid.OUT); //列印PWM輸出值
OLED_ShowString(48,3,strr); //列印PWM輸出值
sprintf(str,"%0.1f\0",pid.Pv); //列印當前速度輸出值
OLED_ShowString(56,6,str); //列印當前速度輸出值
pid.C200ms = 0;
pulse = 0; //檢測脈沖變數清零
}
具體代碼工程壓縮包可在下章下載,如需要技術指導,小編QQ:1642172446
小編也是好學電子發燒友哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/162243.html
標籤:其他
上一篇:Python 使用 asyncio 時出現 RuntimeError: This event loop is already running 的解決方法
