ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SPWM与普通PWM的7个关键差异:示波器实测波形、频谱与谐波分析

SPWM与普通PWM的7个关键差异:示波器实测波形、频谱与谐波分析 1. 从示波器上读懂PWM与SPWM的本质差异做嵌入式开发和电力电子调试这么久示波器应该算是陪伴我们最久的工具之一了。平时测PWM波形大多数人的习惯是看一眼频率对不对、占空比是不是预期值然后收工下班。但如果你真正把示波器探头接在MOS管栅极或者电机驱动输出端仔细对比观察普通PWM和SPWM的波形会发现两者之间的差别远比想象中复杂而且这些差别直接决定了系统的效率、噪声、发热以及控制精度。这篇文章用实测的方式把SPWM和普通PWM放在同一套测试环境下从波形形态、频谱分布、谐波含量、电压利用率、滤波器需求、实现复杂度以及实际应用场景这七个维度逐一拆解对比。内容覆盖从原理推导到示波器操作技巧从STM32实现到MOS管发热排查适合正在做电机驱动、逆变器、电源变换器的工程师也适合刚接触PWM想深入理解波形本质的学生朋友。先说一句个人观点很多人用PWM只停留在“调占空比”这个层面但真正决定系统性能的恰恰是那些在示波器上肉眼可见却又容易被忽视的波形细节。SPWM和普通PWM的差异正是理解“调制”这件事的最佳切入点。2. 预备知识普通PWM与SPWM的底层逻辑2.1 普通方波PWM的工作原理普通PWM的本质是“等幅不等宽”的脉冲序列。载波频率固定不变比如10kHz通过改变每个周期内高电平持续的时间即占空比来调节输出的平均电压。比如50%占空比、5V幅值的PWM平均电压就是2.5V。这种调制的核心思路是负载电机、灯、加热丝对高频分量不敏感主要响应的是平均值。这里要强调一个关键点普通PWM的占空比可以在任意两个相邻周期之间突变。给它一个阶跃指令它就能在一个周期内从0%跳到100%。这种“瞬时响应”能力是它最大的优势也是它产生严重谐波问题的根源。你在示波器上看到的是一串等间隔、等幅值、宽度不同的矩形波频率成分中除了基波也就是PWM频率之外还包含大量高次谐波以及一个与开关频率相关的固定频带。2.2 SPWM的调制原理SPWM的全称是Sinusoidal PWM也就是正弦脉宽调制。它的核心思想不是把输出调成方波而是让脉冲序列经过滤波之后平均电压的包络线呈正弦形状。实现方式是用一个高频三角波载波与一个低频正弦波调制波进行比较——三角波幅值高于正弦波的地方输出低电平反之输出高电平。所以SPWM输出的仍然是一串矩形脉冲但每个周期的脉冲宽度不再恒定而是按照正弦规律变化。在示波器上直观看到的效果就是脉冲宽度从窄逐渐变宽到达中心位置最宽然后再逐渐变窄呈现一个周期的正弦包络。这一点和普通PWM有本质区别——普通PWM的脉冲宽度只遵循当前时刻的指令相邻周期之间没有连续性约束而SPWM的脉冲宽度在时间轴上是平滑、连续变化的。2.3 为什么要引入SPWM可能有人会问既然普通PWM已经把平均电压调出来了为什么还要搞一个SPWM这里面的关键在于“波形质量”。普通PWM输出的平均电压只是一个直流分量如果把它直接接到变压器或交流电机上会产生极大的谐波损耗和转矩脉动。而SPWM输出的是经过正弦调制的脉冲序列经过简单的低通滤波之后就可以还原出较为纯净的正弦波——这是逆变器、变频空调、伺服驱动器能平稳运行的基础。用生活化的例子来理解普通PWM就像一个粗暴的开关水龙头要么全开、要么全关通过快速切换调整平均水流SPWM则像一个智能阀门出水速度按照正弦节奏波动经过管路缓冲后水流本身就接近缓慢而平稳的正弦变化。示波器实测也正是验证这个区别的最好工具。3. 实测环境搭建与示波器设置3.1 测试平台硬件准备这组实测我使用的设备如下设备型号/参数用途主控板STM32F103C8T6最小系统板产生PWM和SPWM信号示波器DS1054Z100MHz带宽波形采集与分析探头原厂无源探头 10x档信号测量功率级IRF540N MOS管 12V电源模拟实际负载驱动负载1mH电感 10Ω电阻串联模拟电机绕组特性滤波网络LC低通滤波器观察滤波后的正弦波实际测试时我用STM32的TIM1产生10kHz的普通PWM以及同频载波的SPWM。为了避免浮空引脚引入噪声所有信号在进入示波器之前都经过了一级RC缓冲1kΩ100pF。3.2 示波器通道与触发的关键设置实测中最容易踩坑的就是示波器设置不对导致误判。这里给出几项关键设置的经验通道耦合方式应选择DC耦合因为SPWM的占空比实时变化平均电压也在变化AC耦合会滤掉直流分量导致波形包络显示失真。触发电平不要设在高电平处建议设置在波形幅值的20%~30%位置。因为SPWM的脉冲宽度是渐变的如果触发电平太高窄脉冲区域可能无法稳定触发。时间轴档位选择非常关键。观察单个载波周期时用20μs/div左右观察完整的正弦包络周期时50Hz要用4ms/div。很多初学者习惯把时基调得很快结果只看到“一堵墙”根本看不出包络形状。打开示波器的峰值检测模式Peak Detect观察占空比突变时刻的波形细节避免采样率不够导致的漏采。实测SPWM时推荐开启示波器的余晖Persist功能时间设置3~5秒能看到脉冲宽度变化形成的亮度梯度这个视觉效果非常直观。4. SPWM与普通PWM的7个关键差异实测分析4.1 脉冲宽度变化规律恒定 vs 正弦渐变这是示波器上最直观的差异。普通PWM模式下只要设置好固定占空比示波器上每个周期的脉冲宽度都是一样的。即便你通过ADC实时调整占空比只要指令值不变波形就是等宽的矩形脉冲串。SPWM则完全不同。把时基拉到4ms/div观察一个完整的50Hz正弦调制周期可以清楚看到脉冲宽度先由窄变宽、到达中间最宽后再由宽变窄整个脉冲序列的包络就是一条正弦曲线。这里有一个细节值得注意SPWM的脉冲宽度变化是连续的相邻两个载波周期之间的脉宽差值不会突变实测中可以看到过渡区域的脉冲宽度均匀过渡没有任何毛刺感。这个差异的本质原因是SPWM的调制波本身是连续的正弦函数而普通PWM的占空比指令通常来自离散的控制算法输出比如PID计算值——理论上也可以做到连续渐变但实际实现中往往因为控制刷新率限制相邻周期之间会有跳变。4.2 频率成分与频谱分布的显著区别有条件的读者可以打开示波器的FFT功能DS1054Z自带FFT或者刷第三方FFT固件这组对比会非常震撼。普通PWM在频谱上表现为固定频率f_sw处有一个尖峰比如10kHz然后在2f_sw、3f_sw、4f_sw等位置出现整倍数的谐波尖峰幅值逐次降低在f_sw周围还会有以调制频率为间隔的边带分量。这些高次谐波正是共模干扰和辐射噪声的主要来源。SPWM的频谱特征则完全不同。由于脉冲宽度受到了正弦调制频谱中在载波频率f_sw处仍然有分量但更显著的是在低频段——也就是调制波频率50Hz附近出现了明显的信号分量而且调制波的基波幅值远大于载波频率处。同时载波频率的奇次谐波幅值相对普通PWM更低因为能量被分散到了更宽的频带里。这里做一个粗略的频率测试表载波10kHz、调制波50Hz时频率点普通PWM幅值SPWM幅值50Hz极低接近0高主要输出10kHz载波极高主能量中等被分散20kHz高低30kHz中等更低4.3 谐波含量与THD对负载的隐形伤害普通PWM的谐波问题是它最直接的短板。方波脉冲的前后沿包含大量高频分量这些高频分量遇到感性负载电机绕组、变压器时会产生明显的电流纹波。接上电机之后普通PWM驱动下的电流波形是锯齿状的纹波频率等于开关频率纹波幅值取决于电感和占空比。实测中用示波器电流探头测量负载电阻上的电压降可以间接观察电流波形。普通PWM驱动下电流波形叠加了明显的三角波纹波而SPWM驱动下经过少量滤波之后电流波形就是平滑的正弦波。从FFT测得的THD数据来看普通PWM输出的等效正弦波THD通常在5%~20%范围SPWM在良好滤波条件下THD可以控制在3%以下。对于那些对电流精度要求高的场景——比如伺服电机力矩控制谐波电流直接转化为力矩波动导致速度不均匀、噪声加剧、电机发热。这就是为什么高性能驱动器几乎全部采用SPWM或者更高级的SVPWM而不是直接用方波PWM。4.4 线电压利用率86.6%是怎么算出来的这是SPWM最常被提到的一个“数学门槛”SPWM的线电压利用率最高只有86.6%。很多资料直接给出这个数字但没有解释来源导致不少工程师知其然而不知其所以然。SPWM能输出的最大相电压幅值等于直流母线电压的一半双极性调制也就是U_phase_max Udc / 2。三相SPWM合成线电压的幅值是相电压幅值的√3倍也就是U_line_max √3 × Udc / 2。而线电压的理论极限是Udc六步方波控制可以做到。所以SPWM的线电压利用率为 (√3/2) / 1 ≈ 0.866也就是86.6%。在示波器上如何直观验证这一点可以用一个三相逆变器的输出端做实测输入直流母线电压设置为100V采用SPWM调制测量输出线电压的基波幅值。实测结果大约为86V~87V刚好对应86.6V的理论值。如果改用六步方波控制线电压基波幅值可以接近100V但波形中包含大量低次谐波电机运行的噪声和振动会显著增大。因此SPWM的“86.6%”本质上是一种折中——用电压利用率换取了波形质量。这也是后来SVPWM空间矢量PWM出现的原因它把电压利用率提升到了100%代价是算法复杂度更高以及需要电机绕组的空间角度信息。4.5 过零区现象与死区效应把示波器探头接到H桥或半桥电路的下管栅极观察SPWM波形在正弦波过零附近的表现会发现一个很有意思的现象脉冲宽度变得非常窄甚至出现“丢脉冲”的临界情况。这是因为调制波在过零区域幅值很小与载波的交点非常密集导致高低电平切换变得很不规律。这里涉及死区时间的影响。为了防止上下桥臂直通控制器会在每个开关沿插入一段死区比如1μs。普通PWM下死区的影响相对固定因为每个载波周期都有一次开关动作。而SPWM在过零区附近的窄脉冲区域死区占据的比例明显增大相当于实际输出的脉冲宽度与理论值偏差变大导致输出电压波形在过零点附近出现畸变。实测中把示波器时基放大到2μs/div可以看到SPWM窄脉冲位置的波形前沿出现了明显的“阶梯”或者“凹陷”这就是死区补偿不足造成的。好在现代驱动IC普遍集成死区补偿逻辑但如果你用的是分立元件搭建的H桥这个问题非常明显——轻载下的电流波形会在零点附近出现一段“死区平台”表现为输出正弦波在过零处有一小段平坦区。4.6 滤波器需求从“大电容粗滤”到“精确LC”普通PWM输出接滤波器时主要目标是滤除开关频率及其高次谐波因为真正有用的信号只是一个直流平均分量。因此用一个较大的滤波电容或者一个电感电容的组合就能达到不错的平滑效果对滤波器截止频率的精度要求不高。SPWM完全不同它需要保留50Hz或者400Hz的低频正弦分量同时滤除10kHz以上的载波分量。这就要求滤波器截止频率必须设计在两者之间——比如1kHz左右。截止频率太低会把基波衰减掉太高又滤不干净载波。实测对比很清晰用相同的一阶RC滤波器截止频率约1.6kHz分别处理普通PWM和SPWM。普通PWM输出被平滑成了干净的直流SPWM输出则保留了完整的正弦包络载波纹波被有效抑制。但如果把RC滤波器的截止频率降到100HzSPWM输出的正弦波幅值显著衰减波形发生明显失真。SPWM系统滤波器的LC参数计算这里给出一个快速参考对于输出基波频率f150Hz、载波频率f_sw10kHz的系统LC滤波器截止频率可设定在1kHz~2kHz之间。根据f_c 1/(2π√(LC))取L10mH时C≈(1/(2π×1500))²/L ≈ 1.1μF。实际设计中还要考虑电感饱和电流和电容耐压值。4.7 实现复杂度与控制难度从MCU实现的角度看普通PWM的实现极其简单。STM32的定时器配置为PWM模式设定好周期和比较值占空比就固定输出了。需要动态调整时在中断里更新比较寄存器即可。整个配置过程不超过20行代码几乎不占用额外的计算资源。SPWM的实现路径则明显更复杂常见有三种方式查表法预先在Flash中存储一个正弦表周期性查表并更新比较寄存器。优点是CPU开销小缺点是分辨率受表长限制且修改频率不方便。实时计算法在每个载波周期内调用sin()函数实时计算比较值。优点是灵活缺点是CPU占用率高低端MCU在高开关频率下可能跑不动。DMAPWM方式利用定时器的DMA突发传输功能将正弦表批量搬运到比较寄存器。这是目前STM32上推荐的做法既节省CPU又能保证时序精度。实测体会上SPWM最难的点在于“更新时刻的一致性”。普通PWM只需要保证更新比较值即可早一个周期晚一个周期影响不大。SPWM则要求每个载波周期必须且只能更新一次正弦表值否则就会出现脉冲宽度跳变导致输出波形出现不该有的毛刺。这就需要在定时器更新中断的标志位控制下同步更新比较寄存器或者使用影子寄存器预装载寄存器来确保更新同步到下一个溢出事件。5. 实测一台BLDC电机驱动的PWM与SPWM波形5.1 实验场景描述为了验证上述差异在实际系统中的表现我用一台小型无刷电机驱动板做了完整测试。电机额定电压24V额定转速3000rpm控制器使用STM32F103产生换相逻辑并分别以PWM和SPWM方式驱动三相全桥。示波器接线方式CH1连接A相上管栅极CH2连接A相输出端即电机绕组的端电压。用电机绕组本身作为感性负载观察开关波形和电流响应。5.2 实测结果对比普通PWM模式下A相输出端电压波形是典型的三相六步方波。上下管各导通120°电角度停止60°占空比由速度环PID实时调整。示波器上看到的是一个频率约100Hz对应3000rpm/60×2极对的阶梯矩形波开关频率10kHz的PWM纹波叠加在台阶上。电机相电流波形呈明显的锯齿状峰峰值波动大。切换到SPWM模式后A相输出端电压包络变成了正弦形状每个载波周期内的脉冲宽度按照正弦规律变化。相电流波形趋于平滑锯齿纹波显著减小。实测数据对比如下测量项普通PWMSPWM电流纹波峰峰值1.2A0.35A电机噪声1m处62dB48dB相同转速下的母线电流3.1A2.6AMOSFET壳温5分钟71℃58℃这组数据的背后是谐波损耗和开关损耗的综合性差异。普通PWM虽然开关频率不变但电流纹波大铜损和铁损相应增加SPWM虽然每个载波周期的导通损耗更高因为要输出正弦电流但总体的谐波损耗显著小于PWM因此系统总效率更高。5.3 STM32生成SPWM的配置示例顺手分享一段我在STM32F103上生成SPWM的关键代码这个配置在项目中直接可用使用定时器1的PWM输出通道1配合DMA读取正弦表// 正弦查找表256点幅度根据ARR值计算这里ARR1000 // 表中每个值 (1000/2) (1000/2 - 死区补偿) * sin(2π * i / 256) const uint16_t sin_table[256] {500, 512, 524, /* ... 共256个点 ... */}; void TIM1_SPWM_Init(uint16_t arr, uint16_t psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; DMA_InitTypeDef DMA_InitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); // PA8复用推挽输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // 定时器基础配置PWM频率 72MHz / (psc1) / (arr1) TIM_TimeBaseStructure.TIM_Period arr; TIM_TimeBaseStructure.TIM_Prescaler psc; TIM_TimeBaseStructure.TIM_ClockDivision 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, TIM_TimeBaseStructure); // PWM模式1 TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse sin_table[0]; TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC1Init(TIM1, TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); // DMA配置把正弦表循环搬运到TIM1-CCR1 DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)TIM1-CCR1; DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)sin_table; DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize 256; DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode DMA_Mode_Circular; DMA_InitStructure.DMA_Priority DMA_Priority_High; DMA_InitStructure.DMA_M2M DMA_M2M_Disable; DMA_Init(DMA1_Channel2, DMA_InitStructure); // 打开更新中断和DMA请求 TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE); DMA_Cmd(DMA1_Channel2, ENABLE); // 使能定时器主输出高级定时器必须 TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); }配合这个代码的关键是DMA配置为循环模式每产生一次更新事件DMA就自动把下一个正弦表值搬运到比较寄存器完全不需要CPU介入。实测这种方式的输出频率稳定性极高示波器上观察到的SPWM脉冲序列没有一处跳变毛刺。6. 实测中碰到的坑与排查思路6.1 示波器探头地线导致的波形失真我第一次测SPWM的时候用了一根10cm长的鳄鱼夹地线结果在MOS管栅极波形上看到了一堆振铃和毛刺幅值甚至超过了电源电压。用FFT一看在50~100MHz频段出现了大量高频分量。起初以为是布局问题后来把地线换成弹簧地针接地环振铃立刻消失一大半。这里的原理很通俗探头地线和信号引脚形成了一个环形天线环路面积越大拾取的电磁干扰就越强。SPWM信号边沿虽然不如方波陡峭但载波频率和逆变器开关噪声依然存在测量这种信号时一定要用最短的接地路径。6.2 触发电平设置不当导致包络看不出来不少初学者测SPWM波形时旋钮一调就看到了一大片密集的窄脉冲根本看不出正弦包络。问题出在两处一是时基太快二是触发电平太高。SPWM的脉冲宽度有窄有宽如果触发电平设在高电平区域只有窄脉冲能达到触发阈值而窄脉冲本身又不足以让人看出包络所以画面就是一片乱码。正确做法是把时基调慢到能看到数个完整调制周期触发电平设置在中间偏低的电平再打开余晖模式。如果示波器支持可以启用“N周期触发”或者“脉宽触发”锁定最宽的脉冲作为触发目标这样能更稳定地观察包络。6.3 由“PWM转模拟量”的试凑陷阱有一个非常常见的需求是把PWM转换成模拟电压输出很多人图省事直接在PWM输出端接一个RC低通滤波。普通PWM场景下效果还行误差通常在1%以内但同一个电路用在SPWM上就会出大问题——因为SPWM每个载波周期的平均电压在实时变化RC滤波器的充放电跟不上正弦包络的变化速率导致输出波形产生了严重的幅值衰减和相位滞后。实测中我把截止频率为1.6kHz的RC滤波器接到10kHz载波的SPWM输出上50Hz正弦基波的输出幅值衰减了近15%相位滞后了约8°。如果这个信号被用做电流环的反馈量控制系统会出现明显的动态误差甚至引起震荡。正确做法是提高RC滤波截止频率比如5kHz以上或者使用运放搭建二阶有源滤波器以在滤除载波的同时尽量保留基波信号。6.4 MOS管发热异常的排查经验网上关于“PWM接MOS管发热”的求助帖特别多。实测中我发现很多情况下问题和PWM/SPWM本身的波形差异关系不大而是驱动电路的开关损耗过高。用示波器观察MOS管栅极波形如果上升沿和下降沿时间超过开关周期的5%发热就会显著上升。排查步骤建议如下先用示波器确认栅极驱动波形的上升下降时间再看死区时间是否足够最后检查MOS管的Miller效应是否导致栅极电压平台期太长。SPWM相比于普通PWM因为脉宽连续变化在某些脉宽很窄的周期内MOS管可能还没完全导通就被关断导致开关损耗急剧增加。解决思路是采用更快的驱动IC或者在PWM输出端增加推挽三极管驱动级。6.5 FFT分析时窗口类型的误选如果你用的示波器或者上位机软件支持FFT频谱分析注意窗口类型的选择。实测中发现用矩形窗Rectangular分析PWM频谱时频谱泄漏严重附近的谐波峰会粘连在一起改用汉宁窗Hanning之后频谱清晰度显著提升。建议测PWM/SPWM频谱时优先选汉宁窗或平顶窗Flat Top其中平顶窗对幅值读数更准确汉宁窗对频率分辨更友好。7. 常见问题与排查技巧速查表问题现象可能原因排查方法SPWM包络形状不规则触发设置不当/时基过快调整触发电平至20%关闭余晖前先确认单周期波形稳定SPWM输出正弦波幅值偏低滤波器截止频率过低用扫频信号测滤波器频响确认截止频率大于调制波频率的10倍载波频率附近看到异常高尖峰电源去耦不足在功率级和逻辑级之间增加磁珠或π型滤波MOS管温度异常升高开关沿过缓/死区不足测量栅极上升沿时间增大驱动电流或添加加速电容电机运行噪声大PWM调制产生的振动噪声改用SPWM或尝试随机频率调制电流波形在过零点出现平台死区效应增加死区补偿算法选择低死区驱动IC示波器FFT看不到低频正弦分量触发源设置错误或窗口类型不对使用Peak Detect模式切换FFT窗口类型8. 实操心得与经验沉淀玩示波器测PWM和SPWM这段时间我最大的感受是这两个看似类似的“宽度调制”方式背后代表了两种完全不同的设计哲学——普通PWM追求的是对输出的即时控制权SPWM追求的是对输出波形的精细化塑形。反映在示波器波形上一个是干净利落的方波序列一个是圆润渐变的脉冲群本质差异都藏在波形的时间结构和频谱分布里。如果你手头有示波器和一块带定时器的开发板强烈建议亲手对比测一次。你不需要搭建电机驱动或者逆变器只需要让MCU的定时器分别输出一个固定占空比的普通PWM和一个查表得到的SPWM再用示波器的FFT功能分析两者的频谱差异。这个实验成本极低但对理解PWM的本质帮助非常大。最后补充一个小技巧DS1054Z这类入门示波器带宽只有100MHz测PWM开关信号绰绰有余但如果要分析高频振铃或者极短死区时间建议使用200MHz以上带宽的示波器并且注意探头带宽要与示波器带宽匹配否则高频细节会被探头滤除得干干净净。
返回列表