主頁 >  其他 > stm32直流電機控制—PID演算法篇

stm32直流電機控制—PID演算法篇

2020-10-07 19:50:40 其他

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=(Kp
Ek-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/qita/161788.html

標籤:其他

上一篇:Python 使用 asyncio 時出現 RuntimeError: This event loop is already running 的解決方法

下一篇:機器學習之梯度下降演算法(python實作)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more