基于铁头山羊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的仿真,希望可以帮到大家。

相关推荐
码小文2 小时前
Altium Designer 22使用笔记(4)---添加封装、ERC检查、PDF文档与BOM生成
笔记·嵌入式硬件·硬件工程·学习方法·硬件经验
猫猫的小茶馆2 小时前
【STM32】HAL库中的实现(四):RTC (实时时钟)
stm32·单片机·嵌入式硬件·mcu·51单片机·实时音视频·pcb工艺
努力做小白2 小时前
Linux驱动25 --- RkMedia音频API使用&&增加 USB 音视频设备
linux·驱动开发·单片机·嵌入式硬件·音视频
文火冰糖的硅基工坊3 小时前
[硬件电路-140]:模拟电路 - 信号处理电路 - 锁定放大器概述、工作原理、常见芯片、管脚定义
嵌入式硬件·架构·信号处理·电路·跨学科融合
机器视觉知识推荐、就业指导3 小时前
STM32 外设驱动模块一:LED 模块
stm32·单片机·嵌入式硬件
绿炮火4 小时前
【MATLAB】(八)矩阵
人工智能·matlab·矩阵
yiqiqukanhaiba4 小时前
STM32学习笔记2-GPIO的输出模式
笔记·stm32·学习
Sean_woo19984 小时前
正点原子阿波罗STM32F429IGT6移植zephyr rtos(四)---在独立的应用工程里使用MPU6050
stm32·单片机·嵌入式硬件·zephyr
亿道电子Emdoor11 小时前
【ARM】MDK自动备份源文件
arm开发·单片机·嵌入式硬件·arm