STM32-MBD(1)Matlab2022/2023 安装 STM32 硬件支持包
STM32-MBD(15)Simulink 模型开发之三相互补 PWM
STM32-MBD(16)TIM 硬件触发 ADC 同步采样
STM32-MBD(17)基于 ADC 同步采样的 PWM 闭环控制链路
STM32-MBD(18)Clarke / Park 坐标变换链路
【STM32-MBD】(18)Clarke / Park 坐标变换链路
-
- [1. 项目介绍](#1. 项目介绍)
-
- [1.1 项目内容](#1.1 项目内容)
- [1.2 实验方案](#1.2 实验方案)
- [1.3 技术原理](#1.3 技术原理)
- [1.4 软件需求与环境配置](#1.4 软件需求与环境配置)
- [1.5 硬件需求与引脚分配](#1.5 硬件需求与引脚分配)
- [2. CubeMX工程配置](#2. CubeMX工程配置)
-
- [2.1 创建新项目](#2.1 创建新项目)
- [2.2 TIM 配置](#2.2 TIM 配置)
- [2.3 ADC 配置(周期触发与中断使能)](#2.3 ADC 配置(周期触发与中断使能))
- [2.4 DAC 配置(双通道波形观测)](#2.4 DAC 配置(双通道波形观测))
- [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. 实验验证:Clarke / Park 坐标变换](#4. 实验验证:Clarke / Park 坐标变换)
-
- [4.1 实验 1:模拟电流输出(三相生成验证)](#4.1 实验 1:模拟电流输出(三相生成验证))
- [4.2 实验2:Clarke 变换验证(abc → αβ)](#4.2 实验2:Clarke 变换验证(abc → αβ))
- [4.3 实验3:Clarke + Park 变换验证(abc → αβ → dq)](#4.3 实验3:Clarke + Park 变换验证(abc → αβ → dq))
- [5. 总结](#5. 总结)
1. 项目介绍
1.1 项目内容
在上一实验 (17)基于 ADC 同步采样的 PWM 闭环控制链路 中已经完成了基于 ADC 同步采样事件驱动的 PWM 更新链路验证。实验确认了:"TIM1 触发 ADC → ADC 完成事件 → Simulink 执行一次计算 → PWM 更新" 这一 "采样完成驱动一次计算" 的调度结构是稳定且可靠的。
本实验在此基础上,进一步验证 FOC 算法中的 Clarke / Park 坐标变换链路,聚焦于 "三相电流 → αβ 静止坐标系 → dq 同步旋转坐标系" 的数学映射关系是否正确。
本实验的目标是验证以下数学链路是否正确实现:
bash
三相电流 (ia, ib, ic)
↓
Clarke 变换
↓
αβ 静止坐标系 (iα, iβ)
↓
Park 变换
↓
dq 同步旋转坐标系 (id, iq)
具体验证内容包括:
- 验证 Clarke 变换是否正确实现三相电流向 αβ 平面投影;
- 验证 Park 变换是否正确实现 αβ 坐标向 dq 坐标的同步旋转;
- 验证在角度匹配条件下,dq 分量是否满足理论预期。
本实验仅验证数学链路,不接电机、不驱动功率级。在 Simulink 中构建"纯软件三相输入源",在 ADC 转换完成事件触发的 Function-Call 子系统 中执行一次完整的 Clarke+Park 计算,并通过 DAC 输出 dq 结果进行验证。
1.2 实验方案
总体结构
延续上一实验的调度结构:
- 仍使用 TIM1 触发 ADC;
- 仍使用 ADC 转换完成事件触发子系统;
- 在事件子系统内部,不再读取真实 ADC 数据;
- 在事件子系统内部,由软件生成三相电流。
整体链路如下:
bash
ADC 完成事件
↓
软件三相电流生成
↓
Clarke 变换
↓
Park 变换
↓
输出 id / iq(DAC)
该调度结构与上一实验在调度机制保持一致,仅需替换数据来源;数学链路与硬件输入数据解耦。此时 ADC 不再作为数据来源,而仅作为系统调度的触发源使用。
1.3 技术原理
通过对PMSM的磁路分析得到磁链方程,电路分析得到电压方程,机械分析得到运动方程,由此建立PMSM控制的数学模型,相关数学基础详见 【永磁同步电机(PMSM)】 2. 数学模型与坐标变换
在 abc 三相静止坐标系建立的 PMSM 数学模型,由于电机处于高速旋转运动状态,旋转速度和转子角度与磁链的耦合使模型方程非常复杂,难以分析和求解。通过数学变换将abc三相静止坐标系变换到 d-q 同步旋转坐标系,可以对模型进行解耦和简化。
Clarke变换
使用 Clarke变换(用T3s/2s 表示),将 abc 三相静止坐标系(自然坐标系)转换到虚拟的 αβ 两相静止坐标系。
虚拟两相静止坐标系的假设:虚拟电机有两个虚拟的绕组,呈90°轴距分布,在定子槽中呈正弦分布,这两个绕组分别为直轴绕组和交轴绕组,即α,β轴。为简化分析过程,可以在建立α-β静止坐标系时将α轴与a-b-c静止坐标系的a相轴重合。
将abc三相静止坐标系下的 fa,fb,fc 分别映射到α-β轴上,得到虚拟物理量 fα, fβ,并分别表示任意的双绕组虚拟电机的时变电压,电流,磁链。
在电网电压平衡条件下,电网电压只存在正序分量,在abc坐标系下表示为:
u a u b u c \] = U \[ c o s ( ω t ) c o s ( ω t − 2 π / 3 ) c o s ( ω t + 2 π / 3 ) \] \\begin{bmatrix}u_a\\\\u_b\\\\u_c\\end{bmatrix} = U \\begin{bmatrix}cos{(\\omega t)}\\\\cos{(\\omega t-2\\pi/3)}\\\\cos{(\\omega t+2\\pi/3)}\\end{bmatrix} uaubuc =U cos(ωt)cos(ωt−2π/3)cos(ωt+2π/3) 其中,U 为相电压幅值, ω = 2 π f ω=2πf ω=2πf 为三相交流电压的角频率,f 为电压频率。 通过Clarke变换,将三相电压从abc三相静止坐标系变换到αβ两相静止坐标系: \[ u α u β u o \] = T 3 s / 2 s u ( a b c ) = 2 3 \[ 1 − 1 / 2 − 1 / 2 0 3 2 − 3 2 2 2 2 2 2 2 \] \[ u a u b u c \] \\begin{bmatrix}u_{\\alpha} \\\\u_{\\beta}\\\\u_o\\end{bmatrix} = T_{3s/2s} u(abc) =\\frac{2}{3} \\begin{bmatrix} 1 \& -1/2 \& -1/2\\\\ 0 \& \\frac{\\sqrt{3}}{2} \& -\\frac{\\sqrt{3}}{2}\\\\ \\frac{\\sqrt{2}}{2} \& \\frac{\\sqrt{2}}{2} \& \\frac{\\sqrt{2}}{2} \\end{bmatrix} \\begin{bmatrix}u_a \\\\u_b\\\\u_c\\end{bmatrix} uαuβuo =T3s/2su(abc)=32 1022 −1/223 22 −1/2−23 22 uaubuc 式中, u 0 , i 0 u_0, i_0 u0,i0 为零序分量。 **Park 变换** 再通过 Park 变换,将 αβ两相静止坐标系转换到 dq 同步旋转坐标系,得到在 dq坐标系下的数学模型。于是,三相静止坐标系的交流输入信号被变换为同步旋转坐标系的直流量。 从两相静止αβ坐标系到旋转dq坐标系的系统变换,可以通过将αβ坐标系的物理量分别投射到dq坐标轴上,然后进行对dq轴上的各个分量进行代数求和。 从α-β静止坐标系变换到d-q旋转坐标的变换,称为Park变换,用T2s/2r 表示。 在无中性点接地的三相星形连接电路和三角形连接电路中,存在 f a + f b + f c = 0 f_a+f_b+f_c=0 fa+fb+fc=0,因此零分量 f 0 f_0 f0 可以省略。 \[ f d f q \] = T 2 s / 2 r u ( α β ) = \[ c o s ( θ ) s i n ( θ ) − s i n ( θ ) c o s ( θ ) \] \[ f α f β \] \\begin{bmatrix}f_d\\\\f_q\\end{bmatrix} = T_{2s/2r} u(\\alpha \\beta) = \\begin{bmatrix} cos(\\theta)\&sin(\\theta)\\\\ -sin(\\theta)\&cos(\\theta)\\\\ \\end{bmatrix} \\begin{bmatrix}f_{\\alpha}\\\\f_{\\beta}\\end{bmatrix} \[fdfq\]=T2s/2ru(αβ)=\[cos(θ)−sin(θ)sin(θ)cos(θ)\]\[fαfβ
式中, θ = ∫ 0 t ω r d t + θ 0 \theta=\int_{0}^{t} \omega _r dt + \theta _0 θ=∫0tωrdt+θ0, ω r \omega _r ωr 是转子旋转速度, θ 0 \theta _0 θ0 为初始角度。
软件三相电流生成方式
为了避免调度结构发生变化,本实验仍在 ADC 完成事件子系统中生成数据。
Clarke 变换验证点
采用标准两相 Clarke 变换:
bash
iα = (ia - ib/2 - ic/2) * 2/3
iβ = (ib - ic) / √3
Park 变换验证点
标准 Park 变换:
bash
id = iα cosθe + iβ sinθe
iq = -iα sinθe + iβ cosθe
1.4 软件需求与环境配置
本文所涉及的 软件与开发环境配置,与前文【STM32-MBD】系列保持一致。关于所需软硬件条件及详细安装过程,请务必首先参考: 【STM32-MBD】(1)安装 Simulink STM32 硬件支持包。
强烈建议在安装相关软件时优先采用文中推荐版本,并严格按照步骤完成安装与配置。在 Model-Based Design 开发流程中,软件版本之间的兼容性对代码生成与工程部署具有重要影响,随意更换版本可能导致难以定位的问题。
必需的软件环境:
-
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。
-
-
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 处理器的硬件平台上,实现自动代码生成、编译与下载。
-
-
安装完成后的检查与验证
为确保 Simulink-STM32 代码生成与部署环境配置正确,应逐项进行基础验证测试。具体的检查流程与示例模型部署方法,请参考:【STM32-MBD】(2)Simulink 模型部署入门。
通过该基础测试,可确认以下关键环节均工作正常:
- Simulink 模型可正确生成 STM32 目标代码
- 工程可在 IDE 中顺利编译
- 程序可成功下载并在硬件上运行
1.5 硬件需求与引脚分配
-
硬件平台:
本文实验基于 NUCLEO-G431RB 开发板进行。该开发板搭载 STM32G431 MCU,内部集成高级定时器 TIM1,原生支持三相互补 PWM 输出及硬件死区插入,非常适合用于电机控制与功率驱动相关实验。
为验证 PWM 波形及 ADC 同步采样时序的正确性,实验过程中配合使用示波器对关键信号进行观测与调试。 -
硬件外设资源分工
本实验围绕 "TIM 硬件触发 ADC 同步采样" 的核心架构,对片上外设资源进行如下分工配置:
| 外设 | 工作模式 | 功能说明 |
|---|---|---|
| TIM1 | 中心对齐模式,频率 10kHz | CH1/CH1N、CH2/CH2N、CH3/CH3N :输出三相互补 PWM 定时器在 PWM 运行过程中产生 TRGO 触发事件,作为 ADC1 的硬件触发源 |
| ADC1 | 注入组模式,外部触发 | 触发源:TIM1 的 TRGO 事件; 采样通道:3路 (I_U / I_V / I_W); 转换完成后触发中断 |
| ADC2 | 规则组模式,软件触发 | 用于低速采集母线电压(Vbus)、温度(Temp) |
| DAC1 | 双通道输出(CH1 / CH2) | 用于输出坐标变换结果(iα/iβ 或 id/iq),便于示波器观测波形 |
其中,TIM 输出通道与 ADC 采样通道需根据具体硬件平台的原理图进行配置。本文实验基于 NUCLEO-G431RB 开发板 搭配 NUCLEO-IHM16M1 电机驱动板,支持三电阻或单电阻电流采样方案。
此外,为便于对坐标变换结果进行实时观测,本文启用 DAC1 的两个输出通道,通过示波器输出 iα / iβ 或 id / iq 波形。其中 PA5 原本对应开发板上的 LD2 指示灯,在本实验中复用为 DAC 输出引脚。
- 引脚分配
在上述硬件平台与外设分工基础上,本文采用的典型引脚分配如下。
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)
DAC 1:
OUT1 : PA4 (iα / id)
OUT2 : PA5 (iβ / iq)
youcans@qq.com
通过上述硬件资源分工与引脚配置,本文构建了"TIM1 → TRGO → ADC1 → 事件驱动计算 → DAC 输出"的完整实验链路。其中采样触发完全由定时器硬件事件驱动,不依赖软件调度,而计算结果通过 DAC 实时输出,为坐标变换链路验证提供了直观的观测手段。
2. CubeMX工程配置
本章围绕 Clarke / Park 坐标变换链路的验证展开,包含三个递进实验:实验1 为模拟电流输出(三相生成验证),实验2 为 Clarke 变换验证(abc → αβ),实验3 为 Clarke + Park 变换验证(abc → αβ → dq)。各实验在算法内容上逐步增加,但在系统调度结构上保持完全一致,均采用"TIM1 触发 ADC → ADC 转换完成事件驱动一次计算"的事件驱动机制。
基于上述设计,本实验的 CubeMX 工程配置总体沿用(17)中的设置,仅根据本章的观测需求启用 DAC1 的 CH1、CH2 两个输出通道,用于示波器同时观测两路信号(如 iα/iβ 或 id/iq)。
需要说明的是,在本章实验中,ADC 主要用于产生转换完成事件,作为系统调度的触发源;三相电流信号由软件生成,不依赖实际模拟量采样。
这种"保持系统结构不变,仅替换数据路径与算法模块"的设计方法,有助于将调度问题、数学变换问题与输入来源问题进行解耦,从而降低系统调试复杂度并提高验证效率。
以下将按照工程创建、TIM 配置、ADC 配置、DAC 配置和工程设置的顺序进行说明。
2.1 创建新项目
-
新建工程。
启动 STM32CubeMX,新建工程,选择 MCU:STM32G431RBT6 或开发板 NUCLEO-G431RB,点击 "Start Project" 创建项目,保存为:
STM32G431_Trans01.ioc。 -
配置系统时钟树。
(1)点击顶部 "Clock Configuration" 选项卡,进入时钟树配置界面。
(2)设置输入频率 24 MHz,系统主频 160 MHz:
- System Clock:160 MHz
- HCLK:160 MHz
- PCLK1:160 MHz
- PCLK2:160 MHz

- 系统配置(SYS / RCC)
在 Pinout & Configuration 界面中完成系统级配置:
(1)选择 System Core -- SYS:
Debug:Serial Wire
Timebase Source:TIM2
(2)选择 System Core -- RCC:
HSE:Crystal/Ceramic Resonator
LSE:Disable(本实验不使用)
说明:在 STM32-MBD 中,SysTick 通常用于模型调度。若需要 HAL 时间基准服务,可将 Timebase Source 切换至 TIM2 等外设。

-
GPIO 配置。
(1)将 用户按键(PC13) 配置为外部中断 GPIO_EXTI13
(2)不再将 LD2(PA5)配置为 GPIO_Output,因为本实验需要将 PA5 复用为 DAC1_OUT2。
-
配置虚拟串口(LPUART)
LPUART1:Asynchronous
波特率:115200
引脚:PA2 / PA3
用于调试输出或波形观察。
2.2 TIM 配置
在本实验中,TIM1 仍作为系统的时间基准核心,用于:
- 产生 PWM(虽本实验不使用);
- 触发 ADC 同步采样(关键)。
本实验不涉及 PWM 输出控制验证,因此不对 PWM 输出行为进行分析;但 TIM1 及其 PWM 配置仍然完整保留,以保证系统调度结构的一致性,并为后续 SVPWM 实验提供基础。
- 配置 TIM1 管脚。
bash
TIM1_CH1 → PA8
TIM1_CH2 → PA9
TIM1_CH3 → PA10
TIM1_CH1N → PB13
TIM1_CH2N → PB14
TIM1_CH3N → PB15
- 启用 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 互补输出)
本项目不以 PWM 输出控制为验证重点,因此不对 PWM 输出行为进行展开说明。TIM1 及其 PWM 配置完全沿用(17)中的设置。
需要说明的是,尽管本实验未使用 PWM 输出结果,但 TIM1 仍作为系统主定时器,用于触发 ADC 并驱动系统调度。因此相关配置予以保留,以保证系统结构一致性,并为后续 SVPWM 实验提供基础。
- 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
- 死区时间参数配置:
该配置主要用于功率驱动保护,在本实验中不参与功能验证,仅为后续实验保留。
bash
Break And Dead Time management - Output Configuration:
Dead Time: 50(计数周期)
2.3 ADC 配置(周期触发与中断使能)
ADC 的配置目标是:在 TIM1 触发下完成同步采样,并产生转换完成事件(JEOC),作为系统计算的触发信号。
本实验沿用(17)中的 ADC 通道配置,其中实际使用的为电位器输入通道。其余通道配置为保持工程结构一致性而保留,在本实验中不参与计算。
- ADC 引脚配置与中断使能
bash
ADC1_IN2 → PA1(I_U)
ADC1_IN12 → PB1(I_V)
ADC1_IN15 → PB0(I_W)
- ADC1 注入组配置(TIM1_CH4 硬件触发同步采样)
ADC 注入组在 TIM1 触发下完成三通道同步采样,并在转换结束后产生 JEOC 中断,用于触发 Simulink Function-Call 子系统执行一次计算。其参数配置如下:
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
- 中断配置
使能 ADC1_2 global interrupt。
2.4 DAC 配置(双通道波形观测)
为了便于使用示波器同时观测两路坐标变换结果,本实验启用 DAC1 的两个输出通道。
- DAC 引脚配置
在 Pinout View 中启用 DAC1,并配置如下引脚:
bash
DAC1_OUT1 → PA4
DAC1_OUT2 → PA5
需要注意,PA5 同时是 NUCLEO 开发板上的 LD2 引脚,因此启用 DAC1_OUT2 后,不再保留 LD2 的 GPIO 输出功能。
- DAC 通道配置
在 Pinout & Configuration 中选择 DAC1,开启 OUT1、OUT2 输出通道,设置为 "Connected to external pin only" 模式。
需要说明的是,DAC 为 12 位输出外设,Simulink 向 DAC 输出的数值应为 uint16 类型的 12 位码值,范围为 0~4095。
由于模型中计算得到的 iα、iβ、id、iq 等量为双极性信号,而 DAC 为单极性输出,因此在 Simulink 中输出到 DAC 前,需要先进行偏置与缩放映射,再转换为 uint16 类型。

2.5 工程配置
点击 "Project Manager" 进入工程设置界面:
-
在 Project 页面:
- Project Name:
STM32G431_Trans01 - 选择工程保存路径
- 勾选 "Do not generate the main()"
- Toolchain / IDE:选择 STM32CubeIDE
- 取消勾选 "Generate Under Root"
- Project Name:
-
在 MCU and Firmware Package 栏:
- 取消勾选 "Use latest available version"
- 选择 STM32Cube FW_G4 V1.6.0
- 若固件包未安装在默认路径,取消 "Use Default Firmware Location" 并手动指定路径。
-
在 Code Generator 中:
- 勾选 "Generate peripheral initialization as a pair of '.c/.h' files per peripheral",让每个外设生成独立的'.c/.h'文件。
-
在 Advanced Settings 中:
- 将 "Driver Selector" 全部设置为 "LL"(默认为 HAL)------非常重要,否则后续编译会报错!
- 将 Generated Function Calls 中的 Visibility (Static) 选项全部取消。
-
保存工程
完成上述配置后,使用快捷键 Ctrl + S 或点击 File → Save Project 保存 CubeMX 工程文件。
注意:本实验仅保存 .ioc 文件,不在 CubeMX 中生成代码,后续代码由 Simulink 自动生成并集成。在 STM32CubeMX 中完成配置后,不要点击 "GENERATE CODE" 生成代码。
3. 实验方法与实现流程
本实验的 Simulink 模型以"采样完成事件驱动一次坐标变换计算"为核心设计原则:ADC 的采样时刻由 TIM1 硬件触发决定,Simulink 不参与任何触发时序控制;模型仅在 ADC 转换完成事件到来时执行一次三相电流生成与坐标变换计算,并输出相应结果,从而形成"触发 → 计算 → 输出"的矢量数学链路。该链路验证不依赖电机与功率驱动,仅针对数学变换过程本身进行分析与验证。
本实验聚焦于 FOC 算法中的坐标变换过程,即"三相电流 → αβ 静止坐标系 → dq 同步旋转坐标系"的数学映射关系验证。在实现上,三相电流由软件生成,电角度由模型内部给定。本章按照由简到繁的思路设计为三个递进实验:
-
实验1:模拟电流输出(三相生成验证)。由软件生成三相平衡电流,并通过 DAC 输出进行观测,用于验证"事件触发 → 数据计算 → 输出更新"这一完整实验链路是否建立,同时确认输入信号正确;
-
实验2:Clarke 变换验证(abc → αβ)。在实验1的基础上引入 Clarke 变换,输出 iα、iβ,用于验证三相到 αβ 静止坐标系的投影关系是否正确;
-
实验3:Clarke + Park 变换验证(abc → αβ → dq)。在实验2的基础上引入电角度,完成 Park 变换并输出 id、iq,用于验证 αβ 坐标向 dq 同步旋转坐标系的变换是否正确。
通过上述三个实验,逐步完成从实验链路建立到完整坐标变换链路验证的构建,为后续引入 SVPWM 与实际电机控制奠定基础。
3.1 模型任务与结构
本实验的硬件侧链路与(17)保持一致:
- TIM1(TRGO = Update Event)硬件触发 ADC1 周期性转换;
- ADC 完成一次转换后产生 ADC1_2 中断事件。
Simulink 模型的任务是:在该中断事件驱动下完成一次三相电流生成与 Clarke / Park 坐标变换计算。具体分工如下:
- 硬件负责时序:PWM 周期、ADC 触发时刻与采样启动均由 TIM1/ADC 外设硬件完成;
- 模型负责运行期计算:生成三相电流 → Clarke 变换 →(可选)Park 变换 → 输出 αβ 或 dq 分量;
- 严格事件驱动:坐标变换计算仅发生在 ADC 采样完成事件触发的 Function-call 子系统中,不依赖模型基础步长或后台周期任务。
需要说明的是,在本实验中 ADC 主要作为系统调度的触发源使用;在实验3 中,将进一步读取 ADC 采样的电位器电压,并将其作为三相电流的参考幅值输入。
此外,为便于使用示波器对坐标变换结果进行直观观测,本实验采用 DAC1 的两个输出通道分别输出两路信号,实现双通道同步显示:
- 实验1:输出 ia、ic;
- 实验2:观察 iα、iβ;
- 实验3:输出 id、iq。
从系统结构上看,本文构建的调度与计算链路如下:
bash
TIM1 TRGO(Update Event)
└─ 触发 ADC1 转换
└─ ADC1 转换完成事件
└─ ADC1_2_IRQHandler(Hardware Interrupt)
└─ Function-call Triggered Subsystem
├─ 三相电流生成(软件)
├─ Clarke 变换(iα, iβ)
├─ Park 变换(id, iq,可选)
└─ DAC 输出(双通道观测)
3.2 创建仿真模型
创建 Simulink 模型
在 CubeMX 工程文件所在目录下,新建一个 Simulink 模型,并保存为:STM32G431_Trans01.slx。
注意确保 Simulink 模型文件(.slx)与 CubeMX 工程文件(.ioc)位于同一目录,以便后续进行硬件资源关联和代码生成。
** Simulink 模型结构**
Simulink 模型由两部分组成:
-
顶层模型(Base-rate)
仅用于系统支撑与中断引入,不参与坐标变换计算。
-
事件驱动子系统(Function-call Triggered Subsystem)
由 ADC 中断触发,完成三相电流生成与 Clarke / Park 变换,是本实验的核心。
顶层模型(Base-rate)模块
主模型中放置以下模块:
-
Hardware Interrupt(中断入口)
模块名称:Hardware Interrupt
该模块用于将 ADC 转换完成事件引入 Simulink,作为事件驱动子系统的触发源。
配置如下:
- Interrupt group:ADC
- Interrupt name:ADC1_2_IRQHandler
- Events to serve:选择与 CubeMX 配置一致的 ADC 转换完成事件
-
Function-call Triggered Subsystem(事件驱动子系统)
该子系统模拟中断服务逻辑,是坐标变换计算的唯一执行入口。
- 子系统类型:Triggered Subsystem
- Trigger Port 类型:Function-call
事件驱动子系统内部结构
在 Function-call Triggered Subsystem 内,按如下顺序搭建模块:
-
三相电流生成模块(软件)
通过正弦函数生成三相平衡电流:
- ia = A · cos(θe)
- ib = A · cos(θe − 2π/3)
- ic = A · cos(θe + 2π/3)
其中: - θe 由模型内部积分或角度发生器生成;
- A 为电流幅值。
-
Clarke 变换模块
实现三相到 αβ 坐标的变换,输出 iα、iβ,用于实验2与后续计算。
bash
iα = (ia - ib/2 - ic/2) * 2/3
iβ = (ib - ic) / √3
- Park 变换模块
在实验 2 和实验 3 中实现 αβ-dq 坐标的变换:输出 id、iq。
bash
id = iα cosθe + iβ sinθe
iq = -iα sinθe + iβ cosθe
- 输出模块
为实现示波器观测,需要将双极性信号映射为 DAC 可输出的单极性数字量(0~4095)。
对于任一输出信号 x(如 iα、iβ、id、iq),采用如下映射:
DAC = 2048 + (2047 / 3.3) · x
并在输出前进行:- 限幅:0 ~ 4095
- 类型转换:uint16
输出通道分配如下:
-
DAC1_CH1(PA4):第一路信号
-
DAC1_CH2(PA5):第二路信号
3.3 关联 Simulink 模型与 CubeMX 工程
-
模型求解器与仿真参数设置
在 Simulink 菜单中选择 "建模 → 模型设置"(Ctrl + E),在"求解器"中进行如下设置:
- 仿真时间:inf
- 类型:定步长
- 固定步长:auto
- (可选)将每个离散速率视为单独任务
- (可选)自动处理数据传输的速率转换
-
关联 CubeMX 工程文件
在配置参数窗口中切换至 "硬件实现(Hardware board settings)",完成关联:
- Hardware board:STM32G4xx Based
- 选择 CubeMX 工程文件:STM32G431_Trans01.ioc
-
定时器配置
展开 Target hardware resources -- Timers:
- Timer group:Advanced Timers 1/8/20
- 勾选:Show TIM1 configurations
- 勾选:Start timer during model initialization
- 勾选:Enable Update Interrupt
-
ADC 配置(可选)
展开 Target hardware resources -- ADC1:
- 勾选:Enable Injected EoCS interrupt
- 勾选:Run ADC calibration during model initialization
-
保存模型
将模型保存为:
STM32G431_Trans01.slx。确保 .slx 与 .ioc 位于同一目录。
3.4 STM32 代码生成与运行
-
硬件连接
使用 USB 线连接 PC 与 NUCLEO-G431RB 开发板,确保 ST-LINK 正常识别。
-
生成并部署代码
打开仿真模型
STM32G431_Trans01.slx,在 "硬件(Hardware)" 选项卡中点击 "编译、部署和启动"(快捷键 Ctrl + B)。Simulink 将自动完成以下过程:
- 为模型生成 STM32 目标代码;
- 调用 CubeMX 工程配置;
- 通过 IDE 完成编译与链接;
- 将程序下载至 NUCLEO-G431RB 开发板并启动运行。
模型编译与部署过程中的关键信息将显示在 "诊断查看器" 中。编译摘要如下。
c
### 正在启动 Trans01 的编译过程
### 正在为 '模型特定' 文件夹结构生成代码和工件
### 正在将代码生成到编译文件夹中: C:\MATLAB\MBD_STM32G431\Trans01\Trans01_ert_rtw
### Invoking Target Language Compiler on Trans01.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.149s).
### 正在保存二进制信息缓存。
### 使用工具链: GNU Tools for ARM Embedded Processors
### 'C:\MATLAB\MBD_STM32G431\Trans01\Trans01_ert_rtw\Trans01.mk' 是最新的
### 正在编译 'Trans01': "C:\MATLAB\R2023b\bin\win64\gmake" -f Trans01.mk all...
Download verified successfully
### Successful completion of build procedure for: Trans01
### 'Trans01' 的 Simulink 缓存工件是在 'C:\MATLAB\MBD_STM32G431\Trans01\Trans01.slxc' 中创建的。
编译过程已成功完成
编译的顶层模型目标:
模型 操作 重新编译原因
=================================
Trans01 代码已生成并完成编译。 生成的代码已过期。
编译了 1 个模型,共 1 个模型(0 个模型已经是最新的)
编译持续时间: 0h 0m 27.644s
- 运行与验证
代码下载完成后,模型即在 STM32 上运行:- 实验1:观察 ia、ic ;
- 实验2:观察 iα、iβ ;
- 实验3:观察 id、iq 。
程序运行后,可通过示波器连接 DAC1_CH1(PA4)与 DAC1_CH2(PA5),分别观测两路输出信号(iα/iβ 或 id/iq),验证坐标变换链路的正确性。
4. 实验验证:Clarke / Park 坐标变换
在第3章中,我们完成了 Simulink-STM32 实验方法与工程流程的构建,包括模型搭建、硬件配置以及代码生成与运行。
在此基础上,本章按照"由简到繁"的思路,逐步开展坐标变换链路的实验验证。从三相电流生成出发,依次引入 Clarke 变换与 Park 变换,最终构建完整的 FOC 数学变换链路。
4.1 实验 1:模拟电流输出(三相生成验证)
在进行 Clarke / Park 坐标变换之前,首先需要验证实验链路与输入信号的正确性。本实验不涉及坐标变换,仅通过软件生成三相正弦电流,并通过 DAC 输出进行观测。
- 实验目的:
验证"事件触发 → 数据计算 → 输出更新"这一完整实验链路是否建立,同时确认三相电流生成正确,为后续坐标变换提供可靠输入。
- 模型配置:
在 Function-call Triggered Subsystem 内,仅保留三相电流生成与输出模块,不启用 Clarke / Park 变换。

三相电流由软件生成,其表达式为:
i a = A ⋅ c o s ( θ e ) i b = A ⋅ c o s ( θ e − 2 π / 3 ) i c = A ⋅ c o s ( θ e + 2 π / 3 ) i_a = A · cos(θe)\\ i_b = A · cos(θe − 2π/3)\\ i_c = A · cos(θe + 2π/3) ia=A⋅cos(θe)ib=A⋅cos(θe−2π/3)ic=A⋅cos(θe+2π/3)
其中:
- θe 为电角度,由相位累加器生成;
- A 为幅值参数,本实验中为常数。
为便于观测,通过 DAC 双通道输出:
- DAC1_CH1(PA4)→ Ia
- DAC1_CH2(PA5)→ Ic
- 实验结果:
使用示波器连接:PA4(CH1):Ia 、PA5(CH2):Ic 。观测波形如下图所示。
- 两路正弦波形,频率约为 100 Hz(由 Freq 值决定);
- 两路信号相位差约为 120°;
- 波形幅值相等、对称分布。
通过示波器观察到的三相正弦电流波形及其稳定的 120° 相位关系,证明了"相位生成 → 三相电流计算 → DAC 输出"这一输入链路已经建立成功,为后续引入 Clarke / Park 坐标变换奠定了可靠的信号基础。

4.2 实验2:Clarke 变换验证(abc → αβ)
在完成三相电流生成验证的基础上,本实验引入 Clarke 变换,实现从三相坐标系(abc)到两相静止坐标系(αβ)的映射,用于验证坐标变换链路的第一步。
- 实验目的:
本实验的目标是:验证 Clarke 变换的正确性,完成 "三相 → αβ" 坐标映射,并观察变换后信号的特性。
- 模型配置:
在实验 1 的基础上,引入 Clarke 变换模块:
- 输入:Ia、Ib、Ic
- 输出:iα、iβ
为便于观测,将变换结果通过 DAC 双通道输出:
- DAC1_CH1(PA4)→ iα
- DAC1_CH2(PA5)→ iβ
本节对应的 Simulink 模型结构如图所示。

- 实验结果:
使用示波器连接:PA4(CH1):iα 、PA5(CH2):iβ 。观测波形如下图所示。
- iα 与 iβ 均为正弦波;
- 两路信号频率与原三相电流一致;
- iα 与 iβ 之间存在约 90° 相位差;
- 两路信号幅值相等。
该结果表明,Clarke 变换已将三相对称系统成功映射为 αβ 平面上的正交分量。

通过示波器观察到的 iα / iβ 正交正弦波形,证明了 "三相电流 → Clarke 变换 → αβ 输出" 这一坐标变换链路已经建立成功,为后续引入 Park 变换奠定了基础。
4.3 实验3:Clarke + Park 变换验证(abc → αβ → dq)
在完成 Clarke 变换验证的基础上,本实验进一步引入 Park 变换,实现从 αβ 静止坐标系到 dq 同步旋转坐标系的映射,构建完整的坐标变换链路。
- 实验目的:
本实验的目标是:验证 Park 变换的正确性,完成"abc → αβ → dq"完整坐标变换,并观察 dq 坐标系下信号特性。
- 模型配置:
在实验2的基础上,引入 Park 变换模块:
- 输入:iα、iβ、θe
- 输出:id、iq
为便于观测,将变换结果通过 DAC 双通道输出:
- DAC1_CH1(PA4)→ id
- DAC1_CH2(PA5)→ iq
本节对应的 Simulink 模型结构如图所示。

- 实验结果:
使用示波器连接:PA4(CH1):id 、PA5(CH2):iq 。观测波形如下图所示。
- id 为近似恒定的直流量;
- iq 接近 0(或为极小波动);
- 输出信号不再呈现正弦变化。
这表明,原本在 αβ 坐标系中旋转的交流量,在 dq 同步旋转坐标系中被"解调"为直流量。

通过示波器观察到的 "交流量 → 直流量" 的变化现象,证明了 "abc → αβ → dq" 坐标变换链路已经建立成功,验证了 Park 变换在同步旋转坐标系中的解耦作用。
本章按照"由简到繁"的思路,依次完成了三相电流生成、Clarke 变换以及 Clarke + Park 变换的实验验证,建立了从 abc 到 αβ 再到 dq 的完整坐标变换链路。
实验结果表明:三相交流量在 αβ 坐标系中表现为正交旋转分量,在 dq 同步旋转坐标系中可转化为直流量,从而实现对交流量的简化表达。该过程验证了坐标变换的正确性,也为后续 FOC 控制中电流解耦与调节提供了基础。
5. 总结
本文基于 Simulink-STM32 开发框架,围绕 FOC 算法中的坐标变换过程,构建了一套完整的实验方法与验证路径。在统一的"TIM1 触发 ADC → 事件驱动计算 → DAC 输出"调度结构下,通过三个递进实验,依次完成了三相电流生成、Clarke 变换以及 Clarke + Park 变换的验证。
实验结果表明:三相交流量在 αβ 坐标系中表现为正交旋转分量,在 dq 同步旋转坐标系中可转化为直流量,实现了对交流量的简化表达。该过程不仅验证了坐标变换链路的正确性,也从实验现象上揭示了 FOC 控制中"交流量直流化"的核心思想。
本文所采用的"统一调度结构 + 分步验证"的方法,有效实现了系统结构与算法模块的解耦,为后续引入 SVPWM、电流环及完整电机控制系统的实现奠定了基础。
版权声明:
youcans@qq.com 原创作品,转载必须标注原文链接:
【STM32-MBD】(18)Clarke / Park 坐标变换链路(https://blog.csdn.net/youcans/article/details/157979216)
Copyright@youcans 2026
Crated:2026-04