基于鐵頭山羊STM32的平衡車電機轉速開環閉環matlab仿真
- 前言
- 一、電機開環傳遞函數
- 1.1 電機開環傳遞函數的零極點
- 1.2 求系統的參數和繪制波特圖
- 二、增加PI控制器后系統開環傳遞函數
- 三、電機系統閉環傳遞函數
- 四、simulink仿真
- 五、幅值裕度、相位裕度、相位穿越頻率和截止頻率(補充知識)
- 5.1 幅值裕度(Gain Margin, GM)
- 5.2 相位裕度(Phase Margin, PM)
- 5.3 相位穿越頻率(Phase Crossover Frequency, Wcg)
- 5.4 截止頻率(Gain Crossover Frequency, Wcp)
- 5.5 matlab函數margin()
- 5.5.1 `inf`(Infinity,無窮大)
- 5.5.2 `NaN`(Not a Number,非數值)
前言
本文首先向鐵頭山羊致敬!在B站上的講平衡車的視頻做的不錯,具體大家可以點擊這個鏈接跳轉觀看。
本文的內容是針對電機開環傳遞函數和閉環傳遞函數的matlab仿真,涉及一些內部的函數,經過仿真,對實際的控制系統理解更深一步。
一、電機開環傳遞函數
對于開環傳遞函數是鐵頭山羊在B站視頻里一步步推導,最后測量參數得出來的,大家有疑問可以去看看,最后的傳遞函數是下面我輸入matlab的公式。
1.1 電機開環傳遞函數的零極點
使用Matlab繪制波特圖,求系統的參數:
clc
clear
s = tf('s');
%電機的開環傳遞函數
MotorOpenLoopTransferFun = 5.591/((s/14.2 +1)*(s/1962+1))
zpk_MotorOpenLoopTransferFun = zpk(MotorOpenLoopTransferFun)
輸出的結果:
MotorOpenLoopTransferFun =1.558e05-----------------------s^2 + 1976 s + 2.786e04連續時間傳遞函數。zpk_MotorOpenLoopTransferFun =1.5577e+05-----------------(s+1962) (s+14.2)連續時間零點/極點/增益模型。
顯然,沒有零點,極點有-1962,-14.2。采用matlab幫我們整理一下:
%增益
MotorOpenLoopTransferFun_K = dcgain(MotorOpenLoopTransferFun)
%零點
MotorOpenLoopTransferFun_Z = zero(MotorOpenLoopTransferFun)
%極點
MotorOpenLoopTransferFun_P = pole(MotorOpenLoopTransferFun)
輸出:
MotorOpenLoopTransferFun_K =
5.5910
MotorOpenLoopTransferFun_Z =
空的 0×1 double 列向量
MotorOpenLoopTransferFun_P =
1.0e+03 *
-1.9620
-0.0142
對輸出結果分析一下,零點是空的列向量,就是沒有零點,極點是-1.920 * 1.0e+03,就是-1.926乘以10的3次方,另一個極點-0.0142 * 1.0e+03,就是-0.0142乘以10的3次方。而增益是5.5910是我們最初設定的開環傳遞函數分子的值,是系統的直流(DC)增益。
1.2 求系統的參數和繪制波特圖
[MotorOpenLoop_Gm MotorOpenLoop_PM MotorOpenLoop_Wcg MotorOpenLoop_Wcp] = margin(MotorOpenLoopTransferFun);
% 波特圖
figure;
bode(MotorOpenLoopTransferFun);
title('電機的開環波特圖');
grid on;
輸出:
MotorOpenLoop_Gm =
Inf
MotorOpenLoop_PM =
98.0336
MotorOpenLoop_Wcg =
Inf
MotorOpenLoop_Wcp =
78.0478
二、增加PI控制器后系統開環傳遞函數
PI控制器的參數是我實際調試中確定的。 Kp = 0.5, Ki = 4.5。
%電機開環PI控制器
C_Motor = pid(0.5,4.5,0)
%電機和PI控制器串聯的開環傳遞函數
MotorOpen_C_LoopTransferFun = MotorOpenLoopTransferFun*C_Motor%%%%%%%%%%%%%%%%%%%%%%%%%%%% 求加上PI控制器的系統參數 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MotorOpen_C_LoopTransferFun_P = pole(MotorOpen_C_LoopTransferFun)
%增益
MotorOpen_C_LoopTransferFun_K = dcgain(MotorOpen_C_LoopTransferFun)
%零點
MotorOpen_C_LoopTransferFun_Z = zero(MotorOpen_C_LoopTransferFun)
%極點
MotorOpen_C_LoopTransferFun_P = pole(MotorOpen_C_LoopTransferFun)
[z,p,k] = zpkdata(MotorOpen_C_LoopTransferFun,'v')[MotorOpenLoopPID_Gm MotorOpenLoopPID_PM MotorOpenLoopPID_Wcg MotorOpenLoopPID_Wcp] = margin(MotorOpen_C_LoopTransferFun);
% 波特圖
figure;
bode(MotorOpen_C_LoopTransferFun);
title('加上PID的電機開環波特圖');
grid on;
輸出:
C_Motor = Kp + Ki * 1 / s
且 Kp = 0.5, Ki = 4.5
并聯型的連續時間 PI 控制器。MotorOpen_C_LoopTransferFun =
7.788e04 s + 7.01e05 --------------------------- s^3 + 1976 s^2 + 2.786e04 s 連續時間傳遞函數。
MotorOpen_C_LoopTransferFun_P =
1.0e+03 *
0 -1.9620 -0.0142
MotorOpen_C_LoopTransferFun_K =
Inf
MotorOpen_C_LoopTransferFun_Z =
-9
MotorOpen_C_LoopTransferFun_P =
1.0e+03 *
0 -1.9620 -0.0142
z =
-9
p =
1.0e+03 *
0 -1.9620 -0.0142
k =
7.7884e+04
MotorOpenLoopPID_Gm =
Inf
MotorOpenLoopPID_PM =
96.0149
MotorOpenLoopPID_Wcg =
Inf
MotorOpenLoopPID_Wcp =
38.2215
上面的zpkdata()
函數實際上也求出了傳遞函數的零極點和增益。
低頻段的斜率上升了,截止頻率是38.2,相位裕度是96°,系統很穩定。加PID之前截止頻率是78°,明顯右移了,系統響應速度加快了。
三、電機系統閉環傳遞函數
MotorCloseLoopTransferFun = feedback(MotorOpen_C_LoopTransferFun, 1)%%%%%%%%%%%%%%%%%%%%%%%%%%%% 求電機閉環參數 begin %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[MotorCloseLoop_Gm MotorCloseLoop_PM MotorCloseLoop_Wcg MotorCloseLoop_Wcp] = margin(MotorCloseLoopTransferFun)% %增益
MotorCloseLoop_K = dcgain(MotorCloseLoopTransferFun)% 波特圖
figure;
bode(MotorCloseLoopTransferFun);
title('電機閉環波特圖');
grid on;
輸出:
MotorCloseLoopTransferFun =
7.788e04 s + 7.01e05 ------------------------------------- s^3 + 1976 s^2 + 1.057e05 s + 7.01e05 連續時間傳遞函數。
MotorCloseLoop_Gm =
Inf
MotorCloseLoop_PM =
-180
MotorCloseLoop_Wcg =
Inf
MotorCloseLoop_Wcp =
0MotorCloseLoop_K =
1
由波特圖可知,相位裕度PM應該是180°,而不是輸出的-180°,這是matlab的計算誤差導致的。如果是-180°,那么系統就不穩定了!而且閉環增益等于1。
閉環增益等于1表示:
-
穩態時,系統的輸出能無誤差地跟蹤輸入(對于階躍輸入或直流信號)。
-
輸入信號經過閉環系統后,幅值既不放大也不衰減,保持原樣。
-
典型場景:單位負反饋系統(如跟隨器、伺服系統等)。
下面是階躍響應前后的區別。
四、simulink仿真
在simulink里面繪制如下的框圖。
這里的參數是上面電機開環傳遞函數的分子、分母系數。大家對照看一下。
對于PID的參數,也是實際上的參數。跟上面matlab代碼里的是一致的。
把上面代碼的部分截圖在這里,方便大家對照著看。
對于電機閉環傳遞函數,輸入單位階躍響應后,得到的波特圖。
五、幅值裕度、相位裕度、相位穿越頻率和截止頻率(補充知識)
在控制系統的頻域分析中,幅值裕度、相位裕度、相位穿越頻率和截止頻率是關鍵指標,用于衡量系統的穩定性和動態性能。以下是它們的詳細解釋:
5.1 幅值裕度(Gain Margin, GM)
-
定義:幅值裕度是指系統在相位達到?180°(相位穿越頻率)時,開環幅頻特性(|G(jω)|)距離0 dB的差值。
-
物理意義:表示系統在臨界穩定(?180°相位)時允許增益增大的最大倍數。GM > 0 dB 時系統穩定,值越大穩定性越強。
5.2 相位裕度(Phase Margin, PM)
-
定義:相位裕度是指系統在幅值穿越頻率(截止頻率)處,相位角與?180°的差值。
-
物理意義:反映系統動態響應的穩健性。PM > 0° 時系統穩定,典型設計目標為 30°~60°,值越大 transient 響應超調越小。
5.3 相位穿越頻率(Phase Crossover Frequency, Wcg)
- 定義:開環系統相位角達到?180°時的頻率。
- 作用:用于計算幅值裕度。若在此頻率處幅值增益≥0 dB,系統會振蕩(臨界穩定)。
5.4 截止頻率(Gain Crossover Frequency, Wcp)
- 定義:開環系統幅值增益為0 dB(|G(jω)|=1)時的頻率,也稱幅值穿越頻率。
- 作用:反映系統帶寬,影響響應速度。截止頻率越高,系統響應越快,但抗高頻噪聲能力可能下降。
5.5 matlab函數margin()
使用函數:
[Gm,Pm,Wcg,Wcp] = margin(sys)
返回值:
Gm
是幅值裕度;Pm
是相位裕度;Wcg
是相位穿越頻率;Wcp
是截止頻率。
結合上圖更有助于理解上面的概念。
5.5.1 inf
(Infinity,無窮大)
- 含義:表示一個數值超出了計算機浮點數能表示的范圍(即“無窮大”)。
- 產生場景:
- 正無窮(+inf):例如
1.0 / 0.0
(除零)、exp(1000)
(指數爆炸)。 - 負無窮(-inf):例如
-1.0 / 0.0
、log(0)
(對數趨近負無窮)。
- 正無窮(+inf):例如
- 特點:
- 參與運算時可能保持無窮(如
inf + 1 = inf
)。 - 比較操作中,
inf
大于任何有限數(如inf > 1e100
為true
)。
- 參與運算時可能保持無窮(如
5.5.2 NaN
(Not a Number,非數值)
- 含義:表示計算結果未定義或無效。
- 產生場景:
- 數學上無意義的運算:
0.0 / 0.0
、sqrt(-1.0)
(對負數開平方)。 - 涉及
NaN
的運算:NaN + 1
、sin(NaN)
。 - 數據缺失或未初始化(某些編程語言中)。
- 數學上無意義的運算:
- 特點:
- 具有“傳染性”:任何與
NaN
的運算結果仍是NaN
。 - 比較操作中,
NaN
不等于任何值(包括自身):NaN == NaN
返回false
。
- 具有“傳染性”:任何與
本文結束,涉及了matlab的仿真,希望可以幫到大家。