电机驱动开发学习18. SVPWM 空间矢量调制算法详解与实现
-
- [一、本章相对 lesson17 改了什么](#一、本章相对 lesson17 改了什么)
- 二、从方波到正弦:调制算法的演进之路
-
- [2.1 面积等效原理:PWM 控制的的核心基石](#2.1 面积等效原理:PWM 控制的的核心基石)
- [2.2 演进第一步:六步换相(120° 方波控制)](#2.2 演进第一步:六步换相(120° 方波控制))
- [2.3 演进第二步:SPWM(正弦脉宽调制)](#2.3 演进第二步:SPWM(正弦脉宽调制))
- [2.4 演进第三步:SVPWM(空间矢量脉宽调制)](#2.4 演进第三步:SVPWM(空间矢量脉宽调制))
- [2.5 脉络总结:三大发波控制技术对比](#2.5 脉络总结:三大发波控制技术对比)
- 三、电角度插值算法
-
- [3.1 问题 霍尔 6 态为何不够?如何插值?](#3.1 问题 霍尔 6 态为何不够?如何插值?)
- [3.2 工程做法:扇区中心 + TIM5 插值](#3.2 工程做法:扇区中心 + TIM5 插值)
- [3.3 精度说明](#3.3 精度说明)
- [四、七段式 SVPWM 算法](#四、七段式 SVPWM 算法)
-
- [4.1 什么是 CCR?](#4.1 什么是 CCR?)
- [4.2 算法步骤](#4.2 算法步骤)
- 五、实验操作
-
- [5.1 编译烧录](#5.1 编译烧录)
- [5.2 推荐调试顺序](#5.2 推荐调试顺序)
- [5.3 串口命令(继承 lesson17)](#5.3 串口命令(继承 lesson17))
- [5.4 FreeMASTER 建议通道](#5.4 FreeMASTER 建议通道)
- 六、调试要点
- 七、小结

上一章 lesson17 完成了 FOC 速度外环 + DQ 电流内环 串级闭环,电流环 PI 输出 U α U_\alpha Uα、 U β U_\beta Uβ ,但执行端仍是 ∣ V ∣ → |V|\to ∣V∣→ 单占空比 + 六步换相------FOC 算的是旋转电压矢量,逆变器输出的却是方波,Id/Iq 必然有纹波。
本章补齐 FOC 链路缓存:SVPWM 空间矢量脉宽调制 ,把 U α / U β U_\alpha/U_\beta Uα/Uβ 转为三相正弦 PWM;同时解决 霍尔只有 6 态、电角度不连续 的问题,用 TIM5 捕获做扇区内线性插值。
一、本章相对 lesson17 改了什么
| 项目 | lesson17(六步板) | lesson18(本章) |
|---|---|---|
| 电压执行 | ∣ V ∣ → |V|\to ∣V∣→ 单一占空比 | SVPWM 算 U/V/W 三相 CCR,六步换相时按相写入 |
| 电压利用率 | V m a x = V b u s / 3 V_{max}=V_{bus}/\sqrt{3} Vmax=Vbus/3 | V m a x = V b u s × 2 / 3 V_{max}=V_{bus}\times 2/3 Vmax=Vbus×2/3(约 +15%) |
| 电角度 | 霍尔扇区中心 (+30°) | 扇区中心 + TIM5 扇区内 ±30° 插值 |
| 霍尔中断 | 六步换相 | 仍六步换相(野火板下桥为 GPIO) |
控制链路:
#mermaid-svg-uFgI6owVf4xkzLl2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uFgI6owVf4xkzLl2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uFgI6owVf4xkzLl2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uFgI6owVf4xkzLl2 .error-icon{fill:#552222;}#mermaid-svg-uFgI6owVf4xkzLl2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uFgI6owVf4xkzLl2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uFgI6owVf4xkzLl2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uFgI6owVf4xkzLl2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uFgI6owVf4xkzLl2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uFgI6owVf4xkzLl2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uFgI6owVf4xkzLl2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uFgI6owVf4xkzLl2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uFgI6owVf4xkzLl2 .marker.cross{stroke:#333333;}#mermaid-svg-uFgI6owVf4xkzLl2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uFgI6owVf4xkzLl2 p{margin:0;}#mermaid-svg-uFgI6owVf4xkzLl2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uFgI6owVf4xkzLl2 .cluster-label text{fill:#333;}#mermaid-svg-uFgI6owVf4xkzLl2 .cluster-label span{color:#333;}#mermaid-svg-uFgI6owVf4xkzLl2 .cluster-label span p{background-color:transparent;}#mermaid-svg-uFgI6owVf4xkzLl2 .label text,#mermaid-svg-uFgI6owVf4xkzLl2 span{fill:#333;color:#333;}#mermaid-svg-uFgI6owVf4xkzLl2 .node rect,#mermaid-svg-uFgI6owVf4xkzLl2 .node circle,#mermaid-svg-uFgI6owVf4xkzLl2 .node ellipse,#mermaid-svg-uFgI6owVf4xkzLl2 .node polygon,#mermaid-svg-uFgI6owVf4xkzLl2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uFgI6owVf4xkzLl2 .rough-node .label text,#mermaid-svg-uFgI6owVf4xkzLl2 .node .label text,#mermaid-svg-uFgI6owVf4xkzLl2 .image-shape .label,#mermaid-svg-uFgI6owVf4xkzLl2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-uFgI6owVf4xkzLl2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uFgI6owVf4xkzLl2 .rough-node .label,#mermaid-svg-uFgI6owVf4xkzLl2 .node .label,#mermaid-svg-uFgI6owVf4xkzLl2 .image-shape .label,#mermaid-svg-uFgI6owVf4xkzLl2 .icon-shape .label{text-align:center;}#mermaid-svg-uFgI6owVf4xkzLl2 .node.clickable{cursor:pointer;}#mermaid-svg-uFgI6owVf4xkzLl2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uFgI6owVf4xkzLl2 .arrowheadPath{fill:#333333;}#mermaid-svg-uFgI6owVf4xkzLl2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uFgI6owVf4xkzLl2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uFgI6owVf4xkzLl2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uFgI6owVf4xkzLl2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uFgI6owVf4xkzLl2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uFgI6owVf4xkzLl2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uFgI6owVf4xkzLl2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uFgI6owVf4xkzLl2 .cluster text{fill:#333;}#mermaid-svg-uFgI6owVf4xkzLl2 .cluster span{color:#333;}#mermaid-svg-uFgI6owVf4xkzLl2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uFgI6owVf4xkzLl2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uFgI6owVf4xkzLl2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-uFgI6owVf4xkzLl2 .icon-shape,#mermaid-svg-uFgI6owVf4xkzLl2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uFgI6owVf4xkzLl2 .icon-shape p,#mermaid-svg-uFgI6owVf4xkzLl2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uFgI6owVf4xkzLl2 .icon-shape .label rect,#mermaid-svg-uFgI6owVf4xkzLl2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uFgI6owVf4xkzLl2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uFgI6owVf4xkzLl2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uFgI6owVf4xkzLl2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 速度外环 50ms
电流内环 25ms
三相电流
Clark
θ 插值
Park
PI_Id / PI_Iq
InvPark
SVPWM
CCR U/V/W
霍尔 RPM
PI_speed
g_fm_target_iq
二、从方波到正弦:调制算法的演进之路
为什么 FOC 必须用 SVPWM?为了说透这个问题,我们需要从最根本的物理原理出发,梳理从六步换相 到 SPWM ,再到 SVPWM 的技术演进脉络。
2.1 面积等效原理:PWM 控制的的核心基石
无论是 SPWM 还是 SVPWM,其背后的物理学与数学支撑都是冲量相等面积等效原理:
面积等效原理 :
冲量(电压对时间的积分,即波形所占的面积)相等而形状不同的窄脉冲加在具有惯性的环节(如电机的电感绕组)上时,其效果基本相同。这里的"效果"主要是指电感中流过的电流响应波形基本一致。
用数学公式来表达:假设一个理想的正弦波电压信号 u ( t ) u(t) u(t) 在一个微小周期 Δ t \Delta t Δt 内的面积为 S s o u r c e S_{source} Ssource:
S s o u r c e = ∫ t 0 t 0 + Δ t U m sin ( ω t ) d t S_{source} = \int_{t_0}^{t_0 + \Delta t} U_m \sin(\omega t) \, dt Ssource=∫t0t0+ΔtUmsin(ωt)dt
如果用一个幅值为母线电压 U d c U_{dc} Udc、宽度为 T o n T_{on} Ton 的直流方波脉冲电压来代替它,只要满足两者面积相等:
S p w m = U d c ⋅ T o n = S s o u r c e S_{pwm} = U_{dc} \cdot T_{on} = S_{source} Spwm=Udc⋅Ton=Ssource
只要 MCU 的开关频率足够高( Δ t \Delta t Δt 足够小),由于电机绕组大电感的低通滤波效应,高频开关谐波会被完全滤除,绕组中流过的电流就不会是方波脉冲,而是由 T o n T_{on} Ton 连续变化所复现出来的平滑工频正弦电流。
2.2 演进第一步:六步换相(120° 方波控制)
在传统的 BLDC 方波控制(lesson16/17)中,我们完全没有利用面积等效原理去改变某一相的电压波形。
- 控制机制:每个电周期严格划分为 6 个状态(每态 60°)。在任意时刻,只有两相导通,一相断开(120° 导通型)。
- 电压形态:施加在绕组上的相电压是粗暴的方波或阶跃波。
- 致命缺陷:
- 转矩脉动大:在换相瞬间,由于电感电流不能突变,非导通相电流退磁与开通相电流励磁不匹配,产生剧烈的换相电流纹波和转矩脉动。
- 听觉噪声尖锐:方波包含极高次的高频谐波,会激发出严重的电磁振动与电振动。
2.3 演进第二步:SPWM(正弦脉宽调制)
为了消除方波控制的缺陷,人们开始思考:如何让三相绕组真正流入正弦电流?于是诞生了 SPWM(Sinusoidal Pulse Width Modulation)。
-
概念与物理机制 :SPWM 孤立地看待电机的每一相。它利用高频等腰三角波 作为载波(Carrier,通常由定时器的中央对齐计数模式产生,频率为开关频率 10 kHz ∼ 20 kHz 10\text{kHz} \sim 20\text{kHz} 10kHz∼20kHz),利用我们期望输出的低频正弦波作为调制波(Modulating Wave)。
-
控制逻辑:MCU 将三角波与正弦波进行实时比较:
-
当 正弦波幅值 > > > 三角波幅值 时,上桥臂导通,下桥臂关闭(输出高电平 U d c U_{dc} Udc);
-
当 正弦波幅值 < < < 三角波幅值 时,上桥臂关闭,下桥臂导通(输出低电平 0 0 0)。
根据面积等效原理:在正弦波的波峰附近,输出的方波脉冲极宽(高占空比);在过零点附近,方波脉冲极窄(低占空比)。这组宽窄连续变化的方波群(PWM)施加到电机上,就能复现出平滑的正弦电流。

- SPWM 的天花板(母线电压利用率低) :
SPWM 虽然实现了正弦发波,但其由于孤立看待每一相,在线性调制区内,为了保证正弦波顶端不与三角波交叠(不发生过调制),每相相电压的最大基波幅值只能达到 U p h a s e _ m a x = U d c 2 U_{phase\max} = \frac{U{dc}}{2} Uphase_max=2Udc。此时,输出的最大线电压基波幅值为:
U l i n e _ m a x = 3 × U p h a s e _ m a x = 3 2 U d c ≈ 0.866 U d c U_{line\max} = \sqrt{3} \times U{phase\max} = \frac{\sqrt{3}}{2}U{dc} \approx 0.866 U_{dc} Uline_max=3 ×Uphase_max=23 Udc≈0.866Udc
这意味着,母线电压有接近 13.4% 的潜力被平白浪费了,同等母线电压下电机无法输出更大的功率。
2.4 演进第三步:SVPWM(空间矢量脉宽调制)
FOC 的本质是在静止坐标系下控制一个合成空间电压矢量 U ⃗ s \vec{U}s U s(即 U α / U β U\alpha / U_\beta Uα/Uβ)。SVPWM 正是为了顺应 FOC 这种"空间整体控制"思维而生的。
-
从"孤立相"到"整体空间矢量":
-
SPWM 盯着三个独立的相来调制,目标是获得三个独立的相正弦电压。
-
SVPWM 盯着电机的整体空间磁场。它把逆变器的 6 个开关管组合成 8 个基本电压矢量(6个有效矢量,2个零矢量),在 α − β \alpha-\beta α−β 空间坐标系中利用相邻的两个有效矢量和零矢量进行时间上的按比例切分(面积等效) ,从而合成任意角度的空间旋转电压矢量。

-
为什么 SVPWM 的母线利用率是 100%?
SVPWM 的合成轨迹在 α − β \alpha-\beta α−β 平面上表现为一个正六边形。六边形的内切圆 是 SVPWM 线性调制的极限。该内切圆的半径(即最大空间电压矢量幅值)为 U s _ m a x = 3 3 U d c U_{s\max} = \frac{\sqrt{3}}{3}U{dc} Us_max=33 Udc。将该空间矢量还原回实际的线电压基波最大幅值,刚好等于:
U l i n e _ m a x = 3 × U s _ m a x = U d c U_{line\max} = \sqrt{3} \times U{s\max} = U{dc} Uline_max=3 ×Us_max=Udc
通过将最大线电压拉满到 U d c U_{dc} Udc,SVPWM 相比于 SPWM,母线电压利用率提升了 1 0.866 ≈ 115.47 % \frac{1}{0.866} \approx 115.47\% 0.8661≈115.47%(即足足提升了 15.5% 左右的出力),同等母线电压下可输出更大转矩、更小的电流纹波。
- 马鞍波的数学本质 :
当我们将 SVPWM 这种在空间合成的电压映射回三相的定时器 CCR 占空比时,会发现单相的电压波形不再是纯正弦波,而是正弦波叠加了 3 次谐波 的马鞍波 。
因为电机是三相对称无中线的系统(星形接法),三相共同叠加相同的 3 次谐波(同向的零序信号)后,在线电压(两相相减)中,3次谐波会被彻底抵消 。
这样做相当于在正弦波到达波峰时,有意识地把波峰"压低"了一点,让它不超出母线轨道的限制;同时把波谷"抬高"了一点。这就为基波分量腾出了更大的向上伸展空间,榨干了母线的最后一滴血。
2.5 脉络总结:三大发波控制技术对比
| 特性维度 | 六步换相(lesson17) | SPWM | SVPWM(本章 lesson18) |
|---|---|---|---|
| 控制核心 | 转子每转过 60° 强行切相 | 独立控制三相单相电压 | 整体控制空间旋转电压矢量 |
| 相电压波形 | 阶跃方波 | 纯正弦波 | 马鞍波(含3次谐波) |
| 线电压波形 | 阶跃方波 | 纯正弦波 | 纯正弦波 |
| 直流母线利用率 | 高(但谐波极大) | 较低( ≈ 86.6 % \approx 86.6\% ≈86.6%) | 最高( 100 % 100\% 100% 线性区) |
| 电流环纹波与噪声 | 极大 / 听觉噪声尖锐 | 极小 / 纯正弦声音 | 极小 / 运行极平稳 |
| FOC 匹配度 | 无法解耦运行 | 勉强匹配,需做繁琐的相移 | 原生适配,完美承接 U α / U β U_\alpha/U_\beta Uα/Uβ |
由此可见,从本章引入 SVPWM 后,我们的电机才真正告别了方波的"震颤",步入了连续、高效率的空间滑行阶段。
三、电角度插值算法
3.1 问题 霍尔 6 态为何不够?如何插值?
霍尔传感器一个电周期只有 6 个状态(每态 60° 电角度)。lesson16/17 用扇区中心角:
θ = ( ( h a l l − 1 ) + 0.5 ) × 60 ° \theta = \bigl((hall-1)+0.5\bigr)\times 60° θ=((hall−1)+0.5)×60°
这在整个 60° 扇区内 θ 恒定 ,Park 变换相对真实转子位置最大可有 ±30° 误差 → Id/Iq 解耦失败、Iq 纹波大、电流环「跟不准 SP」。
3.2 工程做法:扇区中心 + TIM5 插值
TIM5 霍尔模式在每次边沿捕获 上一段 60° 电角度所花时间 capture,计数器清零后持续累加得 elapsed:
θ = ( ( h a l l − 1 ) + 0.5 ) × 60 ° + θ o f f s e t ⏟ 扇区中心(同 lesson17) + ( e l a p s e d c a p t u r e − 0.5 ) × 60 ° ⏟ 扇区内 ±30° 插值 \theta = \underbrace{\bigl((hall-1)+0.5\bigr)\times 60° + \theta_{offset}}{\text{扇区中心(同 lesson17)}} + \underbrace{\bigl(\frac{elapsed}{capture}-0.5\bigr)\times 60°}{\text{扇区内 ±30° 插值}} θ=扇区中心(同 lesson17) ((hall−1)+0.5)×60°+θoffset+扇区内 ±30° 插值 (captureelapsed−0.5)×60°
hall:1~6,来自motor_hall_get_state()capture:motor_hall_get_last_capture()(上一完整扇区计时)elapsed:motor_hall_get_sector_elapsed()(TIM5 当前计数值)θ_offset:FOC_HALL_ANGLE_OFFSET(bsp_foc.h,现场对齐 D 轴)- 静止 / capture 无效:回退到扇区中心 (+30°)
源码:User/foc/bsp_foc.c → foc_get_electrical_theta()
c
theta_base = ((hall - 1) + 0.5f) * (PI/3) + FOC_HALL_ANGLE_OFFSET;
ratio = elapsed / capture; /* 限幅 0~1 */
theta_delta = (ratio - 0.5f) * (PI/3); /* 中心两侧 ±30° */
theta = theta_base + theta_delta;
3.3 精度说明
| 方法 | 分辨率 | 适用 |
|---|---|---|
| 扇区中心 | 60° 阶跃 | 仅验证 Clark/Park |
| TIM5 插值(本章) | 连续(取决于 TIM 时钟) | 霍尔 FOC 实战 |
| 编码器 / 观测器 | 高 | lesson19+ 无感/启动 |
插值假设 相邻扇区角速度相近 ;加减速剧烈时会有小误差,但远优于固定中心角。若 Iq 仍偏差大,微调 FOC_HALL_ANGLE_OFFSET(±几度)。
四、七段式 SVPWM 算法
4.1 什么是 CCR?
CCR (Capture/Compare Register,捕获/比较寄存器 )是 STM32 定时器里的一个 16 位寄存器。在 PWM 模式 下,它的作用可以通俗理解为:决定这一相 MOS 管「开多久」。
本工程使用 TIM8 产生三相 PWM,对应关系如下:
| 寄存器 / 变量 | 硬件 | 含义 |
|---|---|---|
TIM8->CCR1 / g_fm_ccr_u |
U 相上桥 PWM | U 相占空比 |
TIM8->CCR2 / g_fm_ccr_v |
V 相上桥 PWM | V 相占空比 |
TIM8->CCR3 / g_fm_ccr_w |
W 相上桥 PWM | W 相占空比 |
ARR(自动重装载值) |
MOTOR_PWM_PERIOD_COUNT = 5600 |
一个 PWM 周期的计数上限 |
占空比与 CCR 的关系(中央对齐/边沿对齐本质相同,此处用 Up 计数简化说明):
占空比 = C C R A R R \text{占空比} = \frac{CCR}{ARR} 占空比=ARRCCR
例如:CCR = 2800、ARR = 5600 → 占空比 50% ;CCR 越大,该相上桥导通时间越长,施加在绕组上的平均电压越高,电流/转矩越大。
SVPWM 与 CCR 的关系 :算法先算出目标电压矢量 U α / U β U_\alpha/U_\beta Uα/Uβ,再换算成三相切换时刻 T A c m , T B c m , T C c m T_{Acm},T_{Bcm},T_{Ccm} TAcm,TBcm,TCcm,最后映射为:
CCR x = T x c m T s × A R R \text{CCR}x = \frac{T{xcm}}{T_s} \times ARR CCRx=TsTxcm×ARR
因此 FreeMASTER 里看到的 g_fm_ccr_u/v/w ,就是 SVPWM 算出的 三相 PWM 比较值 ;Scope 上呈 马鞍波 是正常现象。
野火六步板上的特殊现象 :下桥由 GPIO 换相,任意时刻通常只有 一相 在 PWM 调制。Scope 只盯 g_fm_ccr_u 时,会看到它在 0 ↔ 2000+ 之间随换相阶跃------并非算法乱算,而是 当前导通相切换 导致未导通相 CCR 为 0。调试时建议 U/V/W 三相 CCR 同屏 ,或看 g_fm_pwm_out(三相 CCR 最大值,用于六步换相)。
4.2 算法步骤
实现文件:User/foc/bsp_svpwm.c
- 扇区判断 : U 1 = U β U_1=U_\beta U1=Uβ, U 2 , U 3 U_2,U_3 U2,U3 符号组合得 N N N,查表得 Sector 1~6(无 atan2)
- 矢量时间 : X , Y , Z X,Y,Z X,Y,Z 通用变量,按扇区取 T a , T b T_a,T_b Ta,Tb
- 过调制限幅 : T a + T b > T s T_a+T_b>T_s Ta+Tb>Ts 时等比例缩放
- 三相切换点 :七段对称 T A c m , T B c m , T C c m T_{Acm},T_{Bcm},T_{Ccm} TAcm,TBcm,TCcm
- CCR 映射 :
CCR = T_x / T_s × ARR
电流环调用(bsp_pid_app.c):
c
svpwm_calc(&svpwm);
motor_svpwm_store_ccr(CCR_U, CCR_V, CCR_W); /* 缓存三相 CCR */
set_pwm_pulse(duty_max); /* 触发六步换相刷新 */
野火板说明 :下桥为 GPIO 六步驱动,采用 「SVPWM 算三相 CCR + 换相时按相取用」 的混合方案(见 bldcm_commutate() 中 motor_get_phase_pwm())。
五、实验操作
5.1 编译烧录
Keil 工程 Project/Fire-F407.uvprojx,目标板 野火 F407 电机开发板,与 lesson16/17 相同硬件。
5.2 推荐调试顺序
- 仅电流环 :
w 0→c 1500→s 1 - FreeMASTER Scope:
g_fm_target_iq、g_fm_iq_actual、g_fm_theta_deg、g_fm_ccr_u/v/w - 观察 CCR 马鞍波 、
g_fm_svpwm_sector随 θ 变化 - 速度环 :
t 500→w 1(自动开启电流环)
5.3 串口命令(继承 lesson17)
| 命令 | 作用 |
|---|---|
c [mA] |
Iq 目标(须 w 0) |
t [rpm] / `w [0 |
1]` |
| `s [0 | 1]` |
pid |
打印 Id/Iq/Vd/Vq/θ/SVPWM CCR |
v [pwm] |
开环六步(须 s 0 且 w 0) |
5.4 FreeMASTER 建议通道
| 变量 | 含义 |
|---|---|
g_fm_theta_deg |
插值后电角度 (°) |
g_fm_iq_actual / g_fm_target_iq |
Q 轴电流 |
g_fm_ccr_u / v / w |
三相 CCR(PWM 比较值,0~5500;越大占空比越高) |
g_fm_pwm_out |
三相 CCR 最大值,六步换相时作为当前步占空比 |
g_fm_svpwm_sector |
SVPWM 扇区 1~6 |
g_fm_valpha / g_fm_vbeta |
InvPark 输出 |
g_fm_actual_rpm / g_fm_target_rpm |
实际 / 目标转速 (RPM) |
推荐学习顺序
- 开环
v 800:认 PWM 频率、占空比、六步换相(§2.2、§4.1)。 - 电流环
s 1:PWM + 电流探头,理解面积等效(§2.1)与 6 次纹波(§3、电流环)。 - 霍尔 + PWM 双通道:理解 θ 与换相(§3)。
- FreeMASTER 同录:
g_fm_ccr_u、g_fm_svpwm_sector、g_fm_theta_deg与示波器 同一现象 互证。
六、调试要点
- 马鞍波 :三相 CCR 呈马鞍形是 SVPWM 三次谐波注入,不是故障(详见 §4.1)。
- CCR 单相阶跃 :六步板上只导通一相,
g_fm_ccr_u单独看会在 0 与较大值间跳变,属正常。 - 电流采样:七段式零矢量在周期两端,利于单电阻采样窗口(本板为三电阻,25 ms 电流环已够用)。
g_fm_iq_actual大幅摆动:六步 + 霍尔 Park 的 6 次纹波,看趋势/包络,勿用瞬时值判闭环。- 改
t转速变化小 :六步板平台限制;可加大FOC_SPD_IQ_FF_PER_RPM或串口ksp/ksi微调。
七、小结
- 实现了 七段式 SVPWM ,FOC 链路完整:θ → Park → PI → InvPark → SVPWM → PWM。
- 用 霍尔 + TIM5 插值 解决 6 态位置不精准,Park 角度连续化。
- 下一章 lesson19 霍尔 BLDC 三段式 FOC 启动,解决零速启动与低速换相。