基于STM32F103的变频逆变器方案:硬件设计、SPWM/SVPWM算法与调试实战
发布时间:2026/10/9 1:05:23 锦皓数字建站

1. 为什么变频逆变器至今仍是电力电子领域的热门项目变频逆变器这个东西说它老吧确实老几十年前就有成熟理论了说它新吧也真新每年都有大量工程师在这个方向上反复折腾。原因很简单把直流电变成可调频、可调压的交流电这个需求太普遍了。从工业电机驱动、光伏并网、UPS不间断电源到家用变频空调、车载逆变器底层逻辑都是同一套东西。我接触变频逆变器项目大概有七八年了从最早用单片机加分立元件搭波形发生器到后来用专用PWM芯片再到近几年用STM32做全数字控制踩过的坑可以说能写一本小册子。这次要聊的这套方案主控选的是STM32F103VET6配套Altium Designer做的硬件设计整体属于一套比较成熟、适合拿来直接做产品原型或者毕业设计的方案。STM32F103VET6这颗芯片72MHz主频512KB Flash64KB SRAM带3个通用定时器、2个高级定时器、3个12位ADC、2路DAC封装是LQFP100。用它做变频逆变器资源是够用的尤其是那个高级定时器TIM1自带互补输出和死区插入功能简直就是为逆变桥驱动量身定做的。很多人一上来就想用F4或者H7觉得性能强但实际上对于几kW以内的变频逆变应用F103完全扛得住而且成本低、资料多、生态成熟出了问题好查。这套方案能做什么简单说它可以实现单相或三相逆变输出支持VVVF变压变频控制频率范围覆盖几Hz到几百Hz输出波形可以是SPWM或者SVPWM。适合谁看如果你正在做电机驱动、电源变换、电力电子相关的项目或者你是电子类专业的学生要做毕业设计再或者你是嵌入式工程师想转电力电子方向这套东西都值得你花时间研究。注意变频逆变器涉及高压强电调试时务必使用隔离变压器和限流保护切勿直接用手触碰功率电路部分。2. 整体方案架构与核心器件选型思路2.1 主控芯片为什么选STM32F103VET6而不是其他型号选型这件事我的原则一直是够用就好别为了参数好看多花冤枉钱。STM32F103VET6在这个项目里的核心任务有几个产生PWM驱动信号、采集电压电流反馈、跑控制算法、处理保护逻辑、做通信交互。这些任务对算力的要求其实不算高72MHz的Cortex-M3内核配合硬件乘除法跑一个SPWM生成加PID调节绰绰有余。具体来说TIM1高级定时器可以输出3对互补PWM带可编程死区时间直接驱动三相逆变桥的6个开关管。TIM2到TIM5通用定时器可以用来做捕获测频、编码器接口、或者系统时基。ADC1和ADC2可以配置成同步采样模式同时采集母线电压和相电流采样时间可以压到1微秒左右。这些外设组合起来刚好覆盖变频逆变器的全部需求。对比一下其他常见选择用TMS320F28022这类DSP当然更专业它的PWM精度和ADC响应确实更好但开发门槛高、成本也高对于中小功率应用有点杀鸡用牛刀。用Arduino或者普通8位单片机呢算力又不够跑不了复杂的控制算法。所以F103VET6处在一个很舒服的中间位置性价比突出。2.2 功率拓扑选择单相全桥还是三相全桥功率拓扑的选择取决于你的应用场景。如果是驱动单相电机或者做单相逆变电源用单相全桥就够了四个开关管结构简单控制也不复杂。如果要驱动三相电机或者做三相逆变输出那就得用三相全桥六个开关管需要三对互补PWM。这套方案我建议做成可配置的三相全桥因为三相拓扑向下兼容单相应用——你只用其中两路桥臂就是单相全桥了。开关管的选择上低压小功率场景用MOSFET比如IRF3205、IRFP4668这类高压大功率场景用IGBT比如FGA25N120、IKW40N120这类。选管子的核心参数是耐压、导通电阻或饱和压降、开关速度、热阻。以母线电压300V、输出功率1kW为例母线电流峰值大概在5A左右考虑2倍余量选10A以上的管子。耐压方面300V母线至少选600V的管子留一倍余量。开关频率如果定在10kHz到20kHz之间MOSFET的开关损耗可以接受IGBT则需要稍微降频或者加缓冲电路。2.3 驱动电路与隔离方案驱动电路是逆变器的关键环节做不好直接炸管。STM32的IO口输出是3.3V驱动能力只有几十毫安根本推不动功率管。所以必须加栅极驱动芯片。常用的有IR2110、IR2136、EG2133等。IR2110是高压高速驱动自带自举电路适合桥式拓扑。IR2136是三相驱动集成度更高但价格也贵一些。隔离方面如果主控和功率级共地可以用非隔离驱动如果要做安全隔离那就得用光耦或者磁隔离。光耦方案经典的是TLP250、HCPL3120磁隔离可以用Si8233、ADuM3223。我个人倾向于自举光耦隔离的组合成本适中可靠性也够。实操心得自举电容的选型很关键容量太小会导致高边驱动供电不足太大又会影响开关速度。一般选0.1uF到1uF的陶瓷电容耐压要高于母线电压。自举二极管要用快恢复管比如UF4007普通整流管反向恢复太慢会出问题。2.4 采样与保护电路设计变频逆变器必须实时采集母线电压、输出电流、温度等参数用于闭环控制和故障保护。电压采样用电阻分压运放跟随电流采样可以用霍尔传感器或者采样电阻差分放大。霍尔传感器隔离性好但成本高、体积大采样电阻方案便宜但需要处理共模电压问题。保护电路要覆盖过流、过压、欠压、过温、短路这几种典型故障。过流保护可以用比较器做硬件快速关断响应时间控制在微秒级。过压欠压用ADC采集后软件判断响应可以慢一点。过温用NTC热敏电阻贴在散热器上ADC采集后查表换算温度。3. 核心控制算法与PWM生成细节3.1 SPWM与SVPWM的取舍SPWM正弦脉宽调制和SVPWM空间矢量脉宽调制是两种最常用的调制方式。SPWM实现简单用正弦表和三角载波比较就能生成谐波特性一般。SVPWM电压利用率高比SPWM高出约15%谐波特性也更好但算法复杂一些需要做坐标变换和扇区判断。对于STM32F103来说跑SVPWM完全没问题。我的建议是如果只是做基础功能验证先用SPWM把整个链路跑通等系统稳定了再切换到SVPWM提升性能。这样分阶段推进出问题容易定位。SPWM的生成方法很直接在定时器中断里查正弦表把查到的值写入比较寄存器CCR硬件就会自动生成对应占空比的PWM。正弦表可以用Excel或者Python生成点数一般取256或者512精度够用。载波频率就是定时器的频率比如10kHz。SVPWM则需要先计算三相占空比再通过扇区判断和矢量作用时间计算最终转换成三个比较值。这个过程涉及一些三角函数和查表运算在72MHz的M3内核上跑中断周期10kHz的话CPU占用率大概在30%到40%还有余量做其他事情。3.2 死区时间的计算与设置死区时间是为了防止上下桥臂直通短路而设置的。当上管关断、下管开通时如果关断有延迟就会出现瞬间直通电流直接穿过两个管子轻则跳保护重则炸管。死区时间的大小取决于开关管的关断时间、驱动电路的延迟、以及温度影响。以IRFP4668为例它的关断延迟时间典型值是50ns下降时间是30ns加起来80ns。驱动芯片IR2110的传输延迟大概在100ns左右。所以死区时间至少要设置200ns才能保证安全。实际工程中我一般会设置500ns到1us的死区留足余量。STM32的TIM1支持死区插入通过BDTR寄存器的DTG位配置。死区时间的计算公式是DTG[7:0]乘以定时器时钟周期。如果定时器时钟是72MHz周期约13.9ns那么设置DTG36就是500ns。具体配置代码大概长这样TIM_BDTRInitStructure.TIM_OSSRState TIM_OSSRState_Enable; TIM_BDTRInitStructure.TIM_OSSIState TIM_OSSIState_Enable; TIM_BDTRInitStructure.TIM_LOCKLevel TIM_LOCKLevel_1; TIM_BDTRInitStructure.TIM_DeadTime 36; // 500ns TIM_BDTRInitStructure.TIM_Break TIM_Break_Enable; TIM_BDTRInitStructure.TIM_BreakPolarity TIM_BreakPolarity_High; TIM_BDTRInitStructure.TIM_AutomaticOutput TIM_AutomaticOutput_Enable; TIM_BDTRConfig(TIM1, TIM_BDTRInitStructure);注意死区时间不是越大越好。死区太大会导致输出波形畸变尤其是低频时影响明显。所以要在安全和性能之间找平衡点一般500ns到1us是比较合理的范围。3.3 VVVF控制策略的实现VVVF就是变压变频核心思想是保持压频比恒定这样电机磁通基本不变转矩输出平稳。具体实现上频率给定后根据V/f曲线计算出对应的电压幅值再转换成PWM占空比。V/f曲线一般分两段低频段比如0到5Hz需要转矩提升因为定子电阻压降占比大如果不补偿低频时转矩不足。高频段比如超过额定频率进入恒功率区电压不再增加频率继续上升转矩下降。在代码里可以用一个数组存V/f曲线或者用分段线性函数计算。频率变化时电压跟着变化同时要注意加减速时间的设置。加速太快会导致过流减速太快会导致过压。一般加速时间设在1到10秒之间根据负载惯量调整。3.4 电流环与速度环的PID调节如果要做闭环控制电流环和速度环是少不了的。电流环是内环响应快带宽一般在1kHz以上速度环是外环响应慢带宽在几十Hz。两个环串联电流环的输出作为PWM的调制信号。PID参数整定是个经验活。我的做法是先调电流环把Kp从小往大加直到电流响应出现轻微超调然后加Ki消除稳态误差。电流环调好后再调速度环同样先P后I。积分限幅一定要加否则启动时积分饱和退饱和会很慢导致超调严重。STM32上跑PID要注意定点数还是浮点数的选择。F103没有硬件浮点单元浮点运算是软件模拟的速度慢。如果中断频率高建议用定点数或者Q格式。比如Q15格式把浮点数乘以32768转成整数运算速度快很多。4. 硬件设计要点与Altium Designer实操4.1 原理图设计的关键模块划分用Altium Designer画原理图第一步是模块划分。我一般把整个系统分成几个功能块主控最小系统、电源模块、驱动模块、功率模块、采样模块、通信模块、人机交互模块。每个模块单独画最后用网络标号连接这样图纸清晰查错也方便。主控最小系统包括STM32F103VET6、晶振电路8MHz无源晶振22pF电容、复位电路10k上拉100nF电容、启动模式选择BOOT0和BOOT1跳线、SWD调试接口。这些是标配照着官方参考设计来就行。电源模块要产生几路电压3.3V给主控和数字电路5V或12V给驱动芯片15V或20V给IGBT驱动。如果母线电压是300V还需要一个反激或者Buck电路从母线取电。这里要注意隔离数字地和功率地要分开最后单点连接。4.2 PCB布局布线的核心原则PCB布局对逆变器的性能影响巨大尤其是功率部分。我的经验是先布功率回路再布驱动回路最后布信号回路。功率回路的面积要尽量小减少寄生电感否则开关瞬间会产生高压尖峰容易炸管。具体来说母线电容要尽量靠近功率管走线要短而粗。三相桥的六个管子排成一排驱动芯片放在旁边驱动走线要短最好控制在几厘米以内。采样电阻的走线要用开尔文连接避免走线电阻影响采样精度。地平面处理上数字地和模拟地分开功率地单独走最后在母线电容的负极单点汇合。不要大面积铺地尤其是功率部分铺地会形成环路引入干扰。信号线要远离功率线如果必须交叉尽量垂直交叉减少耦合。实操心得Altium Designer里可以用Design Rule设置线宽和间距。功率走线宽度按1A对应1mm估算比如20A的走线至少20mm宽或者用铺铜代替。驱动走线用0.3mm到0.5mm就够了。间距方面高压部分至少留2mm爬电距离如果要做安规认证还得更大。4.3 散热设计与热仿真功率管的损耗主要包括导通损耗和开关损耗。导通损耗是I²R乘以占空比开关损耗是0.5乘以V乘以I乘以开通时间关断时间乘以开关频率。以IRFP4668为例导通电阻8mΩ电流10A导通损耗约0.8W开关损耗在10kHz下大概2W左右。总共不到3W加个小散热片就够了。如果用的是IGBT饱和压降2V左右10A电流下导通损耗20W开关损耗也不小必须加风扇强制散热。散热器的热阻计算结温上限150°C环境温度40°C允许温升110°C总热阻要小于110除以总损耗。比如总损耗30W热阻要小于3.6°C/W选散热器的时候要看它的热阻参数。4.4 下载与调试接口设计STM32的调试接口用SWD就够了只需要SWDIO和SWCLK两根线加上VCC和GND。接口用标准的4针排针或者2.54mm插座。如果板子空间紧张可以用1.27mm的贴片插座。串口也是必备的用来打印调试信息和接收上位机指令。用USART1TX和RX引出来波特率一般设115200。如果要做隔离加一个ADuM1201磁隔离芯片或者用光耦。5. 软件框架搭建与关键代码解析5.1 工程目录结构与文件组织一个清晰的工程结构能让后期维护轻松很多。我的习惯是按功能分目录Project/ ├── CMSIS/ // 内核相关文件 ├── FWlib/ // 标准外设库 ├── User/ │ ├── main.c // 主函数 │ ├── stm32f10x_it.c // 中断服务函数 │ └── system_stm32f10x.c ├── Driver/ │ ├── pwm.c/h // PWM驱动 │ ├── adc.c/h // ADC采样 │ ├── uart.c/h // 串口通信 │ └── timer.c/h // 定时器 ├── Algorithm/ │ ├── spwm.c/h // SPWM生成 │ ├── svpwm.c/h // SVPWM生成 │ ├── pid.c/h // PID控制器 │ └── vf.c/h // V/f曲线 └── App/ ├── inverter.c/h // 逆变器主逻辑 └── protect.c/h // 保护逻辑这样分的好处是换芯片或者换外设的时候只需要改Driver层Algorithm和App层基本不动。移植性大大提升。5.2 定时器中断服务函数的编写要点PWM生成的核心在定时器中断里。以TIM1更新中断为例中断频率就是PWM载波频率。中断服务函数要做的事情包括更新比较值、执行控制算法、处理保护逻辑。void TIM1_UP_IRQHandler(void) { if (TIM_GetITStatus(TIM1, TIM_IT_Update) ! RESET) { TIM_ClearITPendingBit(TIM1, TIM_IT_Update); // 执行控制算法 ControlLoop(); // 更新PWM比较值 TIM_SetCompare1(TIM1, ccr1); TIM_SetCompare2(TIM1, ccr2); TIM_SetCompare3(TIM1, ccr3); // 保护检查 ProtectCheck(); } }中断里的代码要尽量精简能放主循环的放主循环。比如串口打印、按键扫描这些不要放在中断里。中断里只做实时性要求高的操作。5.3 ADC采样与DMA传输配置ADC采样要配置成规则通道扫描模式DMA传输这样不用CPU干预采样数据自动存到数组里。采样时间要尽量短但也不能太短否则采样精度不够。STM32F103的ADC最快采样时间是1.5个周期加上12.5个周期的转换时间总共14个周期在14MHz ADC时钟下就是1微秒。ADC_InitStructure.ADC_Mode ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode ENABLE; ADC_InitStructure.ADC_ContinuousConvMode ENABLE; ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_T1_CC1; ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel 4; ADC_Init(ADC1, ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_7Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_7Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_7Cycles5); ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_7Cycles5); ADC_DMACmd(ADC1, ENABLE); ADC_Cmd(ADC1, ENABLE);用TIM1的CC1事件触发ADC采样这样采样时刻和PWM同步可以避开开关噪声。采样点一般选在PWM周期的中点这时候电流比较稳定。5.4 串口通信与上位机交互串口用来做调试和参数整定非常方便。我一般定义一个简单的协议帧头0xAA帧尾0x55中间是命令字和数据。上位机可以用串口助手或者自己写个Qt程序。void UART_SendData(uint8_t cmd, uint8_t *data, uint8_t len) { uint8_t buf[64]; buf[0] 0xAA; buf[1] cmd; buf[2] len; memcpy(buf[3], data, len); buf[3len] 0x55; for (int i 0; i 4len; i) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) RESET); USART_SendData(USART1, buf[i]); } }通过串口可以实时修改变量比如PID参数、频率给定、V/f曲线拐点等。调试的时候不用反复烧程序效率高很多。6. 调试过程中最常见的坑与排查方法6.1 上电就炸管的原因分析炸管是逆变器调试中最常见也最肉疼的问题。原因通常有几种死区不够导致直通、驱动电压不足导致管子工作在放大区、母线尖峰超过管子耐压、驱动信号时序错误。排查方法先用示波器看驱动波形确认死区时间够不够上下管的波形有没有重叠。然后看驱动电压幅值MOSFET要10V以上才能完全导通IGBT要15V左右。再看母线电压波形开关瞬间有没有尖峰如果有加吸收电容或者调整布局。注意第一次上电一定要用低压小电流测试比如母线给24V限流设1A。确认波形正常后再逐步升压。千万不要一上来就满压满流炸了不光损失管子还可能伤到人。6.2 输出波形畸变的排查思路波形畸变表现为正弦波上有毛刺、平顶、或者不对称。毛刺一般是开关噪声检查驱动电阻是不是太小或者加RC吸收。平顶可能是母线电压不够或者占空比到了极限。不对称可能是死区时间不一致或者采样有偏差。用示波器看输出波形的时候要用差分探头或者隔离探头普通探头地线夹在功率地上会短路。如果没有差分探头可以用两个普通探头做数学运算A-B就是差分信号。6.3 ADC采样值跳变严重的处理ADC采样跳变首先检查参考电压稳不稳VREF引脚要加100nF和10uF电容。然后看采样时间够不够信号源内阻大的话采样时间要加长。再就是地线干扰模拟地和数字地要分开最后单点连接。软件上可以加滑动平均滤波或者中值滤波。滑动平均取8次或16次响应慢一点但平滑。中值滤波取5次或7次去掉最大最小值再平均对脉冲干扰抑制效果好。6.4 常见问题速查表现象可能原因排查方法解决方案上电炸管死区不足、驱动异常示波器看驱动波形加大死区、检查驱动电路输出波形毛刺开关噪声、布局差看开关节点波形加RC吸收、优化布局ADC跳变参考电压不稳、地干扰测VREF、看地平面加滤波电容、分开地电机抖动PID参数不合适看电流波形重新整定PID过流误报采样噪声、阈值太低看采样波形加滤波、调整阈值通信失败波特率不匹配、干扰看TX/RX波形检查配置、加隔离温度过高散热不足、损耗大测管子温度加散热片、降开关频率6.5 调试工具与仪器清单调试逆变器几样仪器是少不了的示波器带宽至少100MHz最好带差分探头、万用表真有效值、可调直流电源带限流、电子负载或者用电阻箱、隔离变压器安全隔离、热成像仪看温度分布可选。软件工具方面Keil MDK或者STM32CubeIDE用来写代码Altium Designer画板子串口助手看数据Python或者MATLAB做波形分析和算法仿真。7. 方案扩展与进阶方向7.1 从V/f控制升级到矢量控制V/f控制简单可靠但动态性能一般低速转矩也不够。如果要做高性能驱动可以升级到矢量控制FOC。FOC需要实时采集三相电流做Clarke变换和Park变换然后对d轴和q轴电流分别做PID调节最后通过SVPWM输出。STM32F103跑FOC是够的但要注意运算量。Clarke和Park变换涉及三角函数可以用查表或者CORDIC算法加速。电流环频率建议在10kHz以上速度环1kHz左右。如果算力吃紧可以考虑换F4系列带硬件FPU浮点运算快很多。7.2 加入物联网通信功能现在很多应用需要远程监控可以加一个ESP8266或者ESP32做WiFi通信通过MQTT协议把运行数据传到云平台。STM32和ESP之间用串口AT指令交互或者用SPI接口跑LWIP协议栈。如果要走有线网络可以用ENC28J60或者W5500以太网模块配合LWIP协议栈。STM32F103的RAM有限跑LWIP要裁剪一下只保留必要功能。7.3 多机并联与均流控制大功率场景下单台逆变器不够用需要多台并联。并联的关键是均流每台机器输出电流要一致否则有的过载有的轻载。均流可以通过下垂控制或者主从控制实现。下垂控制不需要通信靠频率和电压的下垂特性自动均流主从控制需要通信但均流精度更高。7.4 能量回馈与四象限运行如果要做电机测试或者能量回收需要逆变器支持四象限运行既能电动也能发电。这时候功率拓扑要改成背靠背双PWM一边接电网一边接电机中间用母线电容连接。控制上要同时做整流和逆变算法复杂度翻倍。这个方向适合有一定基础之后再去折腾初学者先把单象限跑通再说。8. 一些掏心窝子的实操建议做逆变器这个方向理论很重要但动手更重要。我见过太多人抱着书本啃了半年一上电就懵了。我的建议是先买个现成的开发板或者评估板把波形看明白再自己画板子。自己画的第一版板子不要追求功能多全先把最小系统跑通PWM输出正常ADC采样正常再一步步加功能。元器件采购上功率管一定要买正品某宝上的翻新管、打磨管太多了参数根本达不到标称值炸管了都不知道为什么。电容要选低ESR的母线电容容量要够一般按每瓦1uF到2uF估算。驱动芯片也要买正品假货的传输延迟和驱动能力都不对。调试的时候养成记录的习惯。每次改了什么都记下来波形截图保存参数变化记录在案。出了问题往回翻记录很快就能定位。我自己的调试笔记已经攒了好几本现在遇到问题翻翻以前的记录大部分都能找到答案。最后说一句逆变器调试有风险安全永远是第一位的。高压部分做好隔离上电前检查三遍不确定的时候先降压测试。炸几个管子是小事伤到人就麻烦了。这套STM32变频逆变器方案从硬件设计到软件实现从算法原理到调试技巧基本上覆盖了中小功率逆变器开发的全流程。你可以直接拿去做项目原型也可以根据自己的需求裁剪或者扩展。关键是要动手去做光看是看不会的。遇到问题多查资料、多问、多试慢慢就有感觉了。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。