ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

SVPWM原理详解:从SPWM到空间电压矢量,数学推导与工程实践

SVPWM原理详解:从SPWM到空间电压矢量,数学推导与工程实践 聊SVPWM绕不开PWM这个老话题。搞电机驱动、逆变器、UPS、并网电源的工程师恐怕没有谁没跟SVPWM打过交道。很多人代码抄了一堆扇区表背得滚瓜烂熟但要真问一句“为什么V4和V6作用这么多时间能合成任意矢量”一下子反而说不清楚。这篇就从数学原理出发把SVPWM的坐标变换、扇区判断、作用时间计算、发波策略逐个拆开用最直白的推导过程讲明白这些公式到底怎么来的以及工程落地时常踩的坑。这篇文章适合正在做BLDC/PMSM矢量控制、逆变器或者三相电源的同学尤其是那些已经能跑通SVPWM但还想把原理吃透的人。看完之后你至少能回答三个问题为什么SVPWM能比SPWM提升15.47%的直流电压利用率七段式和五段式到底差在哪PWM频率和死区时间该怎么选内容偏理论基础但所有结论都对应着实际项目中的参数选择和排错经验。1. SVPWM到底是什么从“比例占空比”到“空间电压矢量”1.1 为什么SPWM不够用正弦脉宽调制的天花板传统的SPWM思路很简单拿一个高频三角载波跟正弦调制波比较比较结果直接决定开关管的通断输出的脉冲宽度按正弦规律变化再经过电机绕组或者LC滤波器的低通特性就能还原出接近正弦的电压。这个方案直观、好理解但它有个绕不过去的天花板直流电压利用率。什么叫电压利用率就是逆变器能把母线直流电压转成多大交流电压的能力。SPWM在线性调制区内相电压基波幅值最大到Udc/2线电压幅值最大到√3/2×Udc这个数字约等于0.866倍的母线电压。也就是说你给逆变器喂了100V直流最多只能输出86.6V的交流线电压。如果还想更高就得进入过调制区正弦波会明显畸变谐波含量猛增电机就会发热、噪声变大。那有没有办法在不畸变的前提下把电压“榨”出来有的。SVPWM的出发点其实不是“怎么调占空比更像正弦”而是换了个角度既然负载是三相电机定子磁链的期望轨迹是一个圆形那我能不能直接控制开关状态让磁链每一步都沿着圆的切线方向走这就是SVPWM的核心思想——不直接追求“相电压像正弦”而是追求“电压矢量合成的旋转磁场是圆形”。同样的母线电压SVPWM的相电压基波幅值可以达到Udc/√3线电压幅值就是Udc相比SPWM的0.866Udc整整提高了1/0.866 1.1547倍。这多出来的15.47%在电池供电的电动车、无人机、便携设备里就是实打实的续航和功率密度没有哪个做驱动的人会拒绝这种免费午餐。1.2 基本电压矢量八个开关状态背后的数学结构三相半桥逆变器一共六个开关管上桥臂三个、下桥臂三个。因为上下管不能同时导通每一相的状态只能二选一。把上管导通记为1下管导通记为0用三位二进制数SaSbSc就能表示所有开关状态000到111共8种组合。这8种状态里6个是非零电压矢量2个是零矢量。把它们画到复平面上相邻互差60度形成一个正六边形。每个非零矢量的模长是2Udc/3比如状态100对应的矢量A相桥臂输出UdcB、C相输出0合成电压就是从A流向B、C的线电压大小为2Udc/3。这里有个经常被忽略的关键点三相系统里电流iaibic恒等于0所以三相变量真正的自由度只有两个。这意味着任意三相平衡的电压都可以映射到二维复平面上的一个矢量来处理。三个桥臂看似复杂实际上只需要两个独立的自由度就能描述——这正是SVPWM能用二维向量运算解决三维问题的数学基础也是它能用简洁公式实现的前提。这8个开关状态就像“积木块”SVPWM的任务就是在一个PWM周期Ts内用这些积木块的不同组合拼出一个期望的参考电压矢量。拼的过程就是后续要讲的伏秒平衡和时间计算。2. SVPWM的数学地基坐标变换与扇区判断2.1 Clarke变换三相到两相的降维既然三相电压在二维平面上的信息是冗余的第一步就是把三相信号变换到两相静止坐标系αβ。这就是Clark变换。等幅值变换的公式是uα (2/3)×(ua - ub/2 - uc/2)uβ (2/3)×(0 √3/2×ub - √3/2×uc)为什么要用系数2/3两个选择等幅值变换用2/3保证变换前后矢量的模长一致方便SVPWM里直接对比参考矢量和基本矢量等功率变换用√(2/3)保证功率计算不变。电机控制里绝大多数人用等幅值变换因为做电压矢量合成时坐标系里的幅值直接就是实际相电压的幅值不用来回换算。实际项目里三相电压通常不是直接采的而是利用H桥电路和I2C/SPI等接口读取母线电压再结合三个下桥臂开关状态重建相电压。比如在FOC里如果逆变器输出状态是100电机某一相的端电压就是2Udc/3从母线电压推算三相电压是常用手段不需要额外的高压差分采样电路。变换完以后三相的正弦电压就变成了αβ坐标系里一个旋转的矢量。矢量端点的轨迹是圆形半径等于相电压基波幅值。SVPWM的目标就是在一个个开关周期里让合成电压矢量的平均值精确等于这个旋转参考矢量。2.2 扇区判断三行公式接下来要回答的问题是这个参考矢量落在六边形的哪个扇区里扇区判断有几种方法最经典的是“三变量法”。先算三个中间变量Uref1 uβUref2 (√3/2)×uα - (1/2)×uβUref3 -(√3/2)×uα - (1/2)×uβ然后定义符号函数sign(x)x0时为1x0时为0。计算N sign(Uref1) 2×sign(Uref2) 4×sign(Uref3)最后查表确定扇区N3是扇区IN1是扇区IIN5是扇区IIIN4是扇区IVN6是扇区VN2是扇区VI。这组公式的本质是在判断“参考矢量相对于三条边界线的位置”。三条边界线分别是α轴uβ0、60度斜线、-60度斜线。三个符号位组合起来刚好唯一确定六个扇区中的哪一个。为什么N的值正好对应表中的扇区编号拿扇区I举例参考电压落在0到60度之间时uβ0且角度小于60度此时Uref2(√3/2)uα - (1/2)uβ0Uref3-(√3/2)uα - (1/2)uβ0所以sign值分别是1、1、0N123正好对上表。用N值查表而不是直接调atan2反正切去算角度是因为反正切计算在DSP和单片机上的开销比较大而三变量法只需要几行乘法和加法一次查表就出结果周期执行毫无压力。实际工程中这一节代码几乎都是一模一样的区别只是有人用整数运算、有人用浮点运算。2.3 零矢量的角色为什么必须有V0和V7八种开关状态里除了六个非零矢量还有000和111两个零矢量。零矢量作用时三相桥臂要么全部接上管、要么全部接下管电机端电压为零但绕组里仍有电流续流。零矢量在SVPWM里绝不是凑数的它有两个不可替代的作用。第一用来填充时间。非零矢量算出来的作用时间T1和T2之和通常小于Ts剩余的时间必须由零矢量填满不然平均电压就会偏大调制就失效了。零矢量时间越长输出电压幅值越低调制的“深浅”就是这么控制的。第二用来降低开关频率和电磁噪声。如果SVPWM只用两个非零矢量交替导通切换一次就要跳变好几位开关状态开关次数爆炸。而插入零矢量后比如七段式发波每次切换只有一相开关状态改变开关损耗和dv/dt都小很多。既然有两个零矢量该选V0还是V7原则是看在哪插入能让切换次数最少。七段式发波里一个周期开头和结尾用V0中间用V7这样从非零矢量切换到零矢量时只有一相跳变整个周期的开关次数降到最低。有些优化算法会在零矢量分配比例上做文章目的也多半是平衡开关损耗和共模电压。3. 矢量作用时间计算SVPWM的核心公式推演3.1 伏秒平衡原理时间分配的物理本质SVPWM最核心的一步是计算两个相邻非零矢量各自作用多长时间。背后的物理原理是伏秒平衡在一个PWM周期Ts内合成电压矢量对时间的积分等于各基本矢量分别作用各自时间的积分之和。用公式写就是Vref×Ts V1×T1 V2×T2 V0×T0T0是零矢量作用时间T0 Ts - T1 - T2。你可以把Ts看成一段“时间预算”。三个份额V1×T1、V2×T2、V0×T0必须在预算内“凑”出平均电压等于参考电压。对电机来说电压乘以时间正好是磁链的变化量所以这个等式本质上是在说这个周期里由开关状态产生的磁链增量要和期望圆形磁链轨迹的增量完全一致——这就是SVPWM能输出圆磁场的数学保证。计算T1和T2时只需要列出实部和虚部的两个方程。因为参考矢量落在某个扇区所以它一定被该扇区的两个相邻非零矢量夹住用线性方程就能直接解出来。这也是SVPWM全部数学计算里最本质的一步后面的所有公式几乎都是这两行方程的展开。3.2 扇区I推导示例从矢量方程到X/Y/Z拿扇区I0到60度来推导。扇区I的相邻矢量是状态100和110设它们分别作用T1和T2。V100 2Udc/3方向0度V110 2Udc/3方向60度。写成实部虚部实部方程uα×Ts (2/3)Udc×T1 (1/3)Udc×T2虚部方程uβ×Ts (√3/3)Udc×T2由虚部方程得T2 √3×uβ×Ts / Udc。把这个结果代回实部方程得到T1 (1.5×uα - 0.866×uβ)×Ts / Udc。如果你去翻TI或者ST的参考代码会发现它们通常定义三个通用变量X √3×uβ×Ts / UdcY (1.5×uα 0.866×uβ)×Ts / UdcZ (-1.5×uα 0.866×uβ)×Ts / Udc再按扇区查表取用。这样做的原因是六个扇区的作用时间公式之间存在60度旋转对称性与其每个扇区都写一遍完整方程不如统一算好X/Y/Z再用查表映射到不同的组合上。比如扇区I里T2就是XT1是-Z扇区II里T1是Y、T2是-Z依此类推。扇区编号首个矢量第二个矢量T1首个T2第二个I100110-ZXII110010Y-ZIII010011X-YIV011001Z-XV001101-Y-ZVI101100-XY工程上的小技巧是X/Y/Z和表里的正负号要仔细核对代码移植时尤其要注意扇区编号方向。有的资料把扇区编号按顺时针方向排有的按逆时针排查表结果会差一位不加思考地照抄经常会在扇区边界上蹦出毛刺。3.3 过调制处理超过六边形边界怎么办当参考电压幅值比较大时T1T2可能超出Ts这说明“预算不够了”参考矢量跑到了六边形外侧。六边形外侧意味着电压幅值超出了逆变器物理能力的极限。这时候要做过调制处理把T1和T2按比例收缩保证它们加起来正好等于TsT1 T1×Ts/(T1T2)T2 T2×Ts/(T1T2)收缩之后实际输出的电压矢量会落在六边形的边界上方向不变幅值被截断。等价的数学描述是SVPWM的线性调制区是六边形的内切圆半径是Udc/√3也就是允许的最大相电压幅值等于Udc/√3对应线电压幅值等于Udc。这意味着SVPWM的调制比最大能到1.1547比SPWM的1高出15.47%。但要注意过调制之后虽然电压上去了谐波也明显增加电流畸变率变差。工程上通常只在母线电压吃紧、需要压榨极限功率扭矩时才允许短时进入过调制区持续运行还是要留足裕量。我做过一个低压伺服项目24V母线电机额定反电动势12V启动瞬间母线电压被电池压降拉到20V。不开过调制高速区根本跑不上去开了过调制之后高速扭矩确实上来了但噪音明显变大后来通过加大母线电容和调整调制深度把过调制时间压到了启动加速阶段的几秒钟内才兼顾了性能和噪音。4. 七段式与五段式发波工程实现的两种主流策略4.1 七段式SVPWM的开关时序与切换点算出了T1和T2还要把它们“铺”到PWM波形上去。七段式发波是最常见的做法。以扇区I为例一个Ts内的开关顺序是000 → 100 → 110 → 111 → 110 → 100 → 000对应的时间分配是V0作用T0/4V100作用T1/2V110作用T2/2V7作用T0/2然后对称回来。注意看这个顺序每一次状态切换都只改变一相开关次数少波形也对称。用中心对齐计数器实现时需要计算三个比较点。令Ta (Ts - T1 - T2)/4Tb Ta T1/2Tc Tb T2/2这三个值就是定时器比较寄存器里要填的CCR值对应三相的切换时刻。每个扇区里A/B/C三相各对应Ta/Tb/Tc中的哪一个要查映射表直接套用扇区I的映射到其他扇区就会出错。七段式的特点是一个周期内每个开关管都开关两次总开关次数固定为6次三相各2次电流谐波比较小电磁噪音也相对低。代价就是开关损耗高一点。在绝大多数中小功率电机驱动里七段式是默认选择稳定可靠谐波性能好闭环控制里的电流波形也干净。4.2 五段式SVPWM降低开关损耗的代价五段式的思路是在一个扇区里某一相保持开关状态不变钳位到母线正或母线负只有另外两相在切换。这样每个周期总开关次数从6次降到4次开关损耗直接减少三分之一。五段式发波也有很多变种最典型的是“零矢量交互分配”方式把零矢量全部放在V0或者全部放在V7而不是像七段式那样对称分配。这样做的代价是电流谐波会变大调制波里多了明显的共模分量电机的共模电流和轴电流问题也更突出。七段式和五段式怎么选我的经验是小功率BLDC/PMSM驱动几百瓦以内用七段式谐波小、好调试大功率工业驱动几十千瓦以上用五段式开关损耗能省下一大块发热量散热器体积可以缩小不少中间功率区间看散热难度和效率要求权衡。项目里用过一次五段式做无人机电调满载效率确实提升了两个点左右。但代价是电机在高转速下噪声变大特别是空载时那种高频啸叫声非常明显。后来在软件里做了个动态切换低速用七段式保证平稳高速切换五段式保效率才平衡了舒适性和续航。4.3 边沿对齐还是中心对齐ADC采样时机的选择SVPWM在定时器上有两种主流计数模式边沿对齐锯齿波计数和中心对齐三角波计数。边沿对齐实现简单ARR周期就是载波周期中心对齐一个完整PWM周期需要从0数到ARR再数回0所以同等定时器时钟下PWM频率是边沿对齐的一半。真正影响FOC性能的是ADC采样时刻。相电流采样一般要避开开关管的开关瞬态选在开关状态稳定的时刻。而相电流是一个PWM周期内的平均值最理想的采样点应该落在电流纹波的中心也就是PWM周期的中间点。中心对齐模式下计数器在顶点和底点刚好对应零矢量的中间位置此时三相电流纹波也正好在平均值附近。所以FOC里最常见的配置是中心对齐计数在定时器上溢中断顶点触发ADC同步采样采样值直接就是相电流平均值基本不需要额外的滤波算法。边沿对齐模式下PWM周期的中间点对应三角波的顶点还是底点取决于输出极性设定一样可以触发采样。但边沿对齐的电流纹波中心点在每个周期的“升降”过程中处于不同位置时序上不够对称所以在高精度电流环里中心对齐是更稳妥的选择。STM32高级定时器的中心对齐模式里注意设置CMS位和DIR位然后利用EVR事件寄存器触发ADC注入组或规则组采样。我推荐把采样触发点设置在向上计数的顶点因为此时开关管刚完成一次切换线路上的振铃已经衰减得差不多采样信噪比最好。5. 工程中的SVPWM细节死区、频率与故障保护5.1 死区时间防直通与电压误差的矛盾三相桥臂上下两个开关管绝不能同时导通否则母线直接短路轻则炸管子重则烧板子。但由于IGBT/MOSFET存在导通延迟和关断延迟同一桥臂的上管关断和下管开通不能“无缝衔接”必须插入一段死区时间让两个管子在切换过程中都处于关断状态。死区时间怎么估一般需要大于器件关断延迟与开通延迟之差再加一点裕量。公式估算td td(off) - td(on) margin常见的死区范围是0.1μs到几μs。功率越大、器件开关速度越慢死区时间越长。比如低压MOSFET驱动可以设0.2~0.5μsIGBT大功率模块往往要2~5μs。死区带来的副作用是输出电压误差。死区期间电流通过续流二极管续流输出电压跟期望值偏离等效于损失了一部分电压还会产生低次谐波表现为电流的“平顶”或“平底”畸变特别是在电流过零位置。死区时间越长、PWM频率越高误差占比越大。死区补偿的基本思路是根据电流极性判断死区时段内续流方向然后把电压误差预加到调制波上。实际补偿效果受电流采样精度影响很大补偿不好反而可能加剧畸变。在TC3xx的CCU6模块里设置死区时可以分别配置上升沿和下降沿死区长度方便针对不同器件特性精确调节。调试时用示波器看桥臂中点电压波形确认切换时没有直通毛刺死区时间才算设妥。5.2 PWM频率如何选噪声、纹波与损耗三个维度PWM频率是电机驱动里最需要权衡的全局参数。高频的好处是电流纹波小、电机运行平顺、动态响应快但开关损耗线性增长死区时间占比也升高低频的好处是损耗小但电流纹波大电机可能啸叫而且控制带宽也会受限。从噪声角度PWM频率如果落在人耳听觉范围20Hz到20kHz内电机的电磁噪声往往让人烦躁。所以电动工具、家电等消费类产品要么用25kHz以上避开听觉敏感区要么用16kHz到20kHz配合降噪措施。TEC半导体制冷片一般会选几百赫兹到几千赫兹的低频PWM因为TEC的惯性大不需要高频调制低频反而能减少开关损耗。舵机的PWM控制则完全不同信号频率通常固定50Hz脉宽0.5ms到2.5ms对应角度这是通讯协议级别的要求和应用场景强相关。PWM频率对电机的影响本质上是电流纹波和电感的关系。电机绕组电感越大滤波效果越好可以用较低频率电感小的电机电流纹波大必须用较高频率才能维持可接受的纹波率。工程经验中小功率BLDC/PMSM一般10kHz到20kHz大功率IGBT驱动通常2kHz到5kHz高速主轴电机也许要30kHz以上。5.3 占空比计算的常见坑STM32里配置PWM最容易踩的坑就是频率和占空比公式在中心和边沿对齐模式下不一样。边沿对齐向上计数时PWM频率等于定时器时钟除以(PSC1)再除以(ARR1)。占空比等于CCR除以(ARR1)。举例子定时器时钟72MHz预分频71ARR999那么频率是72MHz/72/10001kHzCCR500时占空比50%。中心对齐模式时计数器从0数到ARR再数回0完整PWM周期需要两倍的计数值所以PWM频率等于定时器时钟除以(PSC1)再除以(2×ARR)。占空比约等于CCR除以ARR但因为中心对齐下脉冲分布在两段实际输出波形是中心对称的双脉冲用示波器看会更直观。还有一个小细节很多人在STM32里把ARR设置成999CCR设置成500以为占空比就是50%在边沿对齐下确实如此。但换成中心对齐后忘了调整ARR结果频率减半了控制环路的采样频率跟着变电流环带宽就飘了。改代码之前先想清楚是哪一种计数模式公式一错整个调试方向都歪了。单片机资源受限时还得考虑定时器位数。8位定时器ARR最大255脉宽分辨率只有256级电机低速时CCR跳一步就是很大的占空比变化电流抖动明显。所以追求平滑的话至少要16位定时器或者在PSC取合适值的前提下尽量加大ARR。5.4 PWM故障保护与硬件注意事项电机控制里的故障保护第一原则是硬件优先。软件响应再快也有延迟而且CPU死机、程序跑飞时根本指望不上。所以主流的驱动方案里都有硬件级PWM封锁机制。STM32高级定时器的BRK刹车输入就是干这个的。外部过流比较器输出翻转直接触发刹车PWM输出被硬件强制拉成安全电平不需要CPU干预。TC3xx里对应的机制是CCU6的Trap。半桥驱动芯片比如IR2104、EG2134等通常也有SD或FAULT引脚低电平直接关断所有驱动输出。实际项目里一定要把硬件保护电路做出来再调软件否则上电调试时一个错误就可能炸管子。AO3400A这类低压MOSFET驱动的PWM电路要注意栅极驱动电流和栅极电阻。栅极电阻太小开关速度快但振铃严重太大开关慢损耗高。一般从10Ω到100Ω之间调配合示波器看栅极波形调到一个折中值。低边驱动时还要留意地弹噪声驱动芯片的地必须单点接到功率地别跟数字地混在一起否则PWM切换瞬间容易误触发保护。树莓派这类单板机输出PWM要区分硬件PWM和软件PWM。硬件PWM的频率可以到较高水平且不占CPU但通道少软件PWM用GPIO翻转实现几乎任意引脚都可以但频率高了CPU占用率飙升抖动也大。做舵机控制和LED呼吸灯软件PWM够用做电调或者精密驱动还是老老实实上MCU的硬件定时器。6. 从理论到实践SVPWM在电机控制中的落地经验6.1 从数学公式到代码离散化和标幺化SVPWM的公式在数学上很干净但落到单片机里要考虑离散化和运算效率。首先是Ts的选择。公式里的Ts就是PWM周期也就是电流环的计算周期。FOC里SVPWM通常以PWM频率同步执行PWM频率定下来Ts就固定了。算T1、T2时Ts/Udc这个因子是常数可以提前算好避免每次浮点除法。比如Udc24V、Ts50μs那X √3×uβ×0.05/24只和uβ有关一次乘法搞定。其次是标幺化。很多工程代码不用实际电压采样值而是把Udc和参考电压都归一化到0到1之间或者直接用Q15定点数。特别是DSP里浮点运算慢的话定点化之后大幅减少计算开销。标幺化的基准一般选Udc/√3这样调制深度1对应线性调制区的边界超过1就进入过调制非常直观。最后是查表法替代实时计算。当控制频率很高20kHz以上时如果主控芯片性能有限可以把SVPWM的占空比映射表预先生成好运行时通过角度直接查表获取。这是电调里常见的开环方案精度不如实时计算但胜在确定性高、周期极短。我建议初学的人还是先用实时计算把原理跑通再去考虑查表优化。6.2 实测调试心得从波形到参数最后分享几条SVPWM调试点位和排错经验。有一回FOC电流环跑起来转速反馈一切正常但电流波形在每60度电角度处都有一个凹陷查了半小时代码最后用示波器抓相电压的PWM波形才发现是扇区映射表里写错了一个符号。扇区边界处的毛刺和电流凹陷十有八九是扇区判断或者映射表的正负号问题优先检查。电流波形杂且噪声大时先看采样时刻。用示波器的触发模式配合PWM的信号确认ADC采样点是否落在开关瞬态之后。采样点太靠近边沿采到的就是振铃和尖峰电流环就会抖动。把采样点往中心挪一挪往往立竿见影。如果空载电流波形还行、带载一加大就畸变明显优先怀疑死区补偿。死区误差在电流过零附近最明显而带载时电流大、功率器件的压降也变大二极管续流时间会改变电压误差。调试死区补偿时用小电流带载波形和大电流带载波形对比误差曲线如果随电流幅值反向变化多半是补偿方向写反了。最后给个入门建议无论做BLDC还是PMSM板子焊好后先用低压小母线调试。我自己的习惯是24V以内先把SVPWM开环调通用示波器观察三相输出和合成电压确认扇区切换平滑、无跳变再接电机闭环。直接上高压大电流调试一次短路就可能让几周的工作白费。保驾护航的底线是先在低压下把整套逻辑跑稳再考虑提升功率等级。
返回列表