
做电力电子这块的兄弟应该都有同感网上讲SPWM原理的资料一抓一大把但真正从零开始、把仿真、硬件、代码串起来跑通一个三相逆变器的完整教程却不多。很多初学者卡在“原理看了不少真到自己画板子写代码就懵”的状态。这篇文章我就拿STM32F103C8T6这块经典得不能再经典的芯片完整走一遍三相SPWM逆变器的搭建流程。从Simulink仿真验证算法、到PCB设计避坑、再到Keil工程源码实现和实测调试全部摊开来讲。项目定位是给想入门逆变器/变频器方向、或者学校做相关课题的同学做一个可复现的参考整套流程走完你对SPWM、死区、驱动电路、滤波参数这些东西的理解绝对会上一个台阶。1. 整体设计与方案选型思路1.1 为什么用STM32F103C8T6做逆变器先说芯片选型。三相SPWM逆变器这个应用核心需求是输出6路带死区的PWM波频率从几百Hz到几十kHz不等。STM32F103C8T6主频72MHz自带高级定时器TIM1和TIM8支持互补输出和硬件死区插入这两个外设几乎就是为电机控制和逆变器应用准备的。更关键的是这颗芯片太“平民”了。最小系统板十几块钱就能买到国产替代型号也一大堆即使焊坏了也不心疼。对于入门阶段来说用F103最大的好处是资料密度极高从寄存器手册到各种库函数的坑网上全都有前人踩过的记录。你不需要纠结“芯片够不够用”这种问题——F103完全能跑动SPWM查表法哪怕是几十kHz的载波频率也毫无压力。我在实际项目中确实用过更高端的F4甚至DSP做逆变器控制但对学习而言硬件复杂度越低越好。F103的定时器结构相对简单配置起来直观反而更能帮你把SPWM的时序逻辑理解透彻。这也是我在这类教学项目中坚持用F103的原因。1.2 SPWM逆变器的系统框架与核心技术点整个系统的结构其实不复杂直流母线电压通过三相全桥逆变电路在MOS管的开关动作下变成脉冲波形再经过LC低通滤波最终输出三相正弦交流电。这个过程里最核心的技术点有三个。第一是SPWM波的生成也就是让PWM的占空比按正弦规律变化第二是死区时间的控制防止同一桥臂上下两个MOS管同时导通造成直通短路第三是驱动电路的设计F103的GPIO输出能力根本没法直接驱动MOS管栅极必须经过驱动芯片做电平转换和功率放大。按照拓扑结构来分两电平三相全桥是最经典的方案——6个MOS管每个桥臂两个分别输出A/B/C三相。本次项目就是采用这个结构。至于三电平NPC结构能降低谐波和器件应力但需要更多功率管和钳位二极管控制逻辑也更复杂对入门项目来说性价比太低。先把两电平跑通了回头再看三电平的时序分析图很多东西会豁然开朗。1.3 两电平方案中的技术决策依据在确定两电平拓扑后还有几个关键决策需要做。载波频率选择在10kHz到20kHz之间是常见做法。频率越高滤波器的截止频率可以设计得越高输出波形质量越好但MOS管的开关损耗也会线性增长。我选了16kHz的载波频率这是一个比较均衡的数值——开关噪声基本听不到MOS管的发热也在可控范围内。调制方式是SPWM里最基本也最重要的概念。SPWM的本质是将正弦波作为调制波与高频三角载波进行比较当正弦值高于载波值时输出高电平反之输出低电平。这样输出的脉冲宽度会随正弦波幅度变化经过滤波后就能还原出正弦波形。2. 核心原理拆解SPWM与滤波环节的细节2.1 从采样定理到SPWM占空比输出SPWM生成方法主要分为三种自然采样法、对称规则采样法和不对称规则采样法。自然采样法是让正弦调制波与三角载波直接比较交点处切换状态理论上谐波含量最低但方程是超越方程实时计算量很大。规则采样法则是用三角载波的顶点或中点对称轴对应的正弦值来近似计算量小很多适合MCU实现。我在F103上采用的是查表法这是最省事的方案。思路很简单在上电时预先算好一个正弦表存成数组放在Flash里。运行时按载波周期查表得到当前时刻对应的正弦值再乘上调制比换算成定时器比较值直接写入CCR寄存器。这里有个关键点说明一下查表法本质上是规则采样法的离散化。表格点数N和载波频率配合决定了一个基波周期里有多少个载波周期。比如载波16kHz、基波50Hz一个正弦周期就有320个载波周期。我在实际工程里放了256点的半波表配合频率调整既省内存又足够平滑。2.2 死区补偿为什么必须加以及如何加写PWM的人如果不了解死区大概率会炸MOS管。原理很简单逆变器同一桥臂的两个MOS管是互补导通的。如果上管关断和下管导通完全同步现实中MOS管有开通和关断延时就可能出现短暂的两管同时导通母线电压直接短路电流瞬间飙升MOS管秒炸。死区就是在这两个互补PWM之间硬插入的一段“全关断”时间。F103的高级定时器TIM1内置了这个功能只要设置好死区时间寄存器硬件会自动在两个通道之间插入一段延迟不需要软件额外做任何事。死区时间设置多少要参考MOS管的栅极电荷和驱动电路特性。我常用的IRFP460这类管子典型死区设置在1-2us比较稳妥。死区时间太短会保护不了管子太长又会引入输出波形畸变和基波电压损失这就需要在保护性和波形质量之间找平衡。2.3 LC滤波器的设计与参数计算方法SPWM逆变器的输出是高频脉冲波必须接LC低通滤波器才能得到平滑的正弦波。滤波器的截止频率一般设计为载波频率的1/10到1/5既要有效衰减16kHz的开关频率分量又不能对50Hz基波造成明显的衰减和相位偏移。以我这次设计的参数为例负载按220V/50Hz、额定功率500W来算。确定截止频率取1.5kHz左右用经验公式计算截止频率公式 f_c 1 / (2π√(L×C))电感纹波电流系数一般取10%-20%。我按L5mH、C10uF来算f_c 1 / (2π×√(5×10^-3 × 10×10^-6)) ≈ 712Hz。这个值偏低了会拖慢动态响应。后来我把参数调整为L2mH、C15uF。需要提醒的是实际滤波效果还要看电容的ESR、电感磁芯的饱和特性。我当时做仿真时没考虑ESR实测波形高频毛刺明显比仿真多后来在模型里加了ESR才和实物对上。3. MATLAB仿真验证算法上板前的最后一道关卡3.1 Simulink模型整体搭建流程强烈建议在碰硬件之前先把整个系统在MATLAB/Simulink里跑一遍。我见过太多人跳过仿真直接上电调试结果一个逻辑错误烧掉一片MOS管费钱费时间。仿真就是用零成本换经验值这笔账怎么算都划算。Simulink里的模型搭建顺序我一般是这样先搭主电路再搭控制信号最后接测量模块。主电路的核心是三组“Universal Bridge”模块设置为两电平桥臂也可以直接用三个半桥模块拼成三相全桥结构。直流侧接一个恒定电压源注意在直流母线两端并联一个大电容模拟实际电路中的母线电容。交流侧输出接LC滤波器再接三相阻性负载。控制部分用PWM Generator模块配合正弦参考信号来驱动桥臂。这里有个细节PWM Generator模块需要设置载波频率和内部死区时间死区参数要和后面硬件上的设置保持一致这样仿真结果才有参考意义。3.2 波形分析与关键参数调优仿真搭好后的第一件事不是看波形而是检查控制信号是否正确。6路PWM的触发脉冲里同一桥臂上下管的波形应该是互补的并且能看到明显的死区间隔。确认无误后开始看输出波形。正常情况下滤波后的相电压应该是一个较光滑的正弦波。如果波形有明显的阶梯感说明LC截止频率太高了谐波没滤干净。如果波形变成尖峰形状可能是负载阻抗太小导致电流过大或者是调制比设置超出了线性区。通过改变“调制比”参数观察输出电压的变化过程也很有意思。调制比从0.5调到0.9输出电压有效值会线性增长。但调制比超过1就会进入过调制区输出电压不再线性增长波形出现削顶失真。实际应用中一般会限制调制比不超过0.95留出一定的线性调节空间。3.3 仿真对硬件参数的指导价值仿真最大的价值在于把各个参数之间的耦合关系可视化。我在这套项目里就发现了一个问题调制比越大滤波电感的电流纹波越大如果不提高载波频率电感很容易饱和发热。另外仿真结果还可以用来反推功率管的电流应力。在Simulink里加一个Current Measurement模块就能直接查看每个MOS管的电流波形从而确定选用多大电流等级的管子。我之前用MATLAB做仿真时升级到R2021b之后界面有些变化但模型基本兼容。如果用的是较新的版本直接拖模块就可以了。4. 硬件电路与PCB设计实战4.1 PCB布线关键规则与技巧PCB设计是逆变器项目里最容易踩坑的环节而且坑通常不会在设计阶段暴露而是到了上电测试时才会显现出来。总结成一句话就是功率部分走大电流通路模拟部分走干净的地数字部分离得越远越好。首先是铺铜和走线宽度。功率回路中流过的是几十瓦到几百瓦的功率即使是实验室级别的500W逆变器母线电流也能到几安培甚至十几安培。常规的1oz铜厚条件下需要按1A/mm宽度来估算线宽而且大电流路径尽量不加过孔如果必须换层就要打多个过孔并联。其次是大电流回路的环路面积问题。逆变器最忌讳的就是交流回路和直流回路之间的寄生电感和寄生电容太大。我调试时遇到过输出波形振荡排查到最后发现是母线电容的位置离MOS管太远了环路电感太大引起的。后来把母线电容挪到紧贴MOS管的位置振荡就消失了。铜皮挖空这个操作也值得展开说下——很多新手不理解为什么好好的铺铜要挖掉一块。高频开关节点比如MOS管漏极与电感相连的节点会产生强烈的dv/dt如果这部分的铜皮离敏感控制信号太近寄生电容会把开关噪声耦合过去。我在这块PCB上就把开关节点正下方的内层铜皮挖空了信号完整性明显改善。4.2 驱动电路与功率级电路设计要点驱动部分是整个硬件里最需要谨慎处理的地方。F103的GPIO输出电压只有3.3V而IRFP460这类MOS管的栅极需要12V-15V才能完全导通。这里就需要桥式驱动芯片做电平转换。我选用的是IR2101半桥驱动芯片这是最常用的方案自带死区保护功能和自举电路设计。只需要一个12V驱动电源加上自举电容就能完成整个驱动环节非常简洁高效。自举电容的选择有一个重要原则电容上的电荷要足够维持上管导通期间的栅极电荷同时电压下降不能太大。常用0.1uF到1uF的瓷片电容再并联一个0.1uF的高频去耦电容更稳妥。功率管的选型上我推荐IRFP460或IRFP260N。IRFP460耐压500V电流20A适合350V以下的直流母线场景。如果你打算做220V交流输出直流母线至少310VIRFP460是合适的入门选择。再强调一次MOS管的散热器一定要装——16kHz开关频率下实际测试不带散热器几分钟就能烫到不敢碰。4.3 从AD20到嘉立创EDA工具链的对比与建议现在的EDA工具选择比前几年丰富多了。AD20还是很多高校和企业的主力工具优势在于功能全面、教程资源极其丰富。PCB设计里的铺铜、挖空、DRC这些操作在AD里都是基础功能用起来没有任何问题。我在这次项目中用AD20完成了电源部分的铺铜设计通过Design菜单下的Polygon Pour Cutout功能完成挖空操作。嘉立创EDA这几年的进步也很快优势在于和嘉立创打板流程无缝衔接从原理图到下单全部在线完成对新手特别友好。画完直接能导出Gerber下单省去了中间很多折腾。顺便说下Gerber文件的处理方式如果在AD里画了板子需要出厂打样时在AD里通过File-Fabrication Outputs-Gerber Files导出即可。嘉立创可以直接导入生成的Gerber。如果你想用嘉立创EDA打开AD的工程文件嘉立创EDA导入功能对AD格式的支持越来越好但复杂工程可能会有转换错误需要仔细检查元件和连线是否完整。5. 源码实现、调试流程与常见故障排查5.1 Keil工程源码框架与定时器配置软件部分我用的是标准外设库SPL开发的虽然没有HAL库那么“现代”但胜在代码执行效率高、逻辑清楚非常适合学习底层原理。系统的主循环很简单初始化定时器、配置PWM通道、启动输出然后进入死循环等待中断或者轮询更新占空比。核心全部在定时器的配置上。以TIM1为例关键配置包括向上/向下计数模式选择、PWM模式1还是模式2、互补输出的使能、死区时间寄存器的设置以及触发事件的选择。选择中心对齐模式Center-aligned mode 1可以获得更对称的PWM波形谐波指标会比边沿对齐模式好一些。占空比的更新我采用了更新事件中断的方式在中断里查正弦表更新三个比较寄存器CCR1、CCR2、CCR3的值。载波16kHz一个周期中断一次对F103来说几乎没有负担。源码中的FC载波频率、fa基波频率和Vrms输出目标电压都是单独宏定义方便模拟不同的工况。三相之间的相位差120度在查表索引上做对应的偏移就可以实现。5.2 上电调试顺序与实测波形分析这段分享一下我的实测调试流程新手强烈建议照做可以省下一大笔更换MOS管的费用。第一步先不接母线电源只给F103和驱动电路供电。用示波器测量TIM1输出的6路PWM波形重点检查同一桥臂上下管之间是否有死区时间频率和占空比是否正确。这是纯数字逻辑的验证出错也不会烧东西。第二步接入低压直流母线比如先用30V左右的电源这样即使出问题损坏的几率也小很多。带一个小功率灯泡或电阻负载观察输出电压波形是否符合预期。此时如果波形不对劲不要急着加大电压而是回查驱动部分。第三步才是正常母线电压带载测试。这个过程里我一般全程盯着示波器和电流表一旦发现异常立即断电。实测波形上经过LC滤波后的相电压正弦度在调制比0.8左右时表现最好THD粗略估算在3%以下带电机负载时声音也很干净。当然这只是开环条件下的结果要想进一步提高波形质量就需要加入闭环控制策略了。5.3 常见问题与排查技巧汇总把我在这个项目里踩过的坑和网上高频出现的问题整理成了一张排查表问题现象可能原因排查方法上电瞬间MOS管炸裂死区时间设置过短或未设置检查TIM1死区寄存器配置输出电压波形严重畸变调制比过高进入过调制区降低调制比至0.95以下观察输出波形有高频毛刺滤波电感/电容ESR过大或PCB布局不合理检查LC滤波参数并在仿真中对比发热严重但波形正常载波频率过高或驱动电压不足检查驱动波形幅值是否达到12V以上单片机频繁复位功率部分干扰控制电路检查隔离、铺铜和地回路DSP/单片机通信异常串口共地问题使用隔离或检查接地方式再分享两个容易被忽视的细节。一个是示波器探头的地线夹在测量开关节点波形时地线夹会形成天线效应测出来的波形会失真。这种情况建议用短弹簧接地效果比长地线夹好得多。另一个是电解电容的选择。母线电容除了大容量的电解电容外最好再并联一个0.1uF的CBB电容用于吸收高频开关尖峰。电解电容的ESR在高频下很高光靠它根本压不住高dv/dt造成的电压尖刺。5.4 项目扩展方向与实际应用参考这套系统跑通之后可以扩展的方向非常多我挑几个和热词相关的方向说一下。第一个是做变频调速。把基波频率从固定的50Hz改成可调变量通过按键或者上位机调整就能实现异步电机的变频调速。这个方向正好对应热词里“SPWM变频器-异步电机交流调速系统”的场景。代码上只需要改查表的步进速度硬件部分完全不需要动。第二个方向是做并网逆变器的前期研究。如果把负载去掉、输出端接上电网就需要加入锁相环PLL算法和LCL滤波器设计。热词里提到的“LCL型并网逆变器的控制技术”可以看看阮新波老师的书讲得非常透彻。不过并网逆变器涉及电网安全建议先在仿真里跑通确认单机带载能力没有问题后再考虑实则上电操作必须严格遵守相关规范。第三个方向是做三电平逆变器。两电平跑通后再看三电平的时序分析图会更容易理解NPC拓扑中每相四个开关管的开关状态组合。三电平的主要优势是输出电压台阶更多谐波更小但驱动逻辑和死区设置都复杂得多作为进阶项目非常合适。最后再分享一个切身经验做这类功率电子项目一定要养成“先仿真、再低压、再全压”的习惯。我早期刚上手时跳过仿真直接上电结果一个PWM极性设置错误烧了三块驱动板和两个MOS管。后来老老实实按照仿真-低压-全压的流程走基本没再出过硬件损坏的问题。这中间省下的元器件费用和调试时间远超你花在Simulink模型搭建上的那几个小时。