当前位置: 首页 > news >正文

基于铁头山羊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 =
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()

使用函数:

[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的仿真,希望可以帮到大家。

http://www.dtcms.com/a/316731.html

相关文章:

  • 线性规划最优解
  • 饿了么招java开发咯
  • tarjan找SCC,缩点建DAG,找唯一源头节点
  • 强光干扰下误报率↓82%!陌讯多模态融合算法在火焰识别的落地优化
  • 不可变集合
  • nflsoi 7.31 题解
  • 信息化项目验收,项目成功的最后确认
  • Redis中的sdshdr的len和alloc那块的知识点详解
  • 【经验记录贴】在windows系统中启动服务
  • CMU-15445(7)——PROJECT#2-BPlusTree-Task#2Task#3
  • BGA 芯片贴片加工关键注意事项
  • Fiddler 中文版实战指南,如何构建高效的 API 调试工作流?
  • 第13届蓝桥杯Scratch_选拔赛_真题2021年11月27日
  • 老旧体育场馆照明翻新:预算有限?3 步实现 “低成本升级”
  • 在具身智能火热加持下,看 2025 年机器人学术年会中的热点主题。PNP机器人展示力控、灵巧手捕捉等案例。
  • 利用链上数据进行数字资产量化因子发现
  • 计划任务:被忽视的网络与系统安全边界
  • Linux-Day10.系统安全保护web服务管理
  • 【springcloud的配置文件不生效】
  • Linux系统:基础I/O
  • 【RK3576】【Android14】Uboot下fastboot命令支持
  • 闸机控制系统从设计到实现全解析:第 4 篇:Redis 缓存与分布式锁实现
  • JavaScript 概述
  • Linux 逻辑卷管理:LVM 原理与 Stratis、VDO 特性对比
  • Vue2博客项目笔记(第一天)
  • 防御保护3-4
  • STM32CubeIDE新建项目过程记录备忘(八)使用通用定时器中断生成PWM波形
  • LINUX 85 SHElL if else 前瞻 实例
  • MLS学习
  • vue3 计算属性