【FOC-MBD】(20)矢量空间脉宽调制 (SVPWM)输出

FOC-MBD(1)Matlab2022/2023 安装 STM32 硬件支持包
FOC-MBD(15)Simulink 模型开发之三相互补 PWM
FOC-MBD(16)TIM 硬件触发 ADC 同步采样
FOC-MBD(17)基于 ADC 同步采样的 PWM 闭环控制链路
FOC-MBD(18)Clarke / Park 坐标变换链路
FOC-MBD(19)反 Park 坐标变换链路
FOC-MBD(20)矢量空间脉宽调制 (SVPWM)输出

【FOC-MBD】(20)矢量空间脉宽调制 (SVPWM)输出

    • [1. 项目介绍](#1. 项目介绍)
      • [1.1 项目内容](#1.1 项目内容)
      • [1.2 实验方案](#1.2 实验方案)
      • [1.3 软硬件需求与引脚分配](#1.3 软硬件需求与引脚分配)
      • [1.4 技术原理](#1.4 技术原理)
      • [3.1 SVPWM 的仿真模型](#3.1 SVPWM 的仿真模型)
    • [2. CubeMX工程配置](#2. CubeMX工程配置)
      • [2.1 创建新项目](#2.1 创建新项目)
      • [2.2 TIM 配置](#2.2 TIM 配置)
      • [2.3 ADC 配置(周期触发)](#2.3 ADC 配置(周期触发))
      • [2.5 工程配置](#2.5 工程配置)
    • [3. 实验方法与实现流程](#3. 实验方法与实现流程)
      • [3.1 模型任务与结构](#3.1 模型任务与结构)
      • [3.2 创建仿真模型](#3.2 创建仿真模型)
      • [3.3 关联 Simulink 模型与 CubeMX 工程](#3.3 关联 Simulink 模型与 CubeMX 工程)
      • [3.4 STM32 代码生成与运行](#3.4 STM32 代码生成与运行)
    • [4. 实验验证:](#4. 实验验证:)
      • [4.1 实验1:三相互补 PWM 输出验证](#4.1 实验1:三相互补 PWM 输出验证)
      • [4.2 实验2:固定 αβ 输入下的 SVPWM 占空比验证](#4.2 实验2:固定 αβ 输入下的 SVPWM 占空比验证)
      • [4.3 实验3: αβ 输入下的 SVPWM 占空比验证](#4.3 实验3: αβ 输入下的 SVPWM 占空比验证)
    • [5. 总结](#5. 总结)

1. 项目介绍

1.1 项目内容

在前几节实验中,我们已经完成了从三相电流采样、Clarke 变换、Park 变换到 Inv Park 变换的完整数学链路验证,成功将三相交流系统转换为可解耦控制的 dq 坐标系,并验证了其在空间矢量层面的物理意义。

在此基础上,本文进一步向下延伸至功率驱动层,验证 FOC 控制中的 PWM 调制环节,即空间矢量 PWM(SVPWM)输出链路,实现将 αβ 坐标系转换为三相 PWM 驱动信号(Ua、Ub、Uc)输出的映射过程。

本实验的目标是完成如下链路的验证。

bash 复制代码
TIM1 → ADC → Iabc(软件生成) → Clarke → αβ → SVPWM → TIM1 PWM 输出

其中:

  • 三相电流 I a b c I_{abc} Iabc 由软件生成,不依赖实际 ADC 采样;
  • αβ 电压作为 SVPWM 的输入;
  • SVPWM 计算结果转换为三相占空比(Ta、Tb、Tc);
  • 通过 TIM1 输出三相互补 PWM 波形。

该设计在不引入真实采样的前提下,完整保留了 FOC 控制的数据链路结构,使本实验既能聚焦 SVPWM 调制过程,又能与后续闭环控制系统无缝衔接。

1.2 实验方案

总体结构:

本实验在系统调度结构上延续前述章节,仍采用基于定时器与 ADC 触发的事件驱动机制:

  • 使用 TIM1 作为系统时间基准;
  • 使用 TIM1 触发 ADC;
  • 使用 ADC 转换完成事件触发计算子系统;
  • 在事件子系统内部,不再读取真实 ADC 数据;
  • 在事件子系统内部,由软件生成三相电流 I a b c I_{abc} Iabc。

需要说明的是,在本章中:ADC 不再作为数据采样来源,而仅作为系统调度触发源使用。

该设计实现了:

  • 调度结构保持不变(与前述实验一致);
  • 数据来源可控(避免采样噪声影响);
  • 算法链路完整保留(为 FOC 闭环做准备)。

本章按照由简到繁的思路设计为三个递进实验:

  • 实验1:三相互补 PWM 输出验证,用于确认硬件输出链路正常;
  • 实验2:固定 αβ 输入下的 SVPWM 占空比验证,用于验证静态调制结果;
  • 实验3:旋转矢量输入下的 SVPWM 动态输出验证,用于验证调制过程的连续性与动态特性。

通过上述三个实验,逐步完成从三相 PWM 硬件输出到空间矢量调制的链路验证,并在保持系统结构一致的前提下,实现从"数学模型验证"向"驱动执行验证"的过渡,为后续构建完整 FOC 闭环控制系统奠定基础。

1.3 软硬件需求与引脚分配

  1. 开发环境

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

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

  2. 硬件平台

    本文实验基于 NUCLEO-G431RB 开发板进行。该开发板搭载 STM32G431 MCU,内部集成高级定时器 TIM1,原生支持三相互补 PWM 输出及硬件死区插入,非常适合用于电机控制与功率驱动相关实验。

    为验证 PWM 波形的正确性,实验过程中配合使用示波器对关键信号进行观测与调试。

  3. 外设需求

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

外设 工作模式 功能说明
TIM1 中心对齐模式,频率 10kHz CH1/CH1N、CH2/CH2N、CH3/CH3N :输出三相互补 PWM 定时器在 PWM 运行过程中产生 TRGO 触发事件,作为 ADC1 的硬件触发源
ADC1 注入组模式,外部触发 触发源:TIM1 的 TRGO 事件; 采样通道:3路 (I_U / I_V / I_W); 转换完成后触发中断
DAC1 双通道输出(CH1 / CH2) 用于输出坐标变换结果,便于示波器观测波形

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

  1. 引脚分配
    在上述硬件平台与外设分工基础上,本文采用的典型引脚分配如下。
bash 复制代码
TIM1:
  TIM1_CH1  : PA8
  TIM1_CH1N : PB13
  TIM1_CH2  : PA9
  TIM1_CH2N : PB14
  TIM1_CH3  : PA10
  TIM1_CH3N : PB15
ADC1(可选):  
  IN2  : PA1    (I_U)
  IN12 : PB1    (I_V)
  IN15 : PB0    (I_W)
DAC 1:
  OUT1 : PA4
  OUT2 : PA5
youcans@qq.com  

通过上述硬件资源分工与引脚配置,本文在保持"采样---变换---调制---输出"完整数据链路结构的基础上,重点构建了以 SVPWM 调制与 PWM 输出为核心的执行路径,即"αβ 电压输入 → SVPWM 调制 → TIM1 比较寄存器更新 → 三相互补 PWM 输出"。其中 PWM 更新由定时器硬件自动完成,不依赖软件逐次驱动,而 SVPWM 计算结果直接映射为三相占空比输出,为空间电压矢量到实际驱动信号的转换提供了直观且可靠的验证路径。

1.4 技术原理

矢量空间脉宽调制(Space Vector Pulse Width Modulation, SVPWM)是一种基于空间矢量坐标变换的调制方法,其核心思想是:将目标电压矢量 U 𝛼𝛽 U_{𝛼𝛽} U𝛼𝛽 分解为相邻两个基矢量的时间加权组合,并转换为三相 PWM 占空比。

  1. 核心输入:

    SVPWM 的输入为 αβ 坐标系电压 U 𝛼 , U 𝛽 U_{𝛼}, U_𝛽 U𝛼,U𝛽,这正是上一篇 InvPark 变换的输出。

  2. 空间矢量:

    SVPWM 将整个空间划分为 6 个扇区,每个扇区由两个有效矢量和一个零矢量构成:

    • 有效矢量: V 1 V_1 V1~ V 6 V_6 V6
    • 零矢量: V 0 , V 7 V_0, V_7 V0,V7

通过对开关区间内的基本空间矢量(方向)和零矢量(幅值)作用时间进行调节,可以近似得到空间矢量六边形内任意位置、任意幅值的电压矢量。

用零矢量 V 0 V_0 V0 和最近的两个相邻的非零矢量 V k V_k Vk、 V k + 1 V_{k+1} Vk+1 合成目标矢量:

U r e f = T 1 V k + T 2 V k + 1 + T 0 V 0 U_{ref} = T_1 V_k + T_2 V_{k+1} + T_0 V_0 Uref=T1Vk+T2Vk+1+T0V0

  1. 输出结果:
    最终得到三相 PWM 占空比: T a , T b , T c T_a, T_b, T_c Ta,Tb,Tc,并加载到定时器比较寄存器(CCR):
  • TIM1_CH1 → Ua
  • TIM1_CH2 → Ub
  • TIM1_CH3 → Uc

SVPWM 本质上是将 dq 控制得到的电压矢量,转换为三相逆变器的实际驱动信号,是 FOC 控制的执行环节。

关于 SVPWM 算法及其 Simulink 仿真的详细介绍,请参加本系列: 【永磁同步电机(PMSM)】6. 矢量空间算法(SVPWM)

3.1 SVPWM 的仿真模型

基于以上分析,基于 Matlab/Simulink 建立 SVPWM 的仿真模型。

2. CubeMX工程配置

本章围绕 SVPWM 输出链路的验证展开,包含三个递进实验:实验1 为三相互补 PWM 输出验证,实验2 为固定 αβ 输入下的 SVPWM 占空比验证,实验3 为旋转矢量输入下的 SVPWM 动态输出验证。各实验在算法输入上逐步由静态到动态扩展,但在系统结构上保持完全一致。

在系统实现上,本文仍延续前述章节的整体数据链路结构,即:

bash 复制代码
TIM1 → ADC → Iabc(软件生成) → Clarke → αβ → SVPWM → TIM1 PWM 输出

其中:

  • TIM1 作为系统时间基准;
  • ADC 转换完成事件用于触发计算子系统;
  • 三相电流 Iabc 由软件生成,不依赖实际采样;
  • SVPWM 计算结果通过更新 TIM1 比较寄存器(CCR)映射为三相占空比输出。

基于上述设计,本实验的 CubeMX 工程配置以 TIM1 为核心,同时保留 ADC 触发链路以维持系统调度结构的一致性。与前述章节不同的是,本章不使用 ADC 采样数据,仅将其作为事件触发源使用,从而实现"结构保留、数据简化"的设计目标。

需要说明的是,本章在调度机制上仍采用"定时器触发 + ADC 转换完成事件驱动计算"的结构,而非完全独立的固定步长调度方式。通过该机制:

  • SVPWM 算法在 ADC 转换完成事件中执行;
  • 占空比写入 CCR 后,通过预装载机制在 TIM1 更新事件中同步生效;
  • PWM 输出由定时器硬件自动生成。

该设计保证了系统在时序与结构上与后续 FOC 闭环控制保持一致,同时避免了真实采样带来的干扰,使验证重点集中于 SVPWM 调制与 PWM 输出链路本身。

这种"保留调度结构、简化数据来源"的设计方法,使系统在"采样---计算---输出"的整体框架下,仅对输入数据进行虚拟化处理,从而在不改变系统架构的前提下,完成对 SVPWM 执行链路的独立验证。

以下将按照配置说明、TIM1 配置及工程设置的顺序进行说明。

2.1 创建新项目

  1. 新建工程。

    启动 STM32CubeMX,新建工程,选择 MCU:STM32G431RBT6 或开发板 NUCLEO-G431RB,点击"Start Project"创建项目,并保存为:SVPWM01.ioc

  2. 配置系统时钟树。

    本实验采用与前述章节一致的高主频配置,以保证 PWM 分辨率与控制精度。

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

    (2)设置系统主频为 160 MHz:

    • System Clock:160 MHz
    • HCLK:160 MHz
    • PCLK1:160 MHz
    • PCLK2:160 MHz
  3. 系统配置(SYS / RCC)
    在 STM32-MBD 中,SysTick 通常用于模型调度。若需要 HAL 时间基准服务,可将 Timebase Source 切换至 TIM2 等外设。
    在 Pinout & Configuration 界面中完成系统级配置:

(1)选择 System Core -- SYS:

bash 复制代码
Debug:Serial Wire
Timebase Source:TIM2

(2)选择 System Core -- RCC:

bash 复制代码
HSE:Crystal/Ceramic Resonator
LSE:Disable
  1. GPIO 配置(可选)。

    用于基本调试与状态指示。

  2. 配置虚拟串口(可选)

    用于调试输出或波形观察。

bash 复制代码
LPUART1:Asynchronous
波特率:115200
引脚:PA2 / PA3

2.2 TIM 配置

在本实验中,TIM1 作为核心执行外设,用于生成三相互补 PWM 输出,是 SVPWM 输出链路的关键硬件基础。系统结构上仍保留"TIM1 → ADC → 计算"的事件驱动链路,但 ADC 仅作为触发源使用,不参与数据采样。

本章的重点由"采样触发"转向"SVPWM 调制与 PWM 输出执行",即验证"SVPWM 计算 → TIM1 占空比更新 → PWM 硬件输出"的过程。因此,TIM1 的配置重点转变为 PWM 生成与同步更新机制。

  1. 配置 TIM1 管脚。
bash 复制代码
TIM1_CH1 → PA8
TIM1_CH2 → PA9
TIM1_CH3 → PA10
TIM1_CH1N → PB13
TIM1_CH2N → PB14
TIM1_CH3N → PB15
  1. 启用 TIM1,工作模式设置为 PWM Generation。
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 互补输出)

本实验以 SVPWM 输出链路验证为核心,重点关注三相 PWM 占空比的生成与输出关系,而不对 PWM 波形本身的底层调制细节(如载波比较过程)进行展开分析。TIM1 及其 PWM 基本配置沿用(17)中的设置。

需要说明的是,TIM1 在本实验中同时承担两项关键作用:一方面用于生成三相互补 PWM 输出,作为 SVPWM 调制结果的执行载体;另一方面作为系统主定时器,用于触发 ADC 并驱动计算子系统的事件调度。因此相关配置予以保留,以保证系统结构一致性,并与后续 FOC 闭环控制保持一致。

  1. TIM1 计数器参数配置:
    TIM1 的 TRGO(Update Event)作为 ADC 注入组的触发源,是本实验调度链路的核心。

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 复制代码
PSC = 0
ARR = 7999
Center-Aligned mode 1
TRGO = Update Event
youcans@qq.com   
  1. 死区时间参数配置:
    该配置主要用于功率驱动保护,在本实验中不参与功能验证,仅为后续实验保留。
bash 复制代码
Break And Dead Time management - Output Configuration:
   Dead Time: 50(计数周期)

2.3 ADC 配置(周期触发)

ADC 的配置目标是:在 TIM1 触发下完成同步采样,并产生转换完成事件(JEOC),作为系统计算的触发信号。

  1. 启用 ADC1:
bash 复制代码
ADC1_IN2 → PA1(I_U)
ADC1_IN12 → PB1(I_V)
ADC1_IN15 → PB0(I_W)
  1. ADC1 注入组配置(TIM1_CH4 硬件触发同步采样)

    ADC 注入组在 TIM1 触发下完成三通道同步采样,并在转换结束后产生 JEOC 中断,用于触发 Simulink Function-Call 子系统执行一次计算。

  2. 启用 ADC1:

    External Trigger:TIM1 TRGO

    Trigger Edge:Rising Edge

  3. 中断使能:

    使能 ADC1_2 global interrupt。

2.4 DAC 配置(双通道波形观测) 为了便于使用示波器同时观测两路坐标变换结果,本实验启用 DAC1 的两个输出通道。

  1. 启用 DAC1:
bash 复制代码
DAC1_OUT1 → PA4
DAC1_OUT2 → PA5

需要注意,PA5 同时是 NUCLEO 开发板上的 LD2 引脚,因此启用 DAC1_OUT2 后,不再保留 LD2 的 GPIO 输出功能。

  1. 输出模式:
    在 Pinout & Configuration 中选择 DAC1,开启 OUT1、OUT2 输出通道,设置为 "Connected to external pin only" 模式。

2.5 工程配置

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

  1. 在 Project 页面:

    • Project Name:SVPWM01.ioc
    • 选择工程保存路径
    • 勾选 "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) 选项全部取消。
  1. 保存工程
    完成上述配置后,使用快捷键 Ctrl + S 或点击 File → Save Project 保存 CubeMX 工程文件。

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

3. 实验方法与实现流程

本实验的 Simulink 模型延续前述章节的事件驱动设计思想,以"采样完成事件触发一次调制计算"为核心原则:ADC 的采样时刻由 TIM1 硬件触发决定,Simulink 不参与任何触发时序控制;模型仅在 ADC 转换完成事件到来时执行一次数据生成与 SVPWM 调制计算,并更新 PWM 输出,从而形成"触发 → 计算 → 输出"的执行链路。

与前述坐标变换验证不同,本实验不再以数学变换本身为重点,而是聚焦于 FOC 控制中的执行环节,即:

bash 复制代码
αβ 电压矢量 → SVPWM 调制 → 三相 PWM 输出

在实现上,三相电流由软件生成,经 Clarke 变换得到 αβ 电压输入;SVPWM 模块根据 αβ 分量计算三相占空比,并通过 TIM1 输出三相互补 PWM 波形,实现从空间矢量到驱动信号的映射过程。

本章按照由简到繁的思路设计为三个递进实验:

  • 实验1:三相互补 PWM 输出验证。用于确认 TIM1 PWM 输出链路正常,验证硬件执行路径是否建立;
  • 实验2:固定 αβ 输入下的 SVPWM 占空比验证。在给定静态 αβ 输入的条件下,观察三相占空比关系,验证 SVPWM 调制结果的正确性;
  • 实验3:旋转矢量输入下的 SVPWM 动态输出验证。通过构造旋转 αβ 矢量,观察三相 PWM 占空比随电角度连续变化的过程,验证调制过程的动态特性。

通过上述三个实验,逐步完成从 PWM 硬件输出验证到 SVPWM 调制过程验证的构建,并在保持系统调度结构一致的前提下,实现从"数学变换验证"向"执行链路验证"的过渡,为后续构建完整 FOC 闭环控制系统奠定基础。

3.1 模型任务与结构

本实验的硬件侧链路与(17)保持一致:

  • TIM1(TRGO = Update Event)硬件触发 ADC1 周期性转换;
  • ADC 完成一次转换后产生 ADC1_2 中断事件;
  • 中断事件触发 Simulink 的 Function-call 子系统执行一次计算。

Simulink 模型的任务是:在该中断事件驱动下,完成一次数据生成、坐标变换与 SVPWM 调制计算,并更新 PWM 输出。具体分工如下:

  • 硬件负责时序
    • PWM 周期、ADC 触发时刻与采样启动均由 TIM1/ADC 外设硬件完成;
  • 模型负责运行期计算
    三相电流生成(软件)
    • Clarke 变换(abc → αβ)
    • SVPWM 调制(αβ → Ta, Tb, Tc)
    • PWM 占空比更新(写入 TIM1 CCR)
  • 严格事件驱动执行
    • 所有计算均在 ADC 转换完成事件触发的 Function-call 子系统中完成
    • 不依赖模型基础步长或后台周期任务

需要说明的是:

本实验中 ADC 仅作为系统调度的触发源使用,不参与实际数据采样。

三相电流 Iabc 由软件生成,用于构造可控输入,从而保证验证过程的稳定性与可重复性,同时保持与后续闭环控制一致的数据链路结构。

从系统结构上看,本文构建的完整调度与执行链路如下:

bash 复制代码
TIM1 TRGO(Update Event)
 └─ 触发 ADC1 转换
     └─ ADC1 转换完成事件
         └─ ADC1_2_IRQHandler(Hardware Interrupt)
             └─ Function-call Triggered Subsystem
                 ├─ 三相电流生成(软件)
                 ├─ Clarke 变换(iα, iβ)
                 ├─ SVPWM 调制(Ta, Tb, Tc)
                 └─ TIM1 PWM 输出(CCR 更新)

3.2 创建仿真模型

创建 Simulink 模型

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

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

Simulink 模型结构

Simulink 模型由两部分组成:

  1. 顶层模型(Base-rate)

    仅用于系统支撑与中断引入,不参与具体算法计算。

  2. 事件驱动子系统(Function-call Triggered Subsystem)

    由 ADC 中断触发,完成三相电流生成、Clarke 变换及 SVPWM 调制计算,是本实验的核心。

顶层模型(Base-rate)模块

主模型中放置以下模块:

  1. Hardware Interrupt(中断入口)
    模块名称:Hardware Interrupt
    该模块将 ADC 转换完成事件引入 Simulink,作为事件驱动子系统的触发源。
    配置如下:
bash 复制代码
Interrupt group:ADC
Interrupt name :ADC1_2_IRQHandler
Events to serve:选择与 CubeMX 配置一致的 ADC 转换完成事件
  1. Function-call Triggered Subsystem(事件驱动子系统)
    该子系统模拟中断服务逻辑,是 SVPWM 计算的执行入口。
    • 子系统类型: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)。
bash 复制代码
ADC instance:ADC1
Conversion group:Injected
Access mode:Read only
Number of conversions:3

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

  1. 三相电流生成模块(软件)

    本实验中三相电流不来源于 ADC 实际采样,而由软件生成,用于构造稳定、可控的输入信号。

    通过正弦函数生成三相平衡电流:

    • ia = A · cos(θe)
    • ib = A · cos(θe − 2π/3)
    • ic = A · cos(θe + 2π/3)
      其中:
    • θe:电角度,由模型内部角度发生器或积分器生成;
    • A:电流幅值(可设为常数或变量)。
  2. Clarke 变换模块(abc → αβ)

    将三相电流投影至 αβ 静止坐标系

bash 复制代码
iα = (ia - ib/2 - ic/2) * 2/3
iβ = (ib - ic) / √3

Clarke 变换模块的输出:iα、iβ,作为 SVPWM 的输入量。

  1. SVPWM 调制模块
    根据 αβ 电压分量计算三相 PWM 占空比:
bash 复制代码
(Uα, Uβ) → SVPWM → (Ta, Tb, Tc)

模块功能包括:

  • 扇区判断(Sector Identification)
  • 有效矢量作用时间计算(T1, T2, T0)
  • 占空比分配(Ta, Tb, Tc)

SVPWM 算法的具体推导已在前述章节中给出,此处仅作为功能模块调用,不再展开。

  1. PWM 占空比映射模块
    将 SVPWM 输出的占空比映射至 TIM1 比较寄存器(CCR):
bash 复制代码
CCR = Ta × ARR

对应关系:

  • CCR1 ← Ta
  • CCR2 ← Tb
  • CCR3 ← Tc

说明:

  • ARR 为定时器周期(本实验为 7999);
  • 占空比范围:0 ~ 1。

本实验不使用 DAC 输出,PWM 波形通过 TIM1 硬件直接生成并可通过示波器观测。

本节完成了 SVPWM 实验的 Simulink 模型构建,通过"中断驱动 + 功能模块划分"的方式,将三相电流生成、坐标变换与 PWM 调制过程集成于统一的事件执行框架中,实现了从 αβ 电压输入到三相 PWM 输出的完整模型映射,为后续代码生成与实验验证奠定基础。

  1. 模型求解器与仿真参数设置
    在 Simulink 菜单中选择 "建模 → 模型设置"(Ctrl + E),在"求解器"中进行如下设置:
bash 复制代码
仿真时间:inf
类型:定步长(Fixed-step)
固定步长:auto
(可选)将每个离散速率视为单独任务
(可选)自动处理数据传输的速率转换

说明:

本实验采用事件驱动执行机制,Function-call 子系统由 ADC 中断触发;

基础步长不参与核心计算调度,仅用于模型运行支撑。

  1. 关联 CubeMX 工程文件
    在配置参数窗口中切换至 "硬件实现(Hardware board settings)",完成关联:
bash 复制代码
Hardware board:STM32G4xx Based
CubeMX 工程文件:SVPWM01.ioc
  1. 定时器配置(TIM1)
    展开 Target hardware resources -- Timers,进行如下设置:
bash 复制代码
Timer group:Advanced Timers 1/8/20
勾选:Show TIM1 configurations
勾选:Start timer during model initialization
勾选:Enable Update Interrupt

说明:TIM1 在本实验中承担双重角色:

  • PWM 生成(SVPWM 输出执行);
  • 系统节拍基准(触发 ADC)。
  1. ADC 配置(调度触发)
    展开 Target hardware resources -- ADC1,进行如下设置:
bash 复制代码
勾选:Enable Injected EoCS interrupt
勾选:Run ADC calibration during model initialization

说明:

本实验中 ADC 仅用于产生"转换完成事件",作为 Function-call 子系统的触发源,不参与实际数据采样。

  1. 保存模型
    将模型保存为:SVPWM01.slx
    确保 .slx 与 .ioc 位于同一目录。

3.4 STM32 代码生成与运行

  1. 硬件连接

    使用 USB 线连接 PC 与 NUCLEO-G431RB 开发板,确保 ST-LINK 正常识别。

  2. 生成并部署代码

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

    Simulink 将自动完成以下过程:

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

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

c 复制代码
### 正在启动 SvpwmMBD01 的编译过程
### 正在为 '模型特定' 文件夹结构生成代码和工件
### 正在将代码生成到编译文件夹中: C:\MATLAB\MBD_STM32G431\SVPWM\SvpwmMBD01_ert_rtw
### Invoking Target Language Compiler on SvpwmMBD01.rtw
### Using System Target File: C:\MATLAB\R2023b\rtw\c\ert\ert.tlc

### Writing source file ert_main.c
### TLC code generation complete (took 2.106s).
### 正在保存二进制信息缓存。
### 使用工具链: GNU Tools for ARM Embedded Processors
### 'C:\MATLAB\MBD_STM32G431\SVPWM\SvpwmMBD01_ert_rtw\SvpwmMBD01.mk' 是最新的
### 正在编译 'SvpwmMBD01': "C:\MATLAB\R2023b\bin\win64\gmake"  -f SvpwmMBD01.mk all

Download verified successfully
### Successful completion of build procedure for: SvpwmMBD01
### 'SvpwmMBD01' 的 Simulink 缓存工件是在 'C:\MATLAB\MBD_STM32G431\SVPWM\SvpwmMBD01.slxc' 中创建的。

编译过程已成功完成

编译的顶层模型目标:
    
模型      操作       重新编译原因     
====================================
SvpwmMBD01  代码已生成并完成编译。  生成的代码已过期。  
    
编译了 1 个模型,共 1 个模型(0 个模型已经是最新的)
编译持续时间: 0h 0m 26.625s
  1. 运行与验证
    代码下载完成后,模型即在 STM32 上运行:
    • 实验1:三相互补 PWM 输出,验证三相 PWM 输出;
    • 实验2:固定 αβ 输入验证,验证三相占空比;
    • 实验3:旋转矢量动态验证,输入旋转 αβ 矢量(sin/cos),观察三相 PWM 波形随时间变化情况 。

4. 实验验证:

在第3章中,我们完成了 Simulink-STM32 实验方法与工程流程的构建,包括模型搭建、硬件配置以及代码生成与运行。

在此基础上,本章按照"由简到繁"的思路,逐步开展 SVPWM 输出链路的实验验证。从三相 PWM 硬件输出出发,依次引入 SVPWM 静态调制与动态调制过程,最终完成从 αβ 电压矢量到三相 PWM 驱动信号的完整执行链路验证。

本章的验证重点是:SVPWM 调制结果是否能够被 TIM1 正确转换为三相 PWM 输出。通过逐级实验,可以清晰判断:

  • PWM 硬件输出是否正常;
  • SVPWM 占空比计算是否正确;
  • 动态调制过程是否连续稳定。

4.1 实验1:三相互补 PWM 输出验证

  1. 实验目的:

    本实验用于验证 TIM1 三相互补 PWM 输出是否正常,为后续 SVPWM 调制验证提供硬件基础。本实验与 STM32-MBD(17)基于 ADC 同步采样的 PWM 闭环控制链路 本质上是一致的。

    重点确认:

    • TIM1 三个通道 PWM 是否正常输出;
    • 三相 PWM 是否具备正确的相位关系;
    • 互补输出(CHx / CHxN)是否正确;
    • 死区时间是否生效。
  2. 实验方法:

    在本实验中,不引入 SVPWM 调制,仅设置固定占空比输出:Ta = Tb = Tc = 常数(如 0.5)

    通过 Simulink 模型直接将固定占空比写入 TIM1 CCR 寄存器:

bash 复制代码
 CCR1 = Ta × ARR
CCR2 = Tb × ARR
CCR3 = Tc × ARR

其中:ARR = 7999(对应 10 kHz PWM),占空比范围:0 ~ 1。

  1. 模型配置:

在本实验中,SVPWM 模块尚未启用,仅对 TIM1 三相 PWM 输出进行基础验证。因此,在 Function-call Triggered Subsystem 内,仅需构建最小执行链路,实现固定占空比输出。

Function-call Triggered Subsystem 内部包含以下模块:固定占空比生成 → 占空比映射(CCR计算) → PWM输出(TIM1)。CCR 更新后不会立即生效,而是在定时器 Update Event 时统一加载,从而保证三相 PWM 同步更新。

  1. 实验结果:
    使用示波器分别观测以下引脚:
    • PA8(TIM1_CH1)
    • PA9(TIM1_CH2)
    • PA10(TIM1_CH3)
      以及(可选):
    • PB13 / PB14 / PB15(互补输出)

TIM1_CH1(黄色)与TIM1_CH2(玫红)的波形如下图所示。通过示波器波形可以观察到:

(1)CH1、CH2 输出稳定方波,频率约为 10 kHz,占空比分别为 50%、25%,与 Simulink 模型设置一致。

(2)PWM 波形关于周期中心对称,上升/下降沿对称分布。

TIM1_CH1(黄色)与TIM1_CH1N(玫红)的波形如下图所示。通过示波器波形可以观察到:

(1)互补输出正确:CH1 与 CH1N 波形反相,上下桥不会同时导通。

(2)存在死区时间:上下桥切换存在短暂"空白区",防止上下桥直通。

本实验验证了 TIM1 三相互补 PWM 输出链路的正确性,确认了硬件执行层能够稳定生成三相 PWM 信号,为后续 SVPWM 调制结果的加载与验证提供了可靠基础。

4.2 实验2:固定 αβ 输入下的 SVPWM 占空比验证

  1. 实验目的:

    本实验用于验证 SVPWM 调制算法在静态输入条件下的正确性,即:在给定固定 αβ 电压输入时,三相 PWM 占空比(Ta、Tb、Tc)是否符合理论关系。

  2. 实验方法:

    在本实验中,输入固定 αβ 电压矢量,例如:Uα = 1,Uβ = 0,该输入对应于空间矢量位于 α 轴正方向。

    SVPWM 模块根据输入计算三相占空比:(Uα, Uβ) → SVPWM → (Ta, Tb, Tc)。系统执行链路如下:

bash 复制代码
Uα / Uβ
   ↓
SVPWM(MATLAB Function)
   ↓
Ta / Tb / Tc
   ↓
PWM Out(TIM1_CH1 / CH2 / CH3)

其中:

  • SVPWM 在 Function-call 子系统中执行;
  • TIM1 负责三相 PWM 波形输出;
  • 占空比在每个 PWM 周期同步更新。
  1. 模型配置:
    在 Function-call Triggered Subsystem 内,SVPWM 模块采用 MATLAB Function 实现,其结构如下:
    αβ 输入(常数) → SVPWM MATLAB Function → 占空比输出 → PWM 输出
    (1)αβ 输入模块:Constant 模块设为常数。
    (2)SVPWM 模块:输入 Uα, Uβ,输出 Ta, Tb, Tc。
    (3)占空比映射模块。

SVPWM 模块采用 SVPWM MATLAB Function 实现:

  • 输入:Ualpha, Ubeta, Vdc, Ts;
  • 输出:Ta, Tb, Tc, sector, theta。
    其中:
    • Ta, Tb, Tc:三相归一化占空比(0~1)
    • sector:扇区号(1~6)
    • theta:电压矢量角度(0~2π)

本节对应的 Simulink 模型结构如图所示。

  1. 实验结果:
    使用示波器分别观测以下引脚:
    • Ta:PA8(TIM1_CH1)
    • Tb:PA9(TIM1_CH2)
    • Tc:PA10(TIM1_CH3)

TIM1_CH1(黄色)与TIM1_CH2(玫红)的波形如下图所示。通过示波器波形可以观察到:

(1)占空比为固定值:Ta、Tb 为常数,PWM 占空比稳定不变。

(2)占空比 Ta > Tb,与 Uα>0、Uβ=0 时的理论分析一致。

TIM1_CH2(黄色)与TIM1_CH3(玫红)的波形如下图所示。通过示波器波形可以观察到:

(1)占空比为固定值:Tb、Tc 为常数,PWM 占空比稳定不变。

(2)占空比满足对称性:Tb 与 Tc 相同,与 Uα>0、Uβ=0 时的理论分析一致。

4.3 实验3: αβ 输入下的 SVPWM 占空比验证

  1. 实验目的:

    本实验在固定 αβ 输入实验的基础上的基础上,引入随时间变化的三相电流输入信号,通过 Clarke 变换生成旋转 αβ 矢量,从而验证 SVPWM 在动态条件下的输出特性。

    实验目标为:当输入空间矢量连续旋转时,SVPWM 是否能够生成随时间连续变化的三相 PWM 占空比,并在模拟观测通道中形成典型马鞍波调制波形。

  2. 实验方法:

    在本实验中,输入由常数改为三相平衡信号,经 Clarke 变换生成旋转 αβ 矢量,例如:
    Iabc(软件生成) → Clarke → (Uα, Uβ)

    SVPWM 模块根据输入计算三相占空比:(Uα, Uβ) → SVPWM → (Ta, Tb, Tc)

系统执行链路如下:

bash 复制代码
Iabc(软件生成)
     ↓
Clarke
     ↓
Uα / Uβ(旋转矢量)
     ↓
SVPWM(MATLAB Function)
     ↓
Ta / Tb / Tc
     ↓
(1) PWM Out(TIM1_CH1 / CH2 / CH3)
(2) DAC 输出(波形观测)

其中:

  • 三相信号由模型内部生成;
  • Clarke 变换用于构造旋转 αβ 矢量;
  • SVPWM 在 Function-call 子系统中执行;
  • TIM1 负责三相 PWM 输出;
  • 占空比在每个 PWM 周期同步更新
  1. 模型配置:
    在 Function-call Triggered Subsystem 内,模型结构如下:三相输入 → Clarke → SVPWM → 占空比输出 → PWM 输出/DAC 输出

具体模块组成如下:

(1)三相输入模块:通过正弦函数生成 Ia、Ib、Ic。

(2)Clarke 变换模块:输入 Ia、Ib、Ic,输出 Uα、Uβ。

(3)SVPWM 模块:输入 Uα、Uβ,输出 Ta、Tb、Tc。

(4)占空比映射模块:Ta、Tb、Tc 经比例变换后输入 PWM Out。

(5)DAC 输出:Ta → DAC1_CH1(PA4),Tc → DAC1_CH2(PA5)。

本节对应的 Simulink 模型结构如下图所示。

  1. 实验结果:
    (1)首先通过示波器观测 PWM 输出波形进行验证。
    • Ta:PA8(TIM1_CH1)
    • Tb:PA9(TIM1_CH2)
    • Tc:PA10(TIM1_CH3)

TIM1_CH1(黄色)与TIM1_CH2(玫红)的波形如下图所示。通过示波器波形可以观察到:

PWM 高电平宽度随时间连续变化,这与实验 4.2 中 "占空比不变" 形成对比。

(2)还可以直接通过 DAC 输出对 Ta/Tb/Tc 调制波形进行观测。

  • Ta:DAC1_CH1
  • Tb:DAC1_CH2

观察 DAC 输出(CH1 / CH2),可以发现:

  • Ta、Tc 是连续变化的周期波形,说明 SVPWM 输出随输入矢量旋转而变化;
  • 两路波形存在稳定相位差,表明三相占空比之间存在固定相位关系;
  • 两路波形为 SVPWM 调制的典型特征(马鞍波)。

本实验通过三相输入与 Clarke 变换构造旋转 αβ 矢量,并结合 DAC 输出对调制结果进行观测,验证了 SVPWM 在动态条件下的输出特性。

本章按照"由简到繁"的思路,依次完成了三相 PWM 输出验证、SVPWM 静态映射验证以及动态调制验证,建立了从 αβ 电压到三相 PWM 输出的完整调制与驱动链路。

5. 总结

本文围绕空间矢量 PWM(SVPWM)输出链路的构建与验证,完成了从 αβ 电压到三相 PWM 驱动信号的映射过程,并通过三个递进实验逐步验证了系统的正确性。

在实验1中,验证了 TIM1 三相互补 PWM 输出的基本功能,确保硬件驱动链路正常;在实验2中,通过固定 αβ 输入,验证了 SVPWM 的静态映射关系,即空间电压矢量能够正确转换为三相占空比;在实验3中,通过构造旋转输入并结合 DAC 输出观测,验证了 SVPWM 在动态条件下的调制特性,观察到相位交错且具有典型特征的调制波形。

通过上述实验,本文建立了如下完整执行链路:Iabc → Clarke → αβ → SVPWM → PWM。该链路实现了从三相系统到空间矢量调制再到硬件驱动输出的全过程,是 FOC 控制中电压调制环节的核心组成部分。

至此,FOC 控制中的"坐标变换 → 电压调制 → PWM 输出"关键链路已经完整打通。后续可以在此基础上进一步引入电流闭环与电压调节,实现完整的电机控制系统。

本文所采用的"统一调度结构 + 分步验证"的方法,有效实现了系统结构与算法模块的解耦,为后续引入 SVPWM、电流环及完整电机控制系统的实现奠定了基础。

版权声明:

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

【FOC-MBD】(20)矢量空间脉宽调制 (SVPWM)输出(https://blog.csdn.net/youcans/article/details/159803343)

Copyright@youcans 2026

Crated:2026-04

相关推荐
Three~stone2 小时前
MATLAB vs Python 两者区别和安装教程
开发语言·python·matlab
点灯小铭2 小时前
基于单片机的全自动洗衣机控制器设计
单片机·嵌入式硬件
Flamingˢ2 小时前
ZYNQ + OV5640 + HDMI 视频系统调试记录:一次 RGB888 与 RGB565 引发的黑屏问题
arm开发·嵌入式硬件·fpga开发·vim·音视频
-Springer-3 小时前
STM32 学习 —— 个人学习笔记10-2(I2C 通信外设 & 硬件 I2C 读写 MPU6050)
笔记·stm32·学习
Strange_Head3 小时前
《Linux系统编程篇》Linux Socket 网络编程03(Linux 进程间通信(IPC))——基础篇
linux·网络·单片机
搁浅小泽3 小时前
大电流焊点补焊要求
单片机·嵌入式硬件·可靠性工程师
Linux猿3 小时前
基于单片机浴室窗帘控制系统 | 附源码
单片机·嵌入式硬件·毕业设计·源码·课程设计·项目·基于单片机于是窗帘控制系统
清风6666664 小时前
基于51单片机的的智能电动车充电桩系统设计
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
Flamingˢ4 小时前
YNQ + OV5640 视频系统开发(二):OV5640_Data IP 核源码解析
arm开发·嵌入式硬件·网络协议·tcp/ip·fpga开发·vim·音视频