基于铁头山羊STM32的平衡车电机转速开环闭环matlab仿真
基于铁头山羊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的仿真,希望可以帮到大家。