基于铁头山羊STM32的平衡车电机转速开环闭环matlab仿真

基于铁头山羊STM32的平衡车电机转速开环闭环matlab仿真

前言

本文首先向铁头山羊致敬!在B站上的讲平衡车的视频做的不错,具体大家可以点击这个链接跳转观看。

本文的内容是针对电机开环传递函数和闭环传递函数的matlab仿真,涉及一些内部的函数,经过仿真,对实际的控制系统理解更深一步。

一、电机开环传递函数

对于开环传递函数是铁头山羊在B站视频里一步步推导,最后测量参数得出来的,大家有疑问可以去看看,最后的传递函数是下面我输入matlab的公式。

1.1 电机开环传递函数的零极点

使用Matlab绘制波特图,求系统的参数:

matlab 复制代码
clc
clear
s = tf('s');
%电机的开环传递函数
MotorOpenLoopTransferFun = 5.591/((s/14.2 +1)*(s/1962+1))
zpk_MotorOpenLoopTransferFun = zpk(MotorOpenLoopTransferFun)

输出的结果:

matlab 复制代码
MotorOpenLoopTransferFun =
 
         1.558e05
  -----------------------
  s^2 + 1976 s + 2.786e04
 
连续时间传递函数。

zpk_MotorOpenLoopTransferFun =
 
     1.5577e+05
  -----------------
  (s+1962) (s+14.2)
 
连续时间零点/极点/增益模型。

显然,没有零点,极点有-1962,-14.2。采用matlab帮我们整理一下:

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 求系统的参数和绘制波特图

matlab 复制代码
[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。

matlab 复制代码
%电机开环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°,明显右移了,系统响应速度加快了。

三、电机系统闭环传递函数

matlab 复制代码
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 =

0

MotorCloseLoop_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()

使用函数:

matlab 复制代码
[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.0log(0)(对数趋近负无穷)。
  • 特点
    • 参与运算时可能保持无穷(如 inf + 1 = inf)。
    • 比较操作中,inf 大于任何有限数(如 inf > 1e100true)。

5.5.2 NaN(Not a Number,非数值)

  • 含义:表示计算结果未定义或无效。
  • 产生场景
    • 数学上无意义的运算:0.0 / 0.0sqrt(-1.0)(对负数开平方)。
    • 涉及 NaN 的运算:NaN + 1sin(NaN)
    • 数据缺失或未初始化(某些编程语言中)。
  • 特点
    • 具有"传染性":任何与 NaN 的运算结果仍是 NaN
    • 比较操作中,NaN 不等于任何值(包括自身):NaN == NaN 返回 false

本文结束,涉及了matlab的仿真,希望可以帮到大家。

相关推荐
cjy_Somnr12 小时前
keil5报错显示stm32的SWDIO未连接不能烧录
stm32·单片机·嵌入式硬件
Lay_鑫辰13 小时前
西门子诊断-状态和错误位(“轴”工艺对象 V1...3)
服务器·网络·单片机·嵌入式硬件·自动化
无垠的广袤15 小时前
【工业树莓派 CM0 NANO 单板计算机】本地部署 EMQX
linux·python·嵌入式硬件·物联网·树莓派·emqx·工业物联网
雲烟17 小时前
嵌入式设备EMC安规检测参考
网络·单片机·嵌入式硬件
泽虞17 小时前
《STM32单片机开发》p7
笔记·stm32·单片机·嵌入式硬件
田甲17 小时前
【STM32】 数码管驱动
stm32·单片机·嵌入式硬件
up向上up18 小时前
基于51单片机垃圾箱自动分类加料机快递物流分拣器系统设计
单片机·嵌入式硬件·51单片机
单片机日志1 天前
【单片机毕业设计】【mcugc-mcu826】基于单片机的智能风扇系统设计
stm32·单片机·嵌入式硬件·毕业设计·智能家居·课程设计·电子信息
东荷新绿1 天前
MATLAB 2018a 安装教程:30分钟搞定安装
开发语言·matlab·matlab2018a
松涛和鸣1 天前
从零开始理解 C 语言函数指针与回调机制
linux·c语言·开发语言·嵌入式硬件·排序算法