简介:基于STM32的逆变器设计资源包,适合嵌入式开发者和电力电子初学者,系统讲解如何利用STM32的定时器、PWM与ADC实现SPWM正弦波逆变及闭环控制。包内共10个文件,包含3份PDF设计文档、3个zip工程(含原理图、PCB及逆变器控制软件)、2个htm说明页面和2个pcbdoc原理图文件,整体大小约17.92MB,可直接对应硬件设计、软件编程与调试参考。已有2416人浏览学习。资料覆盖硬件选型、保护电路、PID/SPWM控制策略等要点,并提供SPWM生成软件与完整工程文件,便于对照原理图理解从PWM生成到输出反馈的完整实现链路,适合想要动手实践逆变器项目的开发者借鉴。 搞过逆变器的朋友应该都懂:网上讲SPWM原理的教程一抓一大把,但真正拿STM32和功率板搭起来一上电,该炸管还是炸管,该过流还是过流。我最早做这个项目时也天真地以为,核心难点就是定时器输出几路SPWM波形,结果调试时连续烧了两块驱动板,才意识到问题远没这么简单。这篇博文我从实际项目出发,把基于STM32的两电平逆变器从方案选型、主功率参数计算、定时器配置到底层调试背的坑完整梳理了一遍,适合正在做相关毕业设计、或者想从纯控制领域切到电力电子实践的嵌入式工程师参考。
1. 方案选型:为什么用STM32做逆变器核心控制
很多人有一个刻板印象,觉得逆变器这种功率变换场合应该用DSP或者专门的电机控制芯片,STM32的定位偏MCU,做不了高性能闭环。实际做下来,这个说法起码对中低功率段是站不住脚的。以F103系列72MHz的主频,做单相或三相两电平逆变器的SPWM生成、PI闭环、过流保护逻辑,资源完全够用,甚至算得上轻松。F4系列带FPU和硬件乘加,跑更复杂的PR控制、谐波补偿也游刃有余。用STM32最大的好处是生态成熟,CubeMX配完定时器和ADC,标准库或HAL库随便选,开发调试效率比DSP高一个量级。
1.1 两电平逆变器的功率段定位
我做的这台样机目标是单相220V输出、额定功率500W,母线电压选DC 380V左右,开关频率定在16kHz。为什么不选更高的20kHz或者32kHz?这里有个容易被学生忽略的点:IGBT或者MOSFET的开关损耗是随频率线性甚至超线性增加的。16kHz以上人耳几乎听不到开关噪声,同时中小功率管比如IKW40N120这类IGBT在16kHz下还能维持较好效率,再往上就必须换更高规格的管子或改用软开关拓扑,成本立刻上去。对500W这个功率段来说,16kHz是效率和听感的平衡点。
1.2 单相、三相的取舍
如果是做单相逆变器,H桥四只管就够了。做三相逆变器,则需要六只管,常见的就是两电平三相桥结构。两电平的意思是每相输出只有正母线电平和负母线电平两种状态,靠SPWM在一个开关周期内调节占空比来合成正弦波。这个拓扑结构简单、驱动逻辑清晰,非常适合作第一个从理论到实践落地的逆变器项目。热搜词里同时出现"三电平逆变器原理图",这里提醒一下:三电平的ANPC或者NPC结构,在耐压和THD上有优势,但无论是驱动时序还是母线电容均压都复杂得多。第一次做项目不要直接上三电平。
1.3 为什么不用纯模拟方案做对比
如果只做开环SPWM,模拟方案用三角波发生器和比较器也能实现,但频率漂移、温度漂移、死区补偿都很难做。用STM32做数字化的价值在于:死区时间可以精确到几十纳秒级设置,调制波可以实时通过CORDIC或查表生成,输出频率可以做到非常稳定,而且闭环调节、软启动、故障保护全部可以在一个芯片内联动。我对比过纯模拟方案和数字方案在输出电压THD上的差异,负载一波动,模拟方案波形明显变差,STM32的闭环方案能把THD稳在3%以下。
2. 主功率电路与驱动设计:最容易烧板子的地方
控制策略再好,功率板设计有硬伤还是白搭。我在这个阶段踩过的坑,值得单独写一节。
2.1 逆变桥的器件选型计算
选功率管时不能只看额定电流,要同时看耐压、开关损耗和反向恢复特性。母线电压DC 380V,考虑2倍安全裕量,管子耐压至少要750V以上,实际我选了600V耐压的IGBT还是偏紧,后来换成1200V的IKW40N120才彻底放心。电流方面,500W输出、效率按92%算,输入功率大概543W,母线平均电流约1.43A。但注意逆变器是非线性负载,瞬时峰值电流可能达到平均值的3到5倍,所以管子额定电流至少取5到8A。IKW40N120的40A额定值看似夸张,但留足裕量后发热明显降低,散热器体积也可以做得更小,这个余量是值得的。
驱动芯片我用了IR2110加自举电路。自举电容的容值选取有个经验公式:C ≥ 10倍栅极电荷除以栅极驱动电压跌落值。比如IR2110驱动IKW40N120,栅极电荷Qg约260nC,允许压降0.5V,那么C ≥ 10 × 260nC / 0.5V = 5.2μF,实际选10μF胆电容。自举二极管必须用快恢复管,普通4148在这里会烧或者导致高端驱动欠压。
2.2 死区时间到底设多大
死区时间是每个逆变器开发者绕不开的参数。如果同桥臂上下管同时导通,母线就直接短路,那一下的电流足以把模块炸出坑。死区时间设置规则是:大于驱动芯片的传输延迟差加上功率管的关断时间,再留出至少20%到30%的余量。我用的IGBT关断时间典型值在几百纳秒,IR2110的失配也在一两百纳秒,所以最小总死区大约1μs。我最终设了1.5μs。死区太大会增加输出波形畸变,太短则有短路风险。后来在示波器上实测上下管门极波形,1.5μs时不会出现交叠,但已经有足够余量。
2.3 母线电容与吸收电路
母线电容不是越大越好。它主要承担母线电压的支撑和纹波抑制。单相逆变器输出瞬时功率是脉动的,母线会有两倍工频的纹波,这个纹波如果太大,会通过控制环路耦合到输出电压上。我用了两个470μF/450V的电解电容串联,等效约235μF,母线电压纹波控制在5V左右。同时每个IGBT的集电极和发射极之间并了RC吸收电路,R取10Ω、C取2.2nF——这个数值不是拍脑袋定的,是根据开关关断时电压尖峰的振荡频率来调的:先测出未加吸收时的振荡频率,再按C = 1/(4π²f²L) 反推寄生电感,最后定吸收电容。
3. STM32生成SPWM的核心细节:从定时器到死区插入
控制算法在主控里跑起来后,真正决定波形质量的是定时器的配置方式。
3.1 定时器模式选择:中央对齐的关键作用
SPWM在STM32上有两种常见生成方式:边沿对齐模式和中央对齐模式。边沿对齐就是定时器从0计数到ARR,比较匹配时翻转电平,这种模式产生的PWM脉冲集中在周期一侧,谐波含量偏大。中央对齐模式则是定时器从0数到ARR再倒回0,比较匹配点分布在波形两侧,等效载波频率翻倍而开关频率不变,谐波能量更分散。我在F103上用的TIM1,输出四路带死区插入的互补PWM,CH1和CH1N是一对、CH2和CH2N是另一对,正好满足H桥两组桥臂的需求。
3.2 载波频率与时基参数计算
16kHz开关频率,系统时钟72MHz,TIM1挂在APB2上。预分频PSC设置为0,那么定时器计数频率就是72MHz。ARR = 72MHz / 16kHz = 4500。这里注意,中央对齐模式下实际载波周期是两次溢出,所以ARR = 72MHz / (2 × 16kHz) = 2250。很多第一次做的人在这里算错,PWM频率直接差了一倍。CCR比较值的更新要在溢出中断里做,正弦表按每周期256个点生成,每个点对应的比较值 = ARR × (0.5 + 0.5 × M × sin(2πk/256)),其中M是调制比。调制比决定了输出基波幅值,和母线电压配合起来,闭环中需要根据电压误差实时调节M。
3.3 查表法还是实时计算
有人喜欢在中断里用数学库算sin,这个做法在16kHz中断频率下会吃紧。F103的硬件浮点能力有限,浮点sin运算一次几十微秒,占掉了中断周期的三分之一以上,留给控制和保护的执行时间就少了。我的做法启动时把256点正弦表算好放进RAM,运行时查表加线性插值。查表法把中断内的计算量降到了几十个周期以内,剩下时间全部留给PI闭环和故障检测。后面升级到F407时,因为带了FPU,才改成在线实时计算正弦波的方案。
3.4 死区插入的配置细节
TIM1的BDTR寄存器里有个DTG字段,用于配置死区时间。官方手册给的计算公式是:死区 = DTG[7:2] × Tdtg,Tdtg按DTG[7:5]位的挡位决定。我设死区1.5μs、时基为72MHz,Tdtg取1/72MHz≈13.89ns,那么DTG值约为1.5μs / 13.89ns ≈ 108,折算成二进制写入DTG[7:0]即可。配置完死区后,务必用示波器看CH1和CH1N的波形有没有交叠——这是我反复强调的,代码注释写得再漂亮,不如亲眼确认两个波形同时为高电平的那一瞬间不存在。
4. 闭环控制与保护逻辑:逆变器的"大脑反应系统"
如果只做开环SPWM,这个项目就停留在演示级别。要让输出电压在负载变化时保持稳定,必须引入闭环。同时,保护逻辑的速度直接决定了你的功率管能活多久。
4.1 电压环PI控制的实现思路
单相逆变器输出电压是正弦波,直接对它做PI控制会得到稳态误差,因为PI对正弦参考的跟踪能力有限。常见做法是采用dq旋转坐标系下的闭环控制,或者更简单的瞬时值比例谐振PR控制。我最初用的方案是在每个SPWM周期起点采样输出电压和电流,做一个外环电压PI加内环电流PI的双闭环,由于在DSP中实现旋转坐标变换需要Clark变换和Park变换,计算量不小,F103跑起来勉强。后来简化成在静止坐标系下做PR控制,谐振频率设在50Hz,配合低通滤波,THD下降明显,代码量也少。
4.2 采样时序与触发同步
ADC采样时刻会直接影响控制效果。很多人犯的错误是随意启动ADC,导致采样点落在开关噪声毛刺上,电压波动剧烈。我的做法是用TIM1的TRGO事件触发ADC注入组采样,这样每次采样的相位都是固定的,且刻意避开上下管切换的瞬间。在ADC采样完成中断里面读取结果、更新CCR比较值,整个链路延迟只有一个控制周期。采样周期和载波周期同步这一点极其重要,否则闭环会出现随机相位抖动,示波器上看输出电压波形就会有模糊的细毛刺。
4.3 两级保护:软件保护与硬件保护的配合
软件保护包括过流、过压、过温检测,但ADC采集加中断判断需要几十微秒,对IGBT来说这个时间足够烧毁了。所以硬件保护必须独立于软件工作:我用了比较器电路,电流采样信号和设定阈值直接比较,一旦超限,立刻拉低STM32的BKIN引脚。TIM1的刹车功能检测到BKIN电平变化后,所有输出通道立即进入强制低电平状态,不需要CPU参与。这个反应时间大概在几百纳秒级,和软件保护完全不在一个量级。注意BKIN引脚不能悬空,必须接上拉或下拉电阻设定默认安全电平,我因为漏了这个电阻,有一次调试意外触发误动作,排查了很久才发现是引脚噪声导致的。
5. 实测中的波形异常排查:一条完整的排障链路
做逆变器有一句老话:上电容易,满功率难,波形干净更难。这里记录两个最有代表性的排障过程,都是我实际遇到过的问题。
5.1 上电瞬间母线短路炸管
第一次上高压直流电,主电路一合闸,空气开关立刻跳闸,IGBT模块外壳炸裂。排查路径是这样的:先测四个IGBT的集电极-发射极是否全部击穿短路,确认没有后,排除器件本身损坏。再查驱动信号,用示波器探头接到上下管栅极,发现CH1N在CH1关断后还有一段长达3μs的延迟才关闭,和配置的1.5μs死区明显不符。追溯代码才发现,初始化时死区配置写在了PWM输出使能之后,导致前若干个开关周期里死区参数还没生效。把初始化顺序修正为"配置死区→配置输出比较→使能输出"后,问题消失。这个教训说明,功率电路的初始化顺序必须严格检查,不是配置了就等于生效了。
5.2 满载时输出电压波形凹陷
项目调试到带纯阻性负载800W时,输出电压在峰值附近出现了明显的凹陷,THD从2%飙到8%。用电流探头观测母线电流,发现在同样相位区间内,母线电流内出现了一个接近梯形波的异常脉冲。初步怀疑是母线电容容量不够,导致电压跌落,但更换更大的电容后波形没有明显改善。继续深挖,把驱动波形截下来放大看,发现每个载波周期内,IGBT关断时集电极电压有一个接近200V的尖峰,虽然没有击穿管子,但已经导致驱动芯片的欠压复位。问题锁定在吸收电路参数上。经过重新测量寄生电感后,把RC吸收电容从2.2nF加大到4.7nF,尖峰被压到100V以内,输出波形恢复正常。
6. 参数整定的经验与实操建议
最后补一些参数整定和调试顺序的实际经验,这些内容教科书里很少详细写。
6.1 死区补偿到底要不要做
死区会造成输出电压基波损耗和低次谐波,尤其在轻载时更为严重。我实测过,死区1.5μs、载波16kHz时,死区造成的等效电压误差约占母线电压的2.4%,听感上就是输出波形略微发"糊"。做死区补偿的方法不复杂:根据电流极性方向,在指令电压上叠加一个补偿量,电流为正时增加占空比,电流为负时减小占空比。但电流过零点附近的极性判断如果出错,反而会带来更大畸变。我的建议是第一版先不做死区补偿,把开环波形和闭环稳定性调好之后,再回头加这个补偿,每一步变动的效果才容易定性。
6.2 正弦表点数选择的取舍
256点正弦表在载波比(载波频率比基波频率)为320时足够用,因为每个载波周期内要更新的参考值有多个。如果把表点数降到64点,虽然查表更快,但相邻参考点之间的阶梯增量会造成输出波形的高次谐波增大,滤波电路压力变大。还有一点要注意:256点对应16kHz更新率,正好每个中断周期更新一次,这个配对关系非常适合裸机程序的执行节奏。如果改用F407,我建议直接把表点数提到1024,用FPU做插值,这样即使输出频率从50Hz变到400Hz,查表更新的阶梯效应也依然可以忽略。
6.3 母线电压波动对调制比的影响
如果不做母线电压前馈,母线电压波动会直接映射到输出电压上。尤其是在电网供电不稳的场合,空载和满载之间母线电压能差到20V以上,输出电压也会跟着抖。我在控制里加了一个简单的乘法补偿:调制比M乘以一个系数,系数等于参考母线电压除以实测母线电压。这个前馈计算量很小,但对输出电压稳定性的改善非常直观,实测满载时电压波动从±12V缩小到±3V。
6.4 散热设计的经验教训
500W的样机满载运行30分钟后,我用点温枪测IGBT管壳温度已经到85℃,散热器面积不够了。额外加了一个12V风扇风冷,但风扇接在控制板上,启动瞬间电流导致ADC基准出现毛刺,输出波形上多出了同步干扰。最终把风扇供电单独走了一路DC-DC模块,才算彻底解决。这个小问题提醒我,逆变器是一个强弱电混合系统,控制电路的供电独立性和抗干扰设计必须一开始就纳入考虑,否则后期各种奇怪故障都会找到你头上。
最后再说一个关键体会:做基于STM32的逆变器,真正的难点不是在CubeMX里把定时器配置出来。所有参数写进代码不过半天时间,但死区设计、保护逻辑、采样同步、硬件调试这些环节,每一项都需要反复测量和验证。建议初学者先在低压直流比如50V母线电压下做开环测试,把所有保护信号、波形都确认正常了,再逐步升压到380V,这样能把炸管的概率降到最低。等这条路走通了,后续再做三相逆变器或者并网逆变器,就只剩下拓扑扩展和算法迭代的问题了。
本文还有配套的精品资源,点击获取