做电力电子这块的兄弟应该都有同感:网上讲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%。
我按L=5mH、C=10uF来算,f_c = 1 / (2π×√(5×10^-3 × 10×10^-6)) ≈ 712Hz。这个值偏低了,会拖慢动态响应。后来我把参数调整为L=2mH、C=15uF。
需要提醒的是,实际滤波效果还要看电容的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交流输出,直流母线至少310V,IRFP460是合适的入门选择。再强调一次,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模型搭建上的那几个小时。