【STM32-MBD】(17)基于 ADC 同步采样的 PWM 闭环控制链路

STM32-MBD(1)Matlab2022/2023 安装 STM32 硬件支持包
STM32-MBD(15)Simulink 模型开发之三相互补 PWM
STM32-MBD(16)TIM 硬件触发 ADC 同步采样
STM32-MBD(17)基于 ADC 同步采样的 PWM 闭环控制链路

【STM32-MBD】(17)基于 ADC 同步采样的 PWM 闭环控制链路

    • [1. 项目介绍](#1. 项目介绍)
      • [1.1 项目内容](#1.1 项目内容)
      • [1.2 实验方案](#1.2 实验方案)
      • [1.3 软件需求与环境配置](#1.3 软件需求与环境配置)
      • [1.4 硬件需求与引脚分配](#1.4 硬件需求与引脚分配)
    • [2. CubeMX工程配置](#2. CubeMX工程配置)
      • [2.1 创建新项目](#2.1 创建新项目)
      • [2.2 TIM 配置](#2.2 TIM 配置)
      • [2.3 ADC 配置(同步采样与中断使能)](#2.3 ADC 配置(同步采样与中断使能))
      • [2.4 工程配置](#2.4 工程配置)
    • [3. 实验 :基于 ADC 同步采样的 PWM 闭环链路](#3. 实验 :基于 ADC 同步采样的 PWM 闭环链路)
      • [3.1 模型任务与结构](#3.1 模型任务与结构)
      • [3.2 创建仿真模型](#3.2 创建仿真模型)
      • [3.3 关联 Simulink 模型与 CubeMX 工程](#3.3 关联 Simulink 模型与 CubeMX 工程)
      • [3.4 STM32 代码生成与运行](#3.4 STM32 代码生成与运行)
      • [3.5 实验结果分析](#3.5 实验结果分析)
    • [5. 总结](#5. 总结)

1. 项目介绍

1.1 项目内容

在电机控制系统中,PWM 输出的更新时刻是否与 ADC 采样结果严格对应,直接关系到控制系统的稳定性与可预测性。尤其在 FOC 等实时控制应用中,通常要求 每一次 ADC 采样完成后立即进行计算并更新 PWM 输出,以保证采样数据与控制动作之间具有明确、可重复的时序关系。

在前一篇《【STM32-MBD】(16)TIM 硬件触发 ADC 同步采样》中,已经完成了 TIM 硬件触发 ADC 注入组采样 以及 基于 ADC 采样完成事件的调度结构验证,确认了"采样完成事件可以作为系统调度核心"的可行性。在此基础上,本文进一步向控制闭环方向推进,重点关注 ADC 采样结果如何在同一调度链路中驱动 PWM 输出更新。

本文采用 基于 ADC 同步采样的 PWM 闭环控制 这一实验主题,但暂不引入电流环或 FOC 算法,也不依赖真实电机负载系统。实验通过电位器提供可调模拟电压,利用 ADC 对该电压进行同步采样,并在 ADC 采样完成事件驱动下,将采样结果映射为 PWM 占空比,实现"输入变化---采样---PWM 更新"的标量闭环验证。该闭环仅用于验证数据通路与调度结构的正确性,不涉及控制性能评估。

通过该实验,本文旨在完成从"同步采样"到"闭环更新"的关键过渡,为后续引入比例/PI 控制、电流环以及完整 FOC 控制算法,提供一套已经过验证的、时序清晰的基础调度结构。

1.2 实验方案

本实验采用逐步推进、先验证结构再扩展功能的方式进行设计,整体实验方案围绕"输入---采样---调度---输出"这一最小闭环通路展开。

在实现方式上,本文继续采用 STM32-MBD 开发流程:由 CubeMX 完成 TIM、ADC 等外设的结构性与时序性配置,包括 PWM 频率、触发方式以及中断使能等关键参数;Simulink 不参与采样时序的控制,而是在 ADC 采样完成事件驱动的 Function-call 子系统中完成数据读取与 PWM 更新。这种分工方式保证了采样与更新的时间一致性,同时也使模型结构更加清晰、可验证。

在硬件层面,利用 TIM1 产生固定频率的 PWM 波形,并通过定时器硬件事件触发 ADC 进行同步采样,确保 ADC 采样时刻与 PWM 周期之间具有确定的对应关系。ADC 采样完成后,通过中断事件驱动控制逻辑的执行,为后续闭环调度提供明确的触发入口。

通过示波器观测 PWM 输出,可以直观验证 PWM 占空比随输入电压变化而同步更新,从而确认"采样完成即更新输出"这一闭环调度语义在工程上的可实现性。

1.3 软件需求与环境配置

本文所涉及的 软件与开发环境配置,与前文【STM32-MBD】系列保持一致。关于所需软硬件条件及详细安装过程,请务必首先参考: 【STM32-MBD】(1)安装 Simulink STM32 硬件支持包

强烈建议在安装相关软件时优先采用文中推荐版本,并严格按照步骤完成安装与配置。在 Model-Based Design 开发流程中,软件版本之间的兼容性对代码生成与工程部署具有重要影响,随意更换版本可能导致难以定位的问题。

必需的软件环境:

  1. STM32 开发工具链(建议首先使用推荐版本跑通本文项目)

    • STM32CubeMX(推荐使用 V6.4.0)

      用于 STM32 工程初始化与外设配置,本文中主要用于 TIM1 三相互补 PWM 及死区参数的配置。

    • STM32CubeProgrammer(推荐使用 V2.6.0)

      用于程序下载、调试及 Flash 管理。

    • STM32CubeIDE(或 Keil MDK-ARM 等 IDE 工具)

      用于编译、链接及调试由 Simulink 自动生成的 STM32 工程代码。

    • STM32Cube_FW_G4 固件包(推荐使用 V1.5.0)

      提供 STM32G4 系列的 HAL 驱动与底层支持文件。

      若使用其它 STM32 MCU,应选择对应系列的固件包。例如,STM32F4 系列需使用 STM32Cube_FW_F4_V1.26.0。

  2. MATLAB / Simulink 环境

    • MATLAB / Simulink

      本文基于 MATLAB R2022b 进行开发与测试,也可使用更新版本。

    • Simulink Coder

      用于从 Simulink 模型、Stateflow 图及 MATLAB Function 中生成 C/C++ 代码,支持快速原型、实时与非实时应用,是 STM32-MBD 工作流的核心组件。

    • Embedded Coder Support Package for STMicroelectronics STM32 Processors

      STM32 处理器嵌入式硬件支持包,用于将 Simulink 模型直接部署到基于 STMicroelectronics STM32 处理器的硬件平台上,实现自动代码生成、编译与下载。

  3. 安装完成后的检查与验证

    为确保 Simulink-STM32 代码生成与部署环境配置正确,应逐项进行基础验证测试。具体的检查流程与示例模型部署方法,请参考:【STM32-MBD】(2)Simulink 模型部署入门

    通过该基础测试,可确认以下关键环节均工作正常:

    • Simulink 模型可正确生成 STM32 目标代码
    • 工程可在 IDE 中顺利编译
    • 程序可成功下载并在硬件上运行

基于上述原理,本文以 TIM1 产生的 TRGO 事件触发 ADC1 注入组同步采样 为核心思路,将 PWM 时序、触发机制与 ADC 采样过程全部固定在硬件层面实现。Simulink 不参与触发与时序控制,仅用于对采样结果进行读取、处理与验证。

1.4 硬件需求与引脚分配

  1. 硬件平台:
    本文实验基于 NUCLEO-G431RB 开发板进行。该开发板搭载 STM32G431 MCU,内部集成高级定时器 TIM1,原生支持三相互补 PWM 输出及硬件死区插入,非常适合用于电机控制与功率驱动相关实验。
    为验证 PWM 波形及 ADC 同步采样时序的正确性,实验过程中配合使用示波器对关键信号进行观测与调试。

  2. 硬件外设资源分工
    本实验围绕 "TIM 硬件触发 ADC 同步采样" 的核心架构,对片上外设资源进行如下分工配置:

外设 工作模式 功能说明
TIM1 中心对齐模式,频率 10kHz CH1/CH1N、CH2/CH2N、CH3/CH3N :输出三相互补 PWM 定时器在 PWM 运行过程中产生 TRGO 触发事件,作为 ADC1 的硬件触发源
ADC1 注入组模式,外部触发 触发源:TIM1 的 TRGO 事件; 采样通道:3路 (I_U / I_V / I_W); 转换完成后自动触发DMA。
ADC2 规则组模式,软件触发 用于低速采集母线电压(Vbus)、温度(Temp)。

其中,TIM 输出通道与 ADC 采样通道需根据具体硬件平台的原理图进行配置。本文实验基于 NUCLEO-G431RB 开发板 搭配 NUCLEO-IHM16M1 电机驱动板,支持三电阻或单电阻电流采样方案。

  1. 引脚分配
    在上述硬件平台与外设分工基础上,本文采用的典型引脚分配如下。
bash 复制代码
TIM 1:
  CH1 : PA8    , CH1N : PB13
  CH2 : PA9    , CH2N : PB14
  CH3 : PA10   , CH3N : PB15
ADC 1:  
  IN2  : PA1    (I_U)
  IN12 : PB1    (I_V)
  IN15 : PB0    (I_W)
ADC 2:  
  IN11 : PC5    (Vbus)
  IN5  : PC4    (Temp)
youcans@qq.com  

通过上述硬件资源分工与引脚配置,本文构建了一条 "TIM1 → TRGO → ADC1 注入组 → DMA → 内存" 的全硬件驱动同步采样链路。该链路中采样触发完全由定时器硬件事件驱动,不依赖 CPU 中断或软件调度,为后续三相电流同步采样与电流环控制实验提供了稳定、可靠的硬件基础。

2. CubeMX工程配置

在 STM32-MBD 开发中,CubeMX 主要负责对硬件外设进行结构性与时序性的配置,包括定时器的计数模式、触发事件、ADC 的外部触发方式以及 DMA 等关键硬件链路的建立;而 Simulink 则侧重于运行期数据的读取、处理与显示,不直接参与底层时序控制。

在 STM32-MBD 开发流程中,CubeMX 负责所有与硬件结构及时序相关的配置,包括定时器的运行模式、ADC 的触发方式以及中断资源的分配等;而 Simulink 仅在运行期根据这些配置完成数据读取与控制输出更新。本实验采用的 PWM 频率、ADC 触发与中断调度结构,均在 CubeMX 中一次性确定。

本实验的核心目标是验证 "ADC 同步采样完成事件驱动 PWM 更新" 的闭环调度结构,在 CubeMX 配置中需要重点关注:

  • TIM1 的 PWM 生成方式及其与 ADC 的触发关系;
  • ADC 的同步采样方式及采样完成事件配置;
  • 中断资源的正确使能与冲突避免。

以下将按照工程创建、TIM 配置和 ADC 配置的顺序进行说明。

2.1 创建新项目

  1. 新建工程。

    启动 STM32CubeMX,点击 "Start New Project"(或使用快捷键 Ctrl + N)新建工程,进入 New Project 界面。

    选择 MCU:STM32G431RBT6(根据开发板所使用的 MCU 型号进行选择)

    选择开发板:NUCLEO-G431RB

    点击右上角 "Start Project" 创建项目

    将工程保存为 STM32G431_ADC05.ioc

  2. 配置系统时钟树。

    (1)点击顶部 "Clock Configuration" 选项卡,进入时钟树配置界面。

    (2)设置输入频率 Input frequency = 24 MHz,系统主频 SysCLK frequency = 160 MHz

    配置完成后,系统时钟状态如下:

    • System Clock:160 MHz
    • HCLK:160 MHz
    • PCLK1:160 MHz
    • PCLK2:160 MHz
  1. 系统配置(SYS / RCC)
    在 Pinout & Configuration 界面中完成系统级配置:
    (1)选择 System Core -- SYS:
    Debug 模式设置为 Serial Wire
    将基础时钟源 Timebase Source 设为 "TIM2"。
    (2)选择 System Core -- RCC:
    High Speed Clock (HSE):Crystal/Ceramic Resonator
    Low Speed Clock (LSE):Disable(本实验不使用)

说明:在基于 Simulink 的 STM32-MBD 开发中,SysTick 通常由框架用于模型调度。若工程中仍需使用 HAL 的时间基准服务,可将 CubeMX 的 Timebase Source 切换至其它定时器(如 TIM2)。

  1. GPIO 配置。

    (1)将 LD2(PA5) 配置为输出模式 GPIO_Output

    (2)将 用户按键(PC13) 配置为外部中断 GPIO_EXTI13

  2. 配置虚拟串口(LPUART)

    本实验使用串口将 ADC / DAC 数据发送至 PC 端用于波形显示:

    启用 LPUART1

    模式:Asynchronous

    波特率:115200

    引脚:默认 PA2(TX)/ PA3(RX),连接至 NUCLEO 板载 ST-LINK 虚拟串口

    在需要高频数据传输或连续波形刷新时,可为 LPUART1_TX 分配 DMA 通道以降低 CPU 负载。

2.2 TIM 配置

在本实验中,TIM1 是整个系统的时间基准核心,承担 PWM 生成和 ADC 同步采样触发两项任务。

  1. 配置 TIM1 管脚。
    在右侧 Pinout View 中,点击相应引脚并选择 TIM1 的 PWM 功能,引脚分配如下:CH1--CH3 用于输出三相 PWM 波形,对应的 CH1N--CH3N 为互补输出,由 TIM1 硬件自动完成互补关系与死区插入。
bash 复制代码
TIM1_CH1 → PA8
TIM1_CH2 → PA9
TIM1_CH3 → PA10
TIM1_CH1N → PB13
TIM1_CH2N → PB14
TIM1_CH3N → PB15
  1. 启用 TIM1,工作模式设置为 PWM Generation。
    在 Pinout & Configuration 中选择 "Timers -- TIM1 -- TIM1 Mode and Configuration",配置如下:
bash 复制代码
Clock Source: Internal Clock
Channel-1: PWM Generation CH1 CH1N (PWM 互补输出)
Channel-2: PWM Generation CH2 CH2N (PWM 互补输出)
Channel-3: PWM Generation CH3 CH3N (PWM 互补输出)
  1. TIM1 计数器参数配置:
    TIM1 在运行过程中,在 PWM 周期内的预定关键时刻产生 TRGO 触发事件。该事件作为 ADC1 注入组的外部触发源,用于启动同步采样。
    触发源选择 Update Event,该 TRGO 事件将作为 ADC 同步采样的外部触发信号。

当 ARR = 7999 时,对应的 PWM 频率为 10 kHz,其计算关系如下:
f P W M = f s y s 2 ∗ ( P S C + 1 ) ∗ ( A R R + 1 ) = 160 M H z 2 ∗ 8000 = 10 k H z f_{PWM} =\frac{f_{sys}}{2*(PSC+1)*(ARR+1)} =\frac{160 MHz}{2*8000}= 10 kHz fPWM=2∗(PSC+1)∗(ARR+1)fsys=2∗8000160MHz=10kHz

bash 复制代码
Counter Settings:
   Prescaler (PSC): 0
   Counter Mode: Center Aligned mode 1
   Counter Period (ARR): 7999
   Internal Clock Division (CKD): No Division
   Repetition Counter (RCR): 0
   Auto-reload preload: Enable

Trigger Output (TRGO) Parameters:
   Trigger Event Selection TRGO: Update Event

youcans@qq.com   
  1. 死区时间参数配置:
    死区时间用于防止上下桥臂直通,对功率驱动的安全运行至关重要。
    在 Break And Dead Time management -- Output Configuration 中进行如下设置:
bash 复制代码
Break And Dead Time management - Output Configuration:
   Automatic Output State: Disable
   DeadTime Preload: Enable
   Dead Time: 50(计数周期)

2.3 ADC 配置(同步采样与中断使能)

ADC 的配置目标是:在 TIM1 触发下完成同步采样,并在采样完成后产生中断事件,用于驱动 PWM 更新逻辑的执行。

  1. ADC 引脚配置与中断使能
    根据硬件原理图中的管脚定义,在右侧 Pinout View 中配置 ADC 相关引脚。
bash 复制代码
ADC1_IN2 → PA1(I_U)
ADC1_IN12 → PB1(I_V)
ADC1_IN15 → PB0(I_W)

ADC2_IN11 → PC5(Vbus)
ADC2_IN5 → PC4(Temp)
  1. ADC1 注入组配置(TIM1_CH4 硬件触发同步采样)
    ADC1 用于三相电流的同步采样,采用 注入组(Injected Conversion)+ 外部硬件触发 的工作方式,其参数配置如下:
bash 复制代码
ADCs_Common_Settings
  Mode: Independent mode
ADC_Settings:
  Clock Prescaler: Synchronous clock mode divide by 4
  Resolution: ADC 12 bits Resolution
  Data Alignment: Right alignment
  Gain Compensation: 0
  Scan Conversion Mode: Enabled
  End Of Conversion Selection: End of single conversion
  Low Power Auto Wait: Disabled
  Continuous Conversion Mode: Disabled
  Discontinuous Conversion Mode: Disabled
  DMA Continuous Requests: Enabled
ADC_Regular_Conversion Mode:
  External RegularConversions: Disabled
ADC1 → Injected Conversion Mode:
  External Injected Conversions: Enabled
  External Trigger Source: Timer 1 Trigger Out event
  External Trigger Conversion Edge: Trigger detection on the rising edge
  Number Of Conversions: 3
  Rank 1: 
    Channel: Channel 2 (PA1, I_U)
    Sampling Time: 6.5 cycles
    Offset Number: No offset
  Rank 2: 
    Channel: Channel 12 (PB1, I_V)
    Sampling Time: 6.5 cycles
    Offset Number: No offset
  Rank 3: 
    Channel: Channel 15 (PB0, I_W)
    Sampling Time: 6.5 cycles
    Offset Number: No offset
youcans@qq.com
  1. 中断与工程生成设置
    在 NVIC 中确认 ADC1_2 global interrupt 已正确使能。

2.4 工程配置

点击 "Project Manager" 进入工程设置界面:

  1. 在 Project 页面:

    • Project Name:STM32G431_ADC05
    • 选择工程保存路径
    • 勾选 "Do not generate the main()"
    • Toolchain / IDE:选择 STM32CubeIDE
    • 取消勾选 "Generate Under Root"
  2. 在 MCU and Firmware Package 栏:

    • 取消勾选 "Use latest available version"
    • 选择 STM32Cube FW_G4 V1.6.0
    • 若固件包未安装在默认路径,取消 "Use Default Firmware Location" 并手动指定路径。
  3. 在 Code Generator 中:

    • 勾选 "Generate peripheral initialization as a pair of '.c/.h' files per peripheral",让每个外设生成独立的'.c/.h'文件。
  4. 在 Advanced Settings 中:

    • 将所有 "Driver Selector" 设置为 "LL"(默认为 HAL)------非常重要,否则后续编译会报错!
    • 将 Generated Function Calls 中的 Visibility (Static) 选项全部取消。
  5. 保存工程

    完成上述配置后,使用快捷键 Ctrl + S 或点击 File → Save Project 保存 CubeMX 工程文件。

注意:在 STM32CubeMX 中完成配置后,不要点击 "GENERATE CODE" 生成代码,而是仅保存 .ioc 工程文件,后续代码将由 Simulink 自动生成并集成。

3. 实验 :基于 ADC 同步采样的 PWM 闭环链路

本实验的 Simulink 模型以"采样完成事件驱动一次 PWM 更新"为核心设计原则:ADC 的采样时刻由 TIM1 硬件触发决定,Simulink 不参与任何触发时序控制;模型仅在 ADC 转换完成事件到来时执行一次数据读取与占空比计算,并立即更新 PWM 输出,从而形成"ADC→计算→PWM 更新"的标量通路。

3.1 模型任务与结构

本实验的硬件侧链路为:

  • TIM1(TRGO = Update Event) 硬件触发 ADC1 采样电位器电压;
  • ADC 完成一次采样后产生 ADC1_2 中断事件。

Simulink 模型的任务是:在该中断事件驱动下完成一次 PWM 更新。具体分工如下:

  • 硬件负责时序:PWM 周期、ADC 触发时刻、采样启动均由 TIM1/ADC 外设硬件完成;
  • 模型负责运行期更新:读取 ADC 结果 → 线性映射为 duty(0~100%)→ 限幅(可选滤波)→ 更新 TIM1 PWM 输出;
  • 严格事件驱动:PWM 占空比更新仅发生在 ADC 采样完成事件触发的 Function-call 子系统中,不依赖模型基础步长或后台周期任务。

从系统结构上看,本文构建的硬件链路和调度关系如下:

bash 复制代码
TIM1 TRGO(Update Event)
 └─ 触发 ADC1 采样(电位器)
     └─ ADC1 转换完成事件
         └─ ADC1_2_IRQHandler(Hardware Interrupt)
             └─ Function-call Triggered Subsystem
                 ├─ 读取 ADC 数据
                 ├─ 映射为 duty(%)
                 └─ 更新 PWM(TIM1_CH1)                    

3.2 创建仿真模型

创建 Simulink 模型

在 CubeMX 工程文件所在目录下,新建一个 Simulink 模型,并保存为:STM32G431_ADC05a.slx

注意确保 Simulink 模型文件(.slx)与 CubeMX 工程文件(.ioc)位于同一目录,以便后续进行硬件资源关联和代码生成。

Simulink 模型的结构

Simulink 模型由两部分组成:

  1. 顶层模型(Base-rate)
    仅用于系统支撑与状态指示,不参与采样或 PWM 更新调度。
  2. 事件驱动子系统(Function-call Triggered Subsystem)
    由 ADC 中断触发,完成 ADC 数据读取与 PWM 占空比更新,是本实验的核心。

顶层模型(Base-rate)模块

主模型中仅放置以下模块:

  1. Hardware Interrupt(中断入口)

    模块名称:Hardware Interrupt

    该模块用于将 ADC 注入组采样完成事件引入 Simulink,作为事件驱动子系统的触发源。

    Interrupt group:ADC

    Interrupt name:ADC1_2_IRQHandler

    Events to serve:选择与 CubeMX 配置一致的 ADC 转换完成事件

    • ADC1 Injected End of Conversion Sequence (ADC1 Inj EoCS)
    • Events to serve:ADC2 Regular End of Conversion Sequence (ADC2 Reg EoCS)
  2. Function-call Triggered Subsystem(事件驱动子系统)

    该子系统模拟 ADC 中断服务逻辑,是 PWM 更新的唯一执行入口。

    子系统类型:Triggered Subsystem

    Trigger Port 类型:Function-call

事件驱动子系统内部结构

在 Function-call Triggered Subsystem 内,按如下顺序搭建模块与连接:

  1. ADC 数据读取模块:读取 ADC

    模块名称:Analog to Digital Converter

    该模块在 ADC 中断触发后,读取本周期 ADC 注入组采样结果(I_U、I_V、I_W)。

    ADC instance:ADC1

    Conversion group:Injected

    Access mode:Read only

    Number of conversions:3
    注意:该模块不会触发 ADC 采样,仅用于读取已经由 TIM 硬件触发完成的转换结果。

  2. Demux 模块:信号拆分

    模块名称:Demux

    用于将 ADC 模块输出的三路数据拆分,便于后续连接与观察。

    Number of outputs:3

  3. Gain 模块:归一化(100/4095)

    将 12-bit ADC 码值(0-4095)归一化到 Duty (0~100)。

  4. Saturation 模块:限幅

    为避免极端占空比导致输出观测不稳定,可对 duty 做限幅,例如:

    Lower limit:5

    Upper limit:95

  5. PWM Output 模块:更新 PWM

    在模型中添加 PWM Output 模块,用于输出三相 PWM 波形。

    按照 CubeMX 项目中的 TIM1 与 GPIO 引脚配置,对模块参数进行设置:

    Timer module:TIM1

    Duty cycle unit:Percentage

    Enable channel:勾选 Enable CH1 / CH2 / CH3,分别使能 TIM1 的 CH1、CH2、CH3

    Frequency input:不启用(PWM 频率由 CubeMX 固定)

为验证 PWM 更新动作是否发生,将 Saturation 的输出直接连接到 PWM Output 的 duty 输入端,即可实现:每次 ADC 采样完成事件到来时,更新一次 PWM 占空比。

  1. 模型求解器与仿真参数设置
    在 Simulink 菜单中选择 "建模 → 模型设置"(或使用快捷键 Ctrl + E),打开 配置参数 对话框,在左侧选择 "求解器",按如下方式进行设置:

    • 将 仿真时间 设为 inf
    • 在 求解器选择 中:类型选择 定步长,固定步长(基础采样时间) 设为 auto。
    • (可选)在 任务和采样周期选项 中勾选:"将每个离散速率视为单独任务","自动处理数据传输的速率转换"。
  2. 关联 CubeMX 工程文件
    在配置参数窗口中,切换至 硬件实现(Hardware board settings),完成目标硬件与 CubeMX 工程的关联。

    • (1)确认 PC 与 STM32G431 开发板已正常连接
      在 Hardware board 下拉列表中选择 STM32G4xx Based
      注意:必须确保开发板已连接,否则无法完成硬件相关配置
    • (2)点击 Browse,选择当前项目目录中的 CubeMX 工程文件 "STM32G431_ADC05.ioc"。
    • (3)展开 Target hardware resources -- Timers:
      将 Timer group 设为 "Advanced Timers 1/8/20",勾选:"Show TIM1 configurations","Start timer during model initialization","Enable Update Interrupt"。
      (可选)勾选 Enable Trigger interrupt(本实验中非必须)
    • (4)展开 Target hardware resources -- ADC1:
      勾选:"Enable Injected EoCS interrupt","Run ADC calibration during model initialization"
    • (5)可选,展开 Target hardware resources -- ADC2:
      勾选:"Enable Regular EoCS interrupt","Run ADC calibration during model initialization"
  3. 保存模型
    完成仿真模型与硬件配置后,将模型保存为:"STM32G431_ADC05a.slx"。
    再次强调:Simulink 模型文件(.slx)与 CubeMX 项目文件(.ioc)必须位于同一目录下。

3.4 STM32 代码生成与运行

  1. 硬件连接

    使用 USB 线连接 PC 与 NUCLEO-G431RB 开发板,确保 ST-LINK 能够被系统正确识别。

  2. 生成并部署 STM32 代码

    打开仿真模型 STM32G431_ADC05.aslx,在 "硬件(Hardware)" 选项卡中点击 "编译、部署和启动"(快捷键 Ctrl + B)。

Simulink 将自动完成以下过程:

  • 为模型生成 STM32 目标代码;
  • 调用 CubeMX 工程配置;
  • 通过 IDE 完成编译与链接;
  • 将程序下载至 NUCLEO-G431RB 开发板并启动运行。

模型编译与部署过程中的关键信息将显示在 "诊断查看器" 中。编译摘要如下。

c 复制代码
    ### 正在启动 ADC05a 的编译过程
    ### 正在为 '模型特定' 文件夹结构生成代码和工件
    ### 正在将代码生成到编译文件夹中: D:\Matlab\MBD_STM32G431\ADC05\ADC05a_ert_rtw
    ### Invoking Target Language Compiler on ADC05a.rtw
    ### Using System Target File: D:\Matlab\R2023b\rtw\c\ert\ert.tlc
...
    Download verified successfully
    ### Successful completion of build procedure for: ADC05a
    ### 'ADC05a' 的 Simulink 缓存工件是在 'D:\Matlab\MBD_STM32G431\ADC05\ADC05a.slxc' 中创建的。
    编译过程已成功完成
    编译的顶层模型目标:
    
    模型      操作           重新编译原因     
    ================================
    ADC05a  代码已生成并完成编译。  生成的代码已过期。  
    
    编译了 1 个模型,共 1 个模型(0 个模型已经是最新的)
    编译持续时间: 0h 0m 16.19s

至此,Simulink 模型已成功生成 STM32 代码并部署至硬件运行,可通过示波器对输出波形进行验证。

3.5 实验结果分析

模型下载运行后,通过旋转电位器改变输入电压,并使用示波器对 TIM1_CH1 输出波形进行观测,实验现象如下。

  1. PWM 占空比随输入电压连续变化
    在示波器上可以观察到:
    • PWM 频率保持恒定(与 CubeMX 配置一致,如 10 kHz);
    • 随着电位器旋转,PWM 波形的高电平宽度发生连续变化;
    • 当电位器接近最低端时,占空比接近最小值(如限幅设定的 5%);
    • 当电位器接近最高端时,占空比接近最大值(如 95% 或 100%)。

这表明 ADC 采样值已正确映射为 PWM 占空比,并成功更新至定时器输出。

  1. 更新节奏与采样事件一致
    在 ADC 采样完成事件驱动的结构下,PWM 占空比更新仅发生在 ADC 转换完成时刻。
    通过在 Triggered Subsystem 中加入 GPIO 翻转信号(LD2)进行辅助观测,可发现:
    • LED 翻转频率与 ADC 触发频率一致;
    • 每次 LED 翻转都对应一次 PWM 占空比更新;
    • 未发生"周期性后台更新"或额外无关触发。

这说明 PWM 更新确实由 ADC 采样完成事件驱动,而不是由模型基础步长或主循环触发。

本实验验证了以下关键结论:

  • TIM1 硬件触发 ADC 采样能够稳定工作;
  • ADC 采样完成事件可以作为可靠的调度源;
  • 在同一事件驱动子系统内读取 ADC 结果并更新 PWM 输出是可行且时序一致的;
  • "采样完成即更新输出"的结构在 Simulink MBD 框架下可以清晰实现。

通过示波器观察到的 PWM 占空比连续变化现象,证明了"电位器电压 → ADC 采样 → 事件驱动计算 → PWM 更新"这一标量闭环通路已经建立成功,为后续引入控制算法(比例/PI、电流环、FOC)奠定了稳定的调度基础。

5. 总结

本实验基于 ADC 同步采样与事件驱动结构,完成了电位器输入到 PWM 占空比更新的标量通路验证。示波器观测结果表明,PWM 占空比随 ADC 采样结果连续变化,且更新行为严格由采样完成事件驱动。该结果验证了"采样完成即更新输出"的调度语义在 STM32-MBD 框架下的可实现性,为后续引入比例/PI 控制及完整 FOC 控制算法提供了稳定可靠的结构基础。

版权声明:

youcans@qq.com 原创作品,转载必须标注原文链接:

【STM32-MBD】(17)基于 ADC 同步采样的 PWM 闭环控制链路(https://blog.csdn.net/youcans/article/details/157937834)

Copyright@youcans 2026

Crated:2026-02

相关推荐
Gofarlic_OMS9 小时前
科学计算领域MATLAB许可证管理工具对比推荐
运维·开发语言·算法·matlab·自动化
不做无法实现的梦~9 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
我爱C编程11 小时前
基于软切换的网络通信系统资源开销优化matlab性能仿真
matlab·网络通信·op·软切换·资源开销优化·asur·masn
Evand J11 小时前
【MATLAB例程】三点法制导二维仿真实现,附仿真代码、运行结果、捕获时间等,可自行调节起点、目标轨迹等
matlab·制导·二维跟踪·三点法
feifeigo12312 小时前
认知无线网络中频谱感知和功率分配的多目标模因优化问题MATLAB实现
开发语言·matlab
熊猫_豆豆13 小时前
同步整流 Buck 降压变换器
单片机·嵌入式硬件·matlab
ytttr87315 小时前
超声无损检测阵列设计的MATLAB实现
开发语言·matlab
神仙别闹15 小时前
基于Matlab实现和相等的两个不相交子集
android·数据库·matlab
Evand J15 小时前
【MATLAB例程】多爆破工作面爆破,通风风量分配仿真,适用于多个爆破工作面、多风机/风窗调节。附MATLAB例程运行结果
开发语言·matlab·优化·任务分配
chenchen0000000018 小时前
49元能否买到四核性能?HZ-RK3506G2_MiniEVM开发板评测:MCU+三核CPU带来的超高性价比
单片机·嵌入式硬件