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

【动手学电机驱动】STM32-MBD(5)Simulink 模型开发之 PWM 输出

STM32-MBD(1)安装 Simulink STM32 硬件支持包
STM32-MBD(2)Simulink 模型部署入门
STM32-MBD(3)Simulink 状态机模型的部署
STM32-MBD(4)Simulink 状态机实现按键控制
STM32-MBD(5)Simulink 模型开发之 PWM 输出
STM32-MBD(6)Simulink 模型开发之 ADC 转换

【动手学电机驱动】STM32-MBD(5)Simulink 模型开发之 PWM 输出

    • 1. Simulink/STM32 代码生成的软硬件条件和环境测试
      • 1.1 软硬件条件
      • 1.2 开发环境测试
    • 2. 基于 Simulink 模型开发之 PWM 信号输出
      • 2.1 创建 Simulink 仿真模型
      • 2.2 从 Simulink 创建 STM32CubeMX 工程
      • 2.3 搭建 Simulink 仿真模型
      • 2.4 配置 STM32CubeMX 工程
      • 2.5 从 Simulink 模型生成 STM32 代码
    • 3. 基于 Simulink 模型开发之 三路 PWM 信号输出
      • 3.1 创建 Simulink 仿真模型
      • 3.2 从 Simulink 创建 STM32CubeMX 工程
      • 3.3 搭建 Simulink 仿真模型
      • 3.4 配置 STM32CubeMX 工程
      • 3.5 从 Simulink 模型生成 STM32 代码
    • 4. 基于 Simulink 模型开发之 互补 PWM 信号输出
      • 4.1 创建 Simulink 仿真模型
      • 4.2 从 Simulink 创建 STM32CubeMX 工程
      • 4.3 搭建 Simulink 仿真模型
      • 4.4 配置 STM32CubeMX 工程
      • 4.5 从 Simulink 模型生成 STM32 代码

PWM 输出实验既是学习使用 STM32G4 的入门内容 ,也是电机控制的基础。前文 【动手学电机驱动】STM32-FOC(3)STM32 三路互补 PWM 输出 使用 STM32CubeIDE 开发工具,创建、配置新项目,编写程序代码,编译与调试程序。

本文采用 NUCLEO-G431RB 开发板,使用 Simulink 建立 STM32G431 的 PWM 输出、互补PWM输出 和 三路互补 PWM输出 的仿真模型,直接生成 STM32 项目工程代码,将仿真模型部署到基于 STM32G431 处理器的硬件板。


1. Simulink/STM32 代码生成的软硬件条件和环境测试

Simulink/STM32 代码生成对于软硬件和开发环境的要求非常严格,很容易由于版本不匹配或路径错误而失败。作者已经踩过了很多的坑,可以说是我在所有开发项目中都从未经历过的。


1.1 软硬件条件

关于所需的软硬件条件和安装过程,详见 【STM32-MBD】(1)安装 Simulink STM32 硬件支持包。
强烈建议安装相关软件时使用推荐版本。
请严格按照文中介绍的步骤安装和配置软件。

必需的硬件:

  • STM32 开发板(如:NUCLEO-G431RB 开发板,也可以选择其它 STM32 开发板,但需要安装对应的固件包)。
  • Micro-micro USB 数据线,或 USB Type-A 至 Micro-B 连接线缆,用于将STM32 Nucleo 板连接到 PC。

必需的软件:

  • STM32 开发工具(建议首先严格使用推荐版本跑通本文项目)

    • STM32CubeMX (推荐使用 V6.4.0)
    • STM32CubeProgrammer (推荐使用 V2.6.0)
    • STM32CubeIDE(或 Keil,MDK-ARM 等 IDE 工具)
    • STM32Cube_FW_G4 固件包(推荐采用 V1.5.0)
      如果使用其它 STM32 MCU,则需选择对应的固件包。例如使用 STM32F4 时则要选择STM32Cube_FW_F4_V1.26.0 固件包。
  • MATLAB/Simulink(本文使用 MATLAB R2022b,可以采用更新版本)

    • Simulink Coder:从 Simulink 模型、Stateflow 图和 MATLAB 函数生成并执行 C 和 C++ 代码,用于实时和非实时应用,包括仿真加速、快速原型构建和硬件在环测试
    • STM32 嵌入式硬件支持包,Embedded Coder Support Package for STMicroelectronics STM32 Processors,STM32 处理器的嵌入式硬件支持包

1.2 开发环境测试

为了确定 Simulink/STM32 代码生成 的开发环境安装配置成功,首先要逐项进行检查测试。具体步骤详见 【STM32-MBD】(2)Simulink 模型部署入门。

  1. 运行 STM32CubeMX,菜单选择 Help–About,检查版本为 V6.4.0。

  2. 在 STM32CubeMX 菜单选择 Help–Manage embedded software packages,检查已安装 STM32Cube MCU Package for STM32G4 Series V1.5.0 固件包。

  3. 运行 STM32CubeProgrammer,测试与 STM32 开发板的连接。
    (1)连接计算机与 NUCLEO-G431RB 开发板。
    (2)运行 STM32CubeProgrammer,点击右上角 “Connect” 按钮连接设备,检查与 STM32 开发板的连接正常。

  4. 运行 Matlab,菜单选择 主页–附加功能–管理附加功能,弹出“附加功能管理器”窗口,检查已安装 STM32 嵌入式硬件支持包 “Embedded Coder Support Package for STMicroelectronics STM32 Processors”。

  5. 点击齿轮图标“设置” STM32 嵌入式硬件支持包:
    (1)选择所使用的 MCU 型号(本文为 STM32Gxx Based MCUs)。
    (2)提示必需的 STM32 工具及版本(STM32CubeMX、STM32CubeProgrammer)。
    (3)对 STM32CubeMX 进行验证:点击 “Browse” 选择 STM32CubeMX 的安装路径,点击 “Validate” 进行验证。
    (4)对 STM32CubeProgrammer 进行验证:点击“Browse”选择 STM32CubeProgrammer 的安装路径,点击 “Validate” 进行验证。


2. 基于 Simulink 模型开发之 PWM 信号输出

实验名称:4a. 基于 Simulink 模型开发之 PWM 信号输出
实验内容:利用 TIM1 定时器在引脚上输出一定频率和占空比的 PWM 信号。


2.1 创建 Simulink 仿真模型

  1. 为仿真模型新建一个子目录,例如:“D:\SimulinkProjects\STM32G431_MBD04a”。

  2. 运行 MATLAB 软件,打开 Simulink。点击 “空白模型” 创建新的 Simulink 模型,保存到本项目路径下:STM32G431_MBD04a.slx。

  3. 在 Simulink 菜单选择 “建模” - “模型设置” (也可以用 CTRL+E),打开“配置参数”对话框。
    左侧边栏中选择“求解器”,如下图所示。
    (1)在右侧 “仿真时间” 设置为 “inf”。
    (2)在 “求解器选择” 选项设置类型为 “定步长”,“固定步长(基础采样时间)” 设为 “1e-4” (对应于 MCU 的 ADC 采样频率为 10kHz)。
    (3)可选地,在 "任务和采样周期选项"下勾选:“将每个离散速率视为单独任务”和“自动处理数据传输的速率转换”。


2.2 从 Simulink 创建 STM32CubeMX 工程

  1. **检查 PC 与 STM32G431 开发板连接正常。**然后在“配置参数”窗口的左边栏中选择“硬件实现”,在右侧 “硬件板(Hardware board)” 选项的下拉框中选择 “STM32G4xx Based”。
    如下图所示,系统识别到目标设备为 STM32G4 系列,设备 ID为 STM32G431R(6-8-B)Tx。
    说明:
    (1)必须确保 PC 与 STM32G431 开发板连接正常,才能进行硬件配置。
    (2)根据使用的 STM32 的型号,从 “Hardware board” 中选择适当的硬件板选项,配合 STM32CubeMX 配置外设来实现对 STM32 硬件板的支持。本项目使用 STM32G431RB MCU,因此选择 “STM32G4xx Based”。

  2. 在右侧 “Hardware board settings” 配置 “Target hardware resources” ,创建一个STM32CubeMX 工程文件。
    (1)点击 “Create” 创建一个STM32CubeMX 工程文件 STM32G431_MBD04a.ioc。
    (2)点击 “Browse” 选择当前项目的目录,即仿真模型 .slx 与 CubeMX 项目 .ioc 要保存在同一个目录下。
    (3)在 “Project name” 输入 CubeMX 工程文件的文件名,如 STM32G431_MBD04a.ioc。
    (4)在 “Select hardware” 选择硬件开发板的型号,如本文使用 NUCLEO-G431RB。如果使用用户开发板,选择 “Custome STM32G4xx Based”。
    点击 “确定”,就在指定项目目录下创建 STM32CubeMX 工程文件 STM32G431_MBD04a.ioc。

在这里插入图片描述

  1. 选择硬件在环通信串口。
    点击 “Target hardware resources–Groups–Connectivity”,将 “USART/UART" 设为 “USART3”,将 “Serial port" 设为 电脑上的 COM 端口。具体端口号可以查看电脑”设备管理器“中的”端口(COM和LPT)“。

2.3 搭建 Simulink 仿真模型

回到 Simulink 仿真窗口,搭建仿真模型。

  1. 在仿真模型中添加 “PWM out” 模块并进行配置 。
    (1)在仿真模型中添加 “PWM out” 模块参数。
    点击菜单栏的 “库浏览器” 打开库浏览器,展开 “Embedded Coder Support Package for STMicroelectronics STM32 Processors – STM32G4xx Based Boards”。选择 “PWM out” 模块,将其拖动到右侧的模型。
    (2)设置 “PWM out” 模块参数。如图所示,按照 CubeMX 项目中的 GPIO 管脚配置。
    1)将 Timer module 设为 “TIM1”,
    2)将 “Duty Cycle unit” 设为 “Percentage”,
    3)勾选 “Enable channel 1” 以使能 Ch1;
    4)勾选 “Enable frequency input” 以启用频率输入(输入指将被写入计时器 TIM1 的自动重新加载寄存器,以设置计数器周期 ARR)。

在这里插入图片描述

  1. 设置 计数器周期 ARR 为 10000,CH1 的占空比为 50(%)。关于 ARR 的计算详见 CubeMX 配置部分。

在这里插入图片描述

  1. 完成搭建仿真模型,保存为文件 STM32G431_MBD04a.slx。注意仿真模型 .slx 与 CubeMX 项目 .ioc 要保存在相同的路径下。

2.4 配置 STM32CubeMX 工程

要支持在基于 STM32 处理器的板上运行 Simulink 模型,需要使用 STM32CubeMX 图形化工具。STM32CubeMX 工具采用图形界面,可用于配置 STM32 处理器的外设,并为所选的 STM32 处理器生成外设初始化代码。

STM32G4系列共有10个定时器:

  • 2 个基本定时器:TIM6,TIM7;
  • 3 个全功能通用定时器:TIM2,TIM3,TIM4;
  • 3 个通用定时器:TIM15,TIM16,TIM17,只有1个或者2个通道。
  • 2 个高级控制定时器:TIM1,TIM8,可以同时产生 7路 PWM输出。
    定时器要实现计数必须有时钟源。基本定时器时钟只能来自内部时钟,高级定时器和通用定时器还可以选择外部时钟源或者直接使用来自其他定时器的等待模式 。

本实验使用 TIM2 作为基础时钟源,TIM1 定时器产生PWM输出,详情参见 【动手学电机驱动】STM32-FOC(3)STM32 三路互补 PWM 输出。


  1. 运行 STM32CubeMX,打开通过 Simulink 创建的 CubeMX 工程文件 STM32G431_MBD04a.ioc。
    由于在 Simulink 中创建 CubeMX 工程文件时,在硬件选择时已经选择 NUCLEO-G431RB 开发板,该工程文件已经根据 NUCLEO-G431RB 开发板的要求完成了一些基本配置。但考虑对其它硬件开发板需要用户来配置,下面仍按一般步骤进行设置。

  2. 点击菜单栏 “Project Manager” 进入工程配置界面,如下图所示。——非常重要!
    (1)在 Project 中检查项目路径,确认CubeMX 项目文件 .ioc 与 Simulink 仿真模型 .slx 在相同的路径。
    (2)在 Toolchain/IDE 选择 IDE 工具为 “STM32CubeIDE”(也可以根据需要选择其它 IDE 工具 )。
    (3)在 Project 中勾选 “Do not generate the main()”,在生成代码时不生成 main.c 文件中的 main() 函数。
    (4)在 Project 中取消选中 “Generate Under Root”。
    (5)在 “Project” 中继续向下拉,“在 MCU and Firmware Package” 栏中,取消选中 “Use latest available version”,根据所安装的 G4 固件版本,选择 “STM32Cube FW_G4 V1.5.0”;
    如果固件包不是安装在默认路径,则要取消选中 “Use Default Firmware Location”,通过 Browse 选择固件包的安装路径。

在这里插入图片描述

  1. 在 Pinout Configuration 视图进行系统配置。
    (1)选择 “System Core – SYS” 设置调试器类型,将 Debug 设为 “Serial Wire”,
    (2)选择 “System Core – SYS” 设置基础时钟源,将 Timebase Source 设为 “TIM2”——非常重要!
    Timebase Source 默认为 “SysTick”,需要留作它用,因此必须修改为其它定时器。
    (3)选择 “System Core – RCC” 配置时钟模式,设置高速晶振为外部时钟,将 High Speed Clock (HSE) 设为 “Crystal/Ceramic Resonator”。
    在这里插入图片描述

  1. 点击 “Clock Configuration” 菜单按钮进入时钟频率设置界面,把 HCLK(MHz) 修改为 168MHz,APB2 peripheral clocks 设置为 168MHz。

在这里插入图片描述


  1. 在使用定时器时,要先使能(Enable)定时器,并设置定时器的频率。
    (1)在左侧 Categories 中选择 Timers – TIM1,配置 TIM1 的 Channel -1为 “PWM Generation CH1”;
    (2)在右侧 Pinout View 图中,将 PA8 管脚设置为 TIM1_CH1。

在这里插入图片描述

  1. 设置 100Hz,占空比为 50% 的 PWM。
    (1)计算 PWM 频率与占空比:
    f P W M = f T I M ( P S C + 1 ) ∗ ( A R R + 1 ) = 168 × 1 0 6 ( 167 + 1 ) ( 10000 ) = 100 ( H z ) d u t y = P u l s e A R R = 5000 / 10000 = 50 % \begin{matrix} f_{PWM} &= &\frac{f_{TIM}}{(PSC+1)*(ARR+1)} &=&\frac{168 \times 10^6}{(167+1)(10000)}&=100(Hz)\\ duty &= &\frac{Pulse}{ARR} &=& 5000/10000 &= 50\% \end{matrix} fPWMduty==(PSC+1)(ARR+1)fTIMARRPulse==(167+1)(10000)168×1065000/10000=100(Hz)=50%

(2)点击 “Pinout&Configuration” 菜单按钮,在左侧 Categories 中选择 Timers – TIM1,在 Configuration 中选择 Parameter Settings,

  • 在 “Counter Settings” 下,设置 Prescaler(PSC)为 (168-1);
  • 设置 Counter Mode 为 Up;
  • 设置 Counter Period(ARR)为 10000;
  • 在 “PWM Generation Channel 1” 下,设置 Pulse 为 5000。

则可以得到频率为100Hz,占空比为 50% 的 PWM。

在这里插入图片描述

  1. 点击菜单栏 “Project Manager” 进入工程配置界面。
    (1)在 Code Generator 中,勾选 “Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”,让每个外设生成独立的’.c/.h’文件。

(2)在 Advanced Settings 中,将 “Driver Selector” 全部设置为 “LL”(默认为 “HAL”),为外设选择低级 (LL) 驱动–非常重要! 否则编译会报错。

(3)在 Advanced Settings 中,将 “Generated Function Calls” 的 “Visibility(Static)” 勾选项全部取消,对所有外设初始化函数调用取消选择可见性(静态)。

在这里插入图片描述


  1. 完成以上配置后,使用快捷键 “CTL+S” 或点击 File–Save Project,保存 CubeMX 项目文件 STM32G431_MBD04a.slx。
    注意:在 STM32CubeMX 中配置完成后,不要点击 “GENERATE CODE” 生成代码,而是保存 .ioc 项目文件。

2.5 从 Simulink 模型生成 STM32 代码

  1. 在 Simulink 打开仿真模型 STM32G431_MBD04a.slx。

  2. 在 “硬件(Hardware)” 窗口点击 “编译、部署和启动”(Ctrl+B 快捷键),就启动模型 STM32G431_MBD04a 的编译过程,为模型生成代码,并加载到 NUCLEO-G431RB 开发板。

模型编译过程的主要信息显示在 “诊断查看器” 中,编译摘要如下。
如果编译中发生错误,错误信息也将显示在 “诊断查看器” 。

 顶层模型编译  
### 正在启动 STM32G431_MBD04a 的编译过程
### 正在为 '模型特定' 文件夹结构生成代码和工件
### 正在将代码生成到编译文件夹中: D:\MATLAB\SimulinkProjects\STM32G4\STM32G431_MBD04a\STM32G431_MBD04a_ert_rtw
### 'STM32G431_MBD04a' 的生成代码是最新的,因为未发现任何结构性、参数或代码替换库更改。
### 使用工具链: GNU Tools for ARM Embedded Processors
### 'D:\MATLAB\SimulinkProjects\STM32G4\STM32G431_MBD04a\STM32G431_MBD04a_ert_rtw\STM32G431_MBD04a.mk' 是最新的
### 正在编译 'STM32G431_MBD04b': "D:\Program Files\MATLAB\R2022b\bin\win64\gmake" ...
Download verified successfully
### Successful completion of build procedure for: STM32G431_MBD04a
编译过程已成功完成编译摘要  
编译的顶层模型目标:模型                操作           重新编译原因     
==========================================
STM32G431_MBD04a  代码已生成并完成编译。  生成的代码已过期。  编译了 1 个模型,共 1 个模型(0 个模型已经是最新的)
编译持续时间: 0h 0m 13.799s

在这里插入图片描述

  1. Simulink 通过调用 STM32CubeProgrammer 将编译的目标文件加载到 STM32 开发板。

  2. 使用示波器观察输出信号如下:

在这里插入图片描述


3. 基于 Simulink 模型开发之 三路 PWM 信号输出

实验名称:4b. 基于 Simulink 模型开发之 3路PWM 信号输出
实验内容:利用 TIM1 定时器在引脚上输出三路 PWM 信号。

为了节省篇幅,与上节 “单路PWM信号输出” 相同的内容只做概要叙述,不做详细介绍,重点介绍差异的部分。


3.1 创建 Simulink 仿真模型

  1. 为仿真模型新建一个子目录,例如:“D:\SimulinkProjects\STM32G431_MBD04b”。

  2. 创建新的 Simulink 模型,保存到本项目路径下:STM32G431_MBD04b.slx。

  3. 在 Simulink 菜单选择 “建模” - “模型设置” ,打开“配置参数”对话框进行配置。


3.2 从 Simulink 创建 STM32CubeMX 工程

  1. 检查 PC 与 STM32G431 开发板连接正常。

  2. 在右侧 “Hardware board settings” 配置 “Target hardware resources” ,创建 STM32CubeMX 工程文件 STM32G431_MBD04b.ioc。

  3. 选择硬件在环通信串口。


3.3 搭建 Simulink 仿真模型

回到 Simulink 仿真窗口,搭建仿真模型。

  1. 在仿真模型中添加 “PWM out” 模块并进行配置 。
    (1)在仿真模型中添加 “PWM out” 模块参数。
    (2)设置 “PWM out” 模块参数。如图所示,按照 CubeMX 项目中的 GPIO 管脚配置。
    1)将 Timer module 设为 “TIM1”,
    2)将 “Duty Cycle unit” 设为 “Percentage”,
    3)勾选 “Enable channel 1”、“Enable channel 2”、“Enable channel 3” 以使能 CH1、CH2、CH3;
    4)勾选 “Enable frequency input” 以启用频率输入(输入指将被写入计时器 TIM1 的自动重新加载寄存器,以设置计数器周期 ARR)。

  2. 设置 计数器周期 ARR 为 10000,CH1、CH2、CH3 的占空比为 25、50、75(%)。关于 ARR 的计算详见 CubeMX 配置部分。占空比的设置是自己设定的,可以设为 0~100 的任意值。

在这里插入图片描述

  1. 完成搭建仿真模型,保存为文件 STM32G431_MBD04b.slx。

3.4 配置 STM32CubeMX 工程

本实验使用 TIM2 作为基础时钟源,TIM1 定时器产生PWM输出。


  1. 打开通过 Simulink 创建的 CubeMX 工程文件 STM32G431_MBD04b.ioc。

  2. 点击菜单栏 “Project Manager” 进入工程配置界面:
    (3)在 Project 中勾选 “Do not generate the main()”,在生成代码时不生成 main.c 文件中的 main() 函数。
    (4)在 Project 中取消选中 “Generate Under Root”。

  3. 在 Pinout Configuration 视图进行系统配置。
    (1)选择 “System Core – SYS” 设置调试器类型,将 Debug 设为 “Serial Wire”,
    (2)选择 “System Core – SYS” 设置基础时钟源,将 Timebase Source 设为 “TIM2”
    (3)选择 “System Core – RCC” 配置时钟模式,设置高速晶振为外部时钟,将 High Speed Clock (HSE) 设为 “Crystal/Ceramic Resonator”。


  1. 点击 “Clock Configuration” 菜单按钮进入时钟频率设置界面,把 HCLK(MHz) 修改为 168MHz,APB2 peripheral clocks 设置为 168MHz。

  1. 在使用定时器时,要先使能(Enable)定时器,并设置定时器的频率。
    (1)在左侧 Categories 中选择 Timers – TIM1,配置 TIM1 的 Channel -1为 “PWM Generation CH1”、Channel-2 为 “PWM Generation CH2”、Channel-3为 “PWM Generation CH3”;
    (2)在右侧 Pinout View 图中,将 PA8 管脚设置为 TIM1_CH1,将 PA9 管脚设置为 TIM1_CH2,将 PA10 管脚设置为 TIM1_CH3。
    在这里插入图片描述

  2. 设置 100Hz,占空比为 50% 的 PWM。
    (1)计算 PWM 频率与占空比:
    f P W M = f T I M ( P S C + 1 ) ∗ ( A R R + 1 ) = 168 × 1 0 6 ( 167 + 1 ) ( 10000 ) = 100 ( H z ) d u t y = P u l s e A R R = 5000 / 10000 = 50 % \begin{matrix} f_{PWM} &= &\frac{f_{TIM}}{(PSC+1)*(ARR+1)} &=&\frac{168 \times 10^6}{(167+1)(10000)}&=100(Hz)\\ duty &= &\frac{Pulse}{ARR} &=& 5000/10000 &= 50\% \end{matrix} fPWMduty==(PSC+1)(ARR+1)fTIMARRPulse==(167+1)(10000)168×1065000/10000=100(Hz)=50%

(2)点击 “Pinout&Configuration” 菜单按钮,在左侧 Categories 中选择 Timers – TIM1,在 Configuration 中选择 Parameter Settings,

  • 在 “Counter Settings” 下,设置 Prescaler(PSC)为 (168-1);
  • 设置 Counter Mode 为 Up;
  • 设置 Counter Period(ARR)为 10000;
  • 在 “PWM Generation Channel 1” 下,设置 Pulse 为 2500;
  • 在 “PWM Generation Channel 2” 下,设置 Pulse 为 5000;
  • 在 “PWM Generation Channel 3” 下,设置 Pulse 为 7500。

在这里插入图片描述

  1. 点击菜单栏 “Project Manager” 进入工程配置界面。
    (1)在 Code Generator 中,勾选 “Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”。

(2)在 Advanced Settings 中,将 “Driver Selector” 全部设置为 “LL”(默认为 “HAL”),为外设选择低级 (LL) 驱动!

(3)在 Advanced Settings 中,将 “Generated Function Calls” 的 “Visibility(Static)” 勾选项全部取消。

在这里插入图片描述


  1. 保存 CubeMX 项目文件 STM32G431_MBD04b.slx。
    注意:配置完成后不要点击 “GENERATE CODE” 生成代码,而是保存 .ioc 项目文件。

3.5 从 Simulink 模型生成 STM32 代码

  1. 在 Simulink 打开仿真模型 STM32G431_MBD04b.slx。

  2. 在 “硬件(Hardware)” 窗口点击 “编译、部署和启动”(Ctrl+B 快捷键),就启动模型 STM32G431_MBD04b 的编译过程,为模型生成代码,并加载到 NUCLEO-G431RB 开发板。

模型编译过程的主要信息显示在 “诊断查看器” 中,编译摘要如下。
如果编译中发生错误,错误信息也将显示在 “诊断查看器” 。

 顶层模型编译  
### 正在启动 STM32G431_MBD04b 的编译过程...编译摘要  
编译的顶层模型目标:模型                操作           重新编译原因     
==========================================
STM32G431_MBD04b  代码已生成并完成编译。  生成的代码已过期。  编译了 1 个模型,共 1 个模型(0 个模型已经是最新的)
编译持续时间: 0h 1m 2.5015s

在这里插入图片描述

  1. Simulink 通过调用 STM32CubeProgrammer 将编译的目标文件加载到 STM32 开发板。

  2. 使用示波器观察输出信号如下:

在这里插入图片描述


4. 基于 Simulink 模型开发之 互补 PWM 信号输出

实验名称:4c. 基于 Simulink 模型开发之 互补 PWM 信号输出
实验内容:利用 TIM1 定时器在引脚上输出互补 PWM 信号。

为了节省篇幅,与上节 “单路PWM信号输出” 相同的内容只做概要叙述,不做详细介绍,重点介绍差异的部分。


4.1 创建 Simulink 仿真模型

  1. 为仿真模型新建一个子目录,例如:“D:\SimulinkProjects\STM32G431_MBD04c”。

  2. 创建新的 Simulink 模型,保存到本项目路径下:STM32G431_MBD04c.slx。

  3. 在 Simulink 菜单选择 “建模” - “模型设置” ,打开“配置参数”对话框进行配置。


4.2 从 Simulink 创建 STM32CubeMX 工程

  1. 检查 PC 与 STM32G431 开发板连接正常。

  2. 在右侧 “Hardware board settings” 配置 “Target hardware resources” ,创建 STM32CubeMX 工程文件 STM32G431_MBD04c.ioc。

  3. 选择硬件在环通信串口。


4.3 搭建 Simulink 仿真模型

回到 Simulink 仿真窗口,搭建仿真模型。

  1. 在仿真模型中添加 “PWM out” 模块并进行配置 。
    (1)在仿真模型中添加 “PWM out” 模块参数。
    (2)设置 “PWM out” 模块参数。如图所示,按照 CubeMX 项目中的 GPIO 管脚配置。
    1)将 Timer module 设为 “TIM1”,
    2)将 “Duty Cycle unit” 设为 “Percentage”,
    3)勾选 “Enable channel 1” 以使能 CH1;
    4)勾选 “Enable frequency input” 以启用频率输入(输入指将被写入计时器 TIM1 的自动重新加载寄存器,以设置计数器周期 ARR)。

  2. 设置 计数器周期 ARR 为 10000,CH1 的占空比为 35(%)。关于 ARR 的计算详见 CubeMX 配置部分。占空比的设置是自己设定的,可以设为 0~100 的任意值。
    在这里插入图片描述

  3. 完成搭建仿真模型,保存为文件 STM32G431_MBD04c.slx。


4.4 配置 STM32CubeMX 工程

本实验使用 TIM2 作为基础时钟源,TIM1 定时器产生PWM输出。


  1. 打开通过 Simulink 创建的 CubeMX 工程文件 STM32G431_MBD04c.ioc。

  2. 点击菜单栏 “Project Manager” 进入工程配置界面:
    (3)在 Project 中勾选 “Do not generate the main()”,在生成代码时不生成 main.c 文件中的 main() 函数。
    (4)在 Project 中取消选中 “Generate Under Root”。

  3. 在 Pinout Configuration 视图进行系统配置。
    (1)选择 “System Core – SYS” 设置调试器类型,将 Debug 设为 “Serial Wire”,
    (2)选择 “System Core – SYS” 设置基础时钟源,将 Timebase Source 设为 “TIM2”
    (3)选择 “System Core – RCC” 配置时钟模式,设置高速晶振为外部时钟,将 High Speed Clock (HSE) 设为 “Crystal/Ceramic Resonator”。


  1. 点击 “Clock Configuration” 菜单按钮进入时钟频率设置界面,把 HCLK(MHz) 修改为 168MHz,APB2 peripheral clocks 设置为 168MHz。

  1. 在使用定时器时,要先使能(Enable)定时器,并设置定时器的频率。
    (1)在左侧 Categories 中选择 Timers – TIM1,配置 TIM1 的 Channel -1为 “PWM Generation CH1 CH1N”;
    (2)在右侧 Pinout View 图中,将 PA8 管脚设置为 TIM1_CH1,将 PA11 管脚设置为 TIM1_CH1N。

在这里插入图片描述

  1. 设置 100Hz,占空比为 50% 的 PWM。
    (1)计算 PWM 频率与占空比:
    f P W M = f T I M ( P S C + 1 ) ∗ ( A R R + 1 ) = 168 × 1 0 6 ( 167 + 1 ) ( 10000 ) = 100 ( H z ) d u t y = P u l s e A R R = 5000 / 10000 = 50 % \begin{matrix} f_{PWM} &= &\frac{f_{TIM}}{(PSC+1)*(ARR+1)} &=&\frac{168 \times 10^6}{(167+1)(10000)}&=100(Hz)\\ duty &= &\frac{Pulse}{ARR} &=& 5000/10000 &= 50\% \end{matrix} fPWMduty==(PSC+1)(ARR+1)fTIMARRPulse==(167+1)(10000)168×1065000/10000=100(Hz)=50%

(2)点击 “Pinout&Configuration” 菜单按钮,在左侧 Categories 中选择 Timers – TIM1,在 Configuration 中选择 Parameter Settings,

  • 在 “Counter Settings” 下,设置 Prescaler(PSC)为 (168-1);
  • 设置 Counter Mode 为 Up;
  • 设置 Counter Period(ARR)为 10000;
  • 在 “PWM Generation Channel 1” 下,设置 Pulse 为 4000;

在这里插入图片描述

  1. 点击菜单栏 “Project Manager” 进入工程配置界面。
    (1)在 Code Generator 中,勾选 “Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”。

(2)在 Advanced Settings 中,将 “Driver Selector” 全部设置为 “LL”(默认为 “HAL”),为外设选择低级 (LL) 驱动!

(3)在 Advanced Settings 中,将 “Generated Function Calls” 的 “Visibility(Static)” 勾选项全部取消。
在这里插入图片描述


  1. 保存 CubeMX 项目文件 STM32G431_MBD04c.slx。
    注意:配置完成后不要点击 “GENERATE CODE” 生成代码,而是保存 .ioc 项目文件。

4.5 从 Simulink 模型生成 STM32 代码

  1. 在 Simulink 打开仿真模型 STM32G431_MBD04c.slx。

  2. 在 “硬件(Hardware)” 窗口点击 “编译、部署和启动”(Ctrl+B 快捷键),就启动模型 STM32G431_MBD044 的编译过程,为模型生成代码,并加载到 NUCLEO-G431RB 开发板。

模型编译过程的主要信息显示在 “诊断查看器” 中,编译摘要如下。
如果编译中发生错误,错误信息也将显示在 “诊断查看器” 。

 顶层模型编译  
### 正在启动 STM32G431_MBD044 的编译过程...编译摘要
编译的顶层模型目标:模型                操作           重新编译原因     
==========================================
STM32G431_MBD04c  代码已生成并完成编译。  生成的代码已过期。  编译了 1 个模型,共 1 个模型(0 个模型已经是最新的)
编译持续时间: 0h 1m 0.99277s
  1. Simulink 通过调用 STM32CubeProgrammer 将编译的目标文件加载到 STM32 开发板。

  2. 使用示波器观察输出信号如下:

在这里插入图片描述


(本节完)


参考资料:

  1. 基于 STMicroelectronics STM32 处理器的板快速入门, (https://ww2.mathworks.cn/help/ecoder/stmicroelectronicsstm32f4discovery/ug/Getting-started-stm32cubemx.html?searchHighlight=STM32&s_tid=srchtitle_support_results_2_STM32)

  2. STMicroelectronics STM32 Hardware Support from Simulink, https://ww2.mathworks.cn/hardware-support/stm32.html

  3. Getting Started with Connected IO on STM32 Processor Based Boards, https://ww2.mathworks.cn/help/ecoder/stmicroelectronicsstm32f4discovery/ug/getting-started-connected-io.html


版权声明:
youcans@qq.com 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/144968875)
Copyright@youcans 2025
Crated:2025-01

相关文章:

【动手学电机驱动】STM32-MBD(5)Simulink 模型开发之 PWM 输出

STM32-MBD(1)安装 Simulink STM32 硬件支持包 STM32-MBD(2)Simulink 模型部署入门 STM32-MBD(3)Simulink 状态机模型的部署 STM32-MBD(4)Simulink 状态机实现按键控制 STM32-MBD&…...

MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合

2024小结:在写作分享上,这里特别感谢CSDN社区提供平台,支持大家持续学习分享交流,共同进步。社区诚意满满的干货,让大家收获满满。 对我而言,珍惜每一篇投稿分享,每一篇内容字数大概6000字左右&…...

vue2日历组件

这个代码可以直接运行&#xff0c;未防止有组件库没安装&#xff0c;将组件库的代码&#xff0c;转成文字了 vue页面 <template><div class"about"><div style"height: 450px; width: 400px"><div style"height: 100%; overflo…...

【PyQt】多行纯文本框

[toc]qt多行纯文本框 QPlainTextEdit QPlainTextEdit 是可以多行的纯文本编辑框 文本浏览框 内置了一个** QTextDocument **类型的对象 &#xff0c;存放文档。 1.信号&#xff1a;文本被修改 当文本框中的内容被键盘编辑&#xff0c;被点击就会发出 textChanged 信号&…...

workerman5.0篇〡异步非阻塞协程HTTP客户端

概述 workerman/http-client 是一个异步http客户端组件。所有请求响应异步非阻塞&#xff0c;内置连接池&#xff0c;消息请求和响应符合PSR7规范。 Workerman 5.0 版本中的异步HTTP协程客户端组件是一个基于PHP协程的高性能HTTP客户端&#xff0c;它能够充分利用PHP的异步特…...

JavaScript 延迟加载的方法( 7种 )

JavaScript脚本的延迟加载&#xff08;也称为懒加载&#xff09;是指在网页的主要内容已经加载并显示给用户之后&#xff0c;再加载或执行额外的JavaScript代码。这样做可以加快页面的初始加载速度&#xff0c;改善用户体验&#xff0c;并减少服务器的压力。 以下是几种常见的延…...

python+pymysql

python操作mysql 一、python操作数据库 1、下载pymysql 库&#xff0c; 方法一&#xff1a;pip3 install pymysql 或pip install pymysql 方法二&#xff1a;在pycharm中setting下载pymysql 2、打开虚拟机上的数据库 3、pymysql连接 dbpymysql.Connection(host&qu…...

基于 Selenium 实现上海大学校园网自动登录

基于 Selenium 实现上海大学校园网自动登录 一、技术方案 核心工具&#xff1a; Selenium&#xff1a;一个用于自动化测试的工具&#xff0c;能够模拟用户在浏览器上的操作。Edge WebDriver&#xff1a;用于控制 Edge 浏览器的驱动程序。 功能设计&#xff1a; 检测网络状…...

啥!GitHub Copilot也免费使用了

文章目录 前言免费版直接修复代码多文件上下文Agent模式总结 前言 最近&#xff0c;GitHub 给开发者们带来了一个好消息&#xff1a;他们的 AI 编程助手 GitHub Copilot 现在可以免费使用了&#xff01;以前&#xff0c;每个月要花 10 美元才能享受的服务&#xff0c;现在对所…...

Spring配置文件中:密码明文改为密文处理方式(通用方法)

目录 一、背景 二、思路 A) 普通方式 B) 适合bootstrap.properties方式 三、示例 A) 普通方式&#xff08;连接Redis集群&#xff09; A) 普通方式&#xff08;连接RocketMQ&#xff09; B) 适合bootstrap.properties方式 四、总结 一、背景 SpringBoot和Sprin…...

Linux下ext2文件系统

文章目录 一 :penguin:基本概述二 :star: ext2文件系统:star:​ 1. :star:​Boot Block&#xff08;引导块&#xff09;位置与作用 三 Block Group(块组):star:​1.:star:​ Super Block(超级块):star:​2.:star:​ Group Descriptor&#xff08;块组描述符&#xff09;:star:​…...

BUUCTF:web刷题记录(1)

目录 [极客大挑战 2019]EasySQL1 [极客大挑战 2019]Havefun1 [极客大挑战 2019]EasySQL1 根据题目以及页面内容&#xff0c;这是一个sql注入的题目。 直接就套用万能密码试试。 admin or 1 # 轻松拿到flag 换种方式也可以轻松拿到flag 我们再看一下网页源码 这段 HTML 代码…...

【微服务】面试题 6、分布式事务

分布式事务面试题讲解 一、问题背景与解决方案概述 因微服务项目涉及远程调用可能引发分布式事务问题&#xff0c;需解决。主流解决方案有阿里 Seata 框架&#xff08;含 XA、AT、TCC 模式&#xff09;和 MQ。 二、Seata 框架关键角色 事务协调者&#xff08;TC&#xff09;&…...

【2024年华为OD机试】(C卷,100分)- 分割均衡字符串 (Java JS PythonC/C++)

一、问题描述 题目描述 均衡串定义&#xff1a;字符串中只包含两种字符&#xff0c;且这两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定&#xff1a;字符串中只包含大写的 X 和 Y 两种字符。 输入描述 输入一个均衡串…...

Spring Data Elasticsearch简介

一、Spring Data Elasticsearch简介 1 SpringData ElasticSearch简介 Elasticsearch是一个实时的分布式搜索和分析引擎。它底层封装了Lucene框架,可以提供分布式多用户的全文搜索服务。 Spring Data ElasticSearch是SpringData技术对ElasticSearch原生API封装之后的产物,它通…...

GESP202312 四级【小杨的字典】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202312 四级] 小杨的字典 题目描述 在遥远的星球&#xff0c;有两个国家 A 国和 B 国&#xff0c;他们使用着不同的语言&#xff1a;A 语言和 B 语言。小杨是 B 国的翻译官&#xff0c;他的工作是将 A 语言的文章翻译成 B 语言的文章…...

键盘过滤驱动

文章目录 概述注意源码参考资料 概述 irp请求会从io管理器中传递到设备栈中依次向下发送&#xff0c;当到达底层真实设备处理完成后&#xff0c;会依次返回&#xff0c;这时如果在设备栈中有我们自己注册的设备&#xff0c;就可以起到一个过滤的功能。键盘过滤驱动就是如此&am…...

dolphinscheduler2.0.9升级3.1.9版本问题记录

相关版本说明 JDK&#xff1a;JDK (1.8&#xff09; DolphinScheduler &#xff1a;3.1.9 数据库&#xff1a;MySQL (8)&#xff0c;驱动&#xff1a;MySQL JDBC Driver 8.0.16 注册中心&#xff1a;ZooKeeper (3.8.4) 问题一&#xff1a;dolphinscheduler2.0.9对应zk版本使用…...

【权限管理】Apache Shiro学习教程

Apache Shiro 是一个功能强大且灵活的安全框架&#xff0c;主要用于身份认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;、会话管理&#xff08;Session Management&#xff09;和加密&#xff08;Cryptography&#xff09;。它旨在为…...

9.4 visualStudio 2022 配置 cuda 和 torch (c++)

一、配置torch 1.Libtorch下载 该内容看了【Libtorch 一】libtorchwin10环境配置_vsixtorch-CSDN博客的博客&#xff0c;作为笔记用。我自己搭建后可以正常运行。 下载地址为windows系统下各种LibTorch下载地址_libtorch 百度云-CSDN博客 下载解压后的目录为&#xff1a; 2.vs…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...