当前位置: 首页 > 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.lryc.cn/news/610653.html

相关文章:

  • IDEA JAVA工程入门
  • 8.5 CSS3-flex弹性盒子
  • Datart:开源数据可视化的新星,赋能企业数据分析
  • Android 之 Kotlin中的kapt
  • FPGA学习笔记——简易的DDS信号发生器
  • pyspark中的kafka的读和写案例操作
  • RocketMq如何保证消息的顺序性
  • 基于deepSeek的流式数据自动化规则清洗案例【数据治理领域AI带来的改变】
  • SpringBoot3.x入门到精通系列:4.2 整合 Kafka 详解
  • NLP——BERT模型全面解析:从基础架构到优化演进
  • 家常菜点餐|基于java和小程序的家庭大厨家常菜点餐系统设计与实现(源码+数据库+文档)
  • 一次“无告警”的服务器宕机分析:从无迹可寻到精准定位
  • 一文掌握Bard机器翻译,以及用python调用的4种方式(现已升级为 Gemini)
  • vue3通过按钮实现横向滚动或鼠标滚动横坐标滚动
  • 用 Python 构建高质量的中文 Wikipedia 语料库:从原始 XML 到干净段落
  • 【taro react】 ---- useModel 数据双向绑定 hook 实现
  • 【乐企板式文件生成工程】关于乐企板式文件(PDF/OFD/XML)生成工程介绍
  • Taro Hooks 完整分类详解
  • wps创建编辑excel customHeight 属性不是标准 Excel Open XML导致比对异常
  • 云计算一阶段Ⅱ——11. Linux 防火墙管理
  • 《Node.js与 Elasticsearch的全文搜索架构解析》
  • Sentinel全面实战指南
  • 剑指offer第2版:字符串
  • Day34 GPU训练及类的call方法
  • Android audio之 AudioDeviceInventory
  • PCBA电子产品复制全攻略:从入门到精通
  • 【音视频】WebRTC 一对一通话-信令服
  • 强化学习_Paper_1991_Reinforcement learning is direct adaptive optimal control
  • 自然语言处理×第三卷:文本数据分析——她不再只是贴着你听,而开始学会分析你语言的结构
  • python+MySQL组合实现生成销售财务报告