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

前言

本文首先向铁头山羊致敬!在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的仿真,希望可以帮到大家。

<think>好的,我需要帮用户找到铁头山羊STM32笔记相关的代码示例或下载资源。首先,我应该回忆一下用户提供的引用内容,看看是否有相关的线索。 用户提到的引用[1]是关于STM32CubeMX教程和IIC读取AT24C02的HAL库代码,这可能与铁头山羊的内容相关,因为很多STM32教程会覆盖类似的外设操作。引用[2]是正点原子的HAL库开发视频,引用[3]和[4]涉及错误处理和FLASH地址定义,但没直接提到铁头山羊铁头山羊可能是一个比较小众的昵称或特定作者的笔记,我需要确认是否有公开的资源。常见的平台如CSDN、GitHub、B站或者电子论坛可能会有相关的内容。用户提到的杨桃电子笔记在引用[4]中出现,可能与铁头山羊有关联,或者是同一作者的不同命名? 接下来,我应该建议用户搜索CSDN、GitHub、B站等平台,使用准确的关键词组合,比如“铁头山羊 STM32 笔记 代码”。同时,检查是否有官方提供的下载链接,或者联系作者获取资源。另外,参考已有的STM32代码示例,如引用[1]中的I2C代码,也能帮助用户进行开发。 需要提醒用户注意代码的兼容性和验证,确保与他们的硬件匹配。如果找不到具体资源,建议他们参考其他可靠的STM32教程,如正点原子或野火的资料,这些通常有详细的代码示例和文档支持。</think>关于寻找“铁头山羊STM32笔记”相关的代码示例或下载资源,以下是分步解答和建议: --- ### **步骤1:确认资源名称和来源** - **名称核对**:请确认“铁头山羊”是否为特定作者或教程的昵称。例如,引用[4]中提到的“杨桃电子笔记”可能与“铁头山羊”相关,或是同一作者的不同命名。 - **来源平台**:STM32学习资料常见于以下平台: - **CSDN博客**(如引用[1]中的HAL库教程)[^1] - **Bilibili视频教程**(如引用[2]中正点原子的视频)[^2] - **GitHub/Gitee代码仓库** - **电子论坛**(如电子工程世界、STM32中文社区) --- ### **步骤2:针对性搜索方法** 1. **平台搜索**: - 在CSDN中搜索:`site:csdn.net 铁头山羊 STM32 笔记 代码` - 在B站搜索:`铁头山羊 STM32 教程` - 在GitHub搜索:`TieTouShanYang STM32` 或 `铁头山羊 STM32` 2. **验证作者身份**: - 如果“铁头山羊”是个人博主,检查其是否在多个平台同步更新(如个人博客、GitHub)。 --- ### **步骤3:替代方案与参考代码** 若无法找到直接资源,可参考以下相似教程的代码实现: 1. **I2C读写AT24C02**(引用[1]的代码片段): ```c // HAL库I2C读取AT24C02示例 HAL_I2C_Mem_Read(&hi2c1, 0xA0, 0x00, I2C_MEMADD_SIZE_8BIT, buffer, 1, 100); ``` 2. **FLASH操作**(引用[4]的地址定义): ```c #define FLASH_START_ADDR 0x0801f000 // STM32 FLASH写入地址定义 HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, data); ``` [^4] --- ### **步骤4:注意事项** 1. **代码兼容性**:确保代码与你的STM32型号(如F1/F4系列)及HAL库版本匹配。 2. **报错处理**:若遇到类似`Error:C9555E`的编译错误,检查工程配置和芯片型号是否一致[^3]。 --- ### **步骤5:主动联系作者** - 若在CSDN/B站等平台找到相关文章或视频,可通过私信或评论区联系作者索取代码。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值