逆变器电路全解析:SG3525推挽、STM32 SPWM双闭环与三电平NPC
简介一份聚焦电鱼机与逆变器电路的电路图合集文档面向电子爱好者、逆变电源DIY玩家以及需要查阅经典振荡与推动电路的制作与维修人员。内容按自激式、自激振荡、反激励自控、脉冲推动、传统多谐振荡、振上振、互推式、高频机、单边式、电子白金机与自控电子捕鱼机等机型展开并收录用CD4011、NE555芯片搭建的单边电路以及TL494、SG3525的引脚功能、参数数据与50Hz正弦波、220V方波逆变器设计实例。压缩包内共1个doc文件约4.54MB便于离线保存与随时翻查已有252人学习下载。读者可获得各机型的电路结构与元件参数、实用家用逆变器方案以及用IC芯片设计逆变器的完整思路适合按机型对照选型、检修与仿制时参考。1. 从老式自激到新式 SPWM逆变器电路这套体系在讲什么拆开一台用了十年的车载逆变器里面往往只有一片 SG3525、两只功率管加一个工频变压器再拆一台今年的储能逆变器板子上是 STM32、六路隔离驱动、三电平桥臂和一排霍尔传感器。同样是「把直流变成交流」两代电路的差别不在元件数量而在控制方式老式靠模拟芯片的自由振荡边沿加固定占空比新式靠定时器产生 SPWM 再加电压电流闭环调节。这门手艺沿着三条线展开SG3525 推挽电路的频率、死区、匝比怎么算STM32 单片机逆变器的 PWM 配置、采样链路、双闭环代码怎么写两电平与三电平 NPC 的器件差异、相电压输出时序和中点电位怎么处理。落地场景是离网储能、车载电源、光伏前级这类通用直流—交流变换不涉及任何违法用途。适合两类人手里攒着一堆老式逆变器图纸、想搞懂每个电阻电容为什么这么取的人以及正在用单片机做数字电源、被死区、采样偏置、中点电位卡住的人。下面从最老的那套电路开始拆。2. 老式逆变器电路SG3525 推挽拓扑的参数计算与调试老式逆变器电路的知识密度集中在三个地方振荡频率怎么定、变压器匝比怎么算、出问题时示波器探哪里。这三件事搞明白SG3525 这一代方案基本就能自己改参数了。2.1 SG3525 的振荡频率、死区与占空比上限SG3525 内部是一个振荡器加两路互补输出频率由 6 脚 RT、5 脚 CT 和 7 脚放电电阻 RD 共同决定常用关系式是f_osc 1 / (CT × (0.7 × RT 3 × RD))RD 不只是频率项它同时决定两路输出的死区——RD 越大CT 放电越慢互补输出的切换间隔越宽。这就是为什么同样想跑 30kHz改 RT 和改 RD 得到的结果不一样改 RT 主要是挪频率改 RD 是在频率和死区之间做交换。常见做法是先按目标频率选 RT、CT再用 RD 微调死区最后拿示波器量实际波形。RTCTRD计算频率典型用途8.2 kΩ4.7 nF100 Ω约 35 kHz铁氧体高频推挽6.8 kΩ4.7 nF100 Ω约 42 kHz小体积适配器4.7 kΩ10 nF100 Ω约 28 kHz兼顾效率与干扰8.2 kΩ10 nF0 Ω约 17 kHz工频后级前级用脚本把参数空间扫一遍比手算快得多也方便看频率对 RT 的敏感度# sg3525_calc.py —— 扫描 RT / CT / RD 组合输出频率与死区趋势 RT [4.7e3, 6.8e3, 8.2e3, 10e3] # 6 脚对地电阻单位 Ω CT [4.7e-9, 10e-9] # 5 脚对地电容单位 F RD [0, 100, 200] # 7 脚放电电阻单位 Ω for rt in RT: for ct in CT: for rd in RD: # 手册给出的振荡频率近似式RD 项同时影响死区 f 1.0 / (ct * (0.7 * rt 3 * rd)) # 死区随 RD 与 CT 增大而变宽此处只做趋势估算 td_ns 3 * rd * ct * 1e9 print(fRT{rt/1e3:4.1f}k CT{ct*1e9:4.1f}n RD{rd:3}Ω ff{f/1e3:6.2f}kHz 死区≈{td_ns:5.0f}ns)这段脚本里0.7 * rt 3 * rd对应手册关系式的分母系数td_ns只是按 RD、CT 的乘积做数量级估算不同版本手册给的系数略有出入最终死区一定要用示波器同时看两路输出的上升沿间隔确认。实际调试中我会把占空比上限压在 45% 以内给死区和变压器偏磁留余量——推挽结构一旦上下管直通炸的是两只管子加驱动电阻。注意SG3525 的 10 脚关断端不要悬空加 10kΩ 下拉否则干扰脉冲可能误触发关断表现为输出间歇性掉压。2.2 推挽变压器匝数与线径的换算匝数计算的核心是伏秒平衡。推挽每个半周期只有一半时间在工作导通时间 ton D / (2 × f_sw)初级匝数按下面这个关系走Np (Vin_min × ton) / (ΔB × Ae)其中 ΔB 是双向磁通摆幅铁氧体取 2 倍工作磁密即 Bmax 0.2T 时 ΔB 0.4TAe 是磁芯有效截面积单位 m²。# pushpull_xfrmr.py —— 推挽变压器初级匝数、次级匝数与集肤深度 Vin_min 10.5 # 12V 电池放到 10.5V最恶劣工况 Vsec_pk 330 # 次级峰值目标含管压降与调节余量 f_sw 35e3 # 开关频率 Hz D_max 0.45 # 单边最大占空比 Ae 80e-6 # EE28 磁芯有效截面积 m² Bmax 0.2 # 铁氧体工作磁密 T ton D_max / (2 * f_sw) # 单边导通时间 Np Vin_min * ton / (2 * Bmax * Ae) # 初级匝数未取整 Np int(Np) 1 # 只能向上取整避免饱和 Ns round(Np * Vsec_pk / Vin_min) # 次级匝数按变比放大 delta_mm 66.1 / (f_sw ** 0.5) # 铜在 20℃ 的集肤深度单位 mm print(fton{ton*1e6:.2f}us Np{Np}匝 Ns{Ns}匝 变比 1:{Ns/Np:.1f}) print(f集肤深度{delta_mm:.3f}mm 建议单股线径 ≤ {2*delta_mm:.2f}mm)按这组参数跑出来 ton ≈ 6.4μsNp 落在 2 到 3 匝之间取 3 匝后实际 ΔB 会低于 0.4T属于安全方向次级约 95 匝。集肤深度 0.35mm 意味着不能用单根粗线得用多股 0.5mm 漆包线并绕否则 35kHz 下交流阻抗会吃掉大半效率。这是一条老式电路里最容易被忽略的细节——很多人按直流电流选线径绕完发现满载温升异常。2.3 老式电路的典型故障与示波器验证点调试老式逆变器示波器的三个必测点是两路驱动波形的上升沿间隔看死区、初级电流波形看偏磁、输出空载与满载波形看削顶。表里是常见的现象与对应排查方向。现象大概率原因测量位置与判断上电即炸管死区不足或驱动不同步双通道看两路栅极间隔应大于 0.5μs空载电流偏大两路占空比不对称、偏磁串电流探头看初级波形应上下对称输出波形削顶变压器接近饱和加大匝数或提高开关频率带载掉压明显变压器漏感大、绕组压降看次级波形在负载下的平顶倾斜输出间歇性中断10 脚受干扰误关断检查关断脚下拉与走线占空比不对称是老式电路的经典坑。SG3525 的两路输出共用同一个误差放大器如果 1、2 脚反馈网络不对称或者 16 脚基准被负载拉偏两路占空比就会有零点几个百分点的差变压器长期单向偏磁温升会持续爬。验证方法很简单空载时用手背靠近变压器明显发热就是偏磁信号不好别等它自己烧。3. 新式单片机逆变器STM32 生成 SPWM 与离网双闭环控制老式方案靠模拟芯片的自由振荡占空比是「被动」的新式方案的核心变化是把波形生成交给定时器、把幅值交给闭环。这套结构做下来输出 THD 能做到 3% 以内动态负载调整率也远好于老式电路。3.1 TIM1 中央对齐与死区寄存器配置用 TIM1 的互补通道做单相全桥中央对齐模式下的载波频率关系是f_pwm f_clk / (2 × (ARR 1) × (PSC 1))72MHz 主频要跑 20kHz 载波ARR 取 1799、PSC 取 0 即可。中央对齐的好处是每个周期在计数器谷底和峰值各产生一次更新事件采样时刻可以选择在峰值处此时开关管刚完成换流噪声窗口已经过去。// tim1_spwm.c —— TIM1 中央对齐 互补输出 死区 TIM_TimeBaseInitTypeDef tb; TIM_OCInitTypeDef oc; TIM_BDTRInitTypeDef bdtr; tb.TIM_Prescaler 0; // 不分频 tb.TIM_CounterMode TIM_CounterMode_CenterAligned1; tb.TIM_Period 1799; // 72MHz/(2*1800)20kHz 载波 tb.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInit(TIM1, tb); oc.TIM_OCMode TIM_OCMode_PWM1; oc.TIM_OutputState TIM_OutputState_Enable; oc.TIM_OutputNState TIM_OutputNState_Enable; // 互补通道 oc.TIM_Pulse 900; // 初始 50% 占空比上电前会被闭环覆盖 oc.TIM_OCPolarity TIM_OCPolarity_High; oc.TIM_OCNPolarity TIM_OCNPolarity_High; TIM_OC1Init(TIM1, oc); bdtr.TIM_DeadTime 0x48; // 72*13.9ns ≈ 1.0usMOS 全桥可从 0x20 起调 bdtr.TIM_AutomaticOutput TIM_AutomaticOutput_Enable; TIM_BDTRConfig(TIM1, bdtr); TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE);TIM_Period与载波频率一一对应改载波就等于改 ARRTIM_DeadTime的编码不是线性的DTG[7:5] 全零时死区时间等于寄存器值乘以时钟周期 13.9ns写 0x48 得到约 1.0μs。低压 MOS 全桥通常 0.3μs 就够高压 IGBT 建议留到 1μs 以上。写死区宁大勿小代价只是输出波形略有失真而直通的代价是炸桥。提示调试阶段先把母线电压降到 30V 以下验证波形确认死区与互补关系正确后再上全压。3.2 电流电压采样链路差分放大、偏置与 ADC 触发新式逆变器的采样链路一般分三路输出交流电压、电感电流、母线电压。电感电流用分流电阻加差分放大电路是最容易出问题的环节。分流电阻取 1mΩ电流范围 ±20A则差分电压 ±20mV。差分放大倍数取 50 倍得到 ±1V再叠加 1.65V 偏置ADC 端落在 0.65V 到 2.65V 区间正好避开轨到轨运放的非线性段。差分放大的共模抑制比直接决定电流采样的零点漂移电阻配对的 0.1% 精度比运放本身的失调更关键。ADC 触发源一定要挂到 TIM1 的 TRGO 上选择中央对齐的峰值点触发这样每次采样都发生在开关噪声最小的时间窗。前面再加一级 RC 滤波1kΩ 加 10nF 的截止频率约 16kHz低于 20kHz 载波能把开关尖峰压下去。// adc_trigger.c —— TIM1 峰值触发注入通道采电流与电压 TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update); // 更新事件作触发源 ADC_InitTypeDef adc; adc.ADC_ExternalTrigInjecConv ADC_ExternalTrigInjecConv_T1_TRGO; adc.ADC_ExternalTrigInjecConvEdge ADC_ExternalTrigInjecConvEdge_Rising; ADC_Init(ADC1, adc); ADC_InjectedSequencerLengthConfig(ADC1, 3); ADC_InjectedChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_28Cycles5); // 电感电流 ADC_InjectedChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_28Cycles5); // 输出电压 ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_28Cycles5); // 母线电压 ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE);采样时间选 28.5 个周期是配合前级 RC 与源阻抗做的折中太长会拖慢环内计算节奏太短则采样保持电容充不满。注入通道的好处是转换结束能立即触发中断闭环计算和数据更新可以压缩在同一个中断里完成不用再等规则通道的 DMA 搬运。3.3 离网双闭环 PI 的代码骨架离网逆变器的双闭环通常外环控输出电压、内环控电感电流。外环输出作为内环的电流指令内环输出作为调制波幅值。20kHz 中断里完成一次完整的采样、计算、更新时间预算 50μs。// loop.c —— 电压外环 电感电流内环 PI typedef struct { float kp, ki; float integ; float out_max, out_min; } pi_t; static float pi_run(pi_t *p, float err) { float out p-kp * err p-integ; // 比例项 积分累积 if (out p-out_max) { // 抗积分饱和先限幅再回写 out p-out_max; p-integ p-ki * err; if (p-integ p-out_max) p-integ p-out_max; } else if (out p-out_min) { out p-out_min; p-integ p-ki * err; if (p-integ p-out_min) p-integ p-out_min; } else { p-integ p-ki * err; // 正常区间直接累加 } return out; } void TIM1_UP_IRQHandler(void) // 20kHz 更新中断 { float vout adc_get_output_voltage(); // 已换算成实际电压 float il adc_get_inductor_current(); // 外环目标 220V 有效值先用瞬时值做内环指令 float verr vref_inst - vout; float iref pi_run(pi_v, verr); iref clampf(iref, -IL_MAX, IL_MAX); // 给内环指令加硬限幅 // 内环跟踪电流指令 float ierr iref - il; float duty pi_run(pi_i, ierr); spwm_set_modulation(duty); // 更新 CCR正弦表在下一次更新生效 TIM_ClearITPendingBit(TIM1, TIM_IT_Update); }il用的是电感电流而不是电容电流实现简单、抗噪好缺点是 LC 谐振峰在环路里会带来一个二阶极点需要在 PI 之外补一个陷波或者把内环带宽压到谐振频率的三分之一以下。clampf对内环指令限幅这一步不能省否则启动瞬间电压误差大内环指令饱和输出会有一段明显的过冲。参数整定顺序是先单独闭环内环把电压环断开给固定电流指令确认电流能快速无超调跟踪再把外环带宽设成内环的五分之一左右。3.4 LC 滤波截止频率与 THD 的取舍输出 LC 滤波的截止频率一般取载波频率的十分之一到二十分之一。20kHz 载波对应 1kHz 到 2kHz取 L 1mH、C 10μF 时f0 1 / (2π × √(L × C)) ≈ 1.59 kHz这个位置既能压住 20kHz 附近的开关谐波又不会明显放大 50Hz 附近的低次谐波。截止频率再往下压电感和电容的体积、成本都会上去而且 LC 的谐振峰更靠近基波负载突变时震荡更难收。THD 的实测值主要取决于载波比和死区设置载波比越高、死区越小低次谐波越少。空载时 THD 通常比满载差因为阻尼变弱谐振峰抬起来了——测 THD 一定要在额定负载和半载两个点上各测一次。4. 两电平与三电平 NPC 逆变器硬件差异与相电压输出时序「三电平是不是更贵」这个问题答案取决于功率等级和开关频率。小功率场合两电平几乎总是更划算功率上来、开关频率想压低的时候三电平的优势才逐渐显现。4.1 器件数量、耐压与损耗对比对比项两电平三电平 NPC每相开关管2 只4 只单管耐压全母线电压母线电压的一半三相器件数6 只12 只 6 只钳位二极管输出电平Vdc/2、−Vdc/2Vdc/2、0、−Vdc/2dv/dt全母线跳变减半相同 THD 下开关频率高约可降到一半控制复杂度低高需中点电位控制单管耐压降一半意味着器件成本曲线并不是线性翻倍同样的 800V 母线两电平要选 1200V 器件三电平选 650V 器件650V 器件的导通电阻和开关损耗都明显更好。所以到了几十千瓦以上三电平的器件总成本未必贵真正贵的是驱动数量翻倍、控制难度上升、体积和散热设计更复杂。反过来在几千瓦、开关频率可以拉到 40kHz 以上的场合两电平用高频把 THD 压下去工程上更省事。4.2 NPC 三电平的开关状态与相电压输出时序NPC 三电平每相有 P、O、N 三种状态对应四个开关管的固定组合。下面是一相的状态表Sa1 到 Sa4 从母线正极往下数。状态Sa1Sa2Sa3Sa4相电压P1100Vdc/2O01100N0011−Vdc/2关键约束是状态只能在 P→O→N 之间相邻切换不能从 P 直接跳到 N而且每次切换只允许一对管子动作——这正是 dv/dt 减半的来源。用脚本生成状态序列再换算成相电压比对着图纸数开关管靠谱得多# npc_states.py —— 生成 NPC 三相状态序列并换算相电压 import numpy as np Vdc 700.0 # 母线电压 V m 0.85 # 调制比 f 50.0 # 基波频率 fc 4000.0 # 载波频率 N 400 # 一个基波周期内的采样点 t np.linspace(0, 1.0/f, N, endpointFalse) # 三相互差 120 度叠加载波做规则采样 carrier 2 * ((fc * t) % 1.0) - 1.0 states {} for name, phase in ((A, 0), (B, -2*np.pi/3), (C, 2*np.pi/3)): ref m * np.sin(2*np.pi*f*t phase) err ref - carrier # 大于 0.5 出 P小于 -0.5 出 N其余为 O s np.where(ref 0.5, 2, np.where(ref -0.5, 0, 1)) states[name] s v (s - 1) * Vdc / 2 # 0/1/2 映射到 -Vdc/2、0、Vdc/2 print(f相 {name}P{np.sum(s2):3} O{np.sum(s1):3} N{np.sum(s0):3} f相电压峰值{v.max():.0f}V)输出里每个周期内 O 状态出现的次数就是零电平占空比次数越多说明开关管处在零电平的时间越长、损耗分布越均匀。相电压波形看起来是三级台阶每一级跳变量只有 Vdc/2这就是三电平谐波小的直接原因。用示波器看实测波形时三级台阶的中间一级宽度应该随调制比连续变化如果出现台阶宽度突变多半是状态切换跳过了 O 状态。4.3 中点电位波动与并联环流三电平特有的两个问题是中点电位波动和并联环流。中点电位波动的根源在于 O 状态时中点会流过分相电流三相电流在 O 状态下的瞬时和不为零中点电容就被反复充放电。抑制手段有三条一是选用对中点电流影响小的冗余矢量组合用小矢量对来平衡一个载波周期内的中点电荷二是把中点电容容量加大用被动方式把波动压在母线电压的 2% 以内三是在调制波里注入零序分量这是三相三线制下最省事的做法。环流主要出现在多台逆变器并联或者共直流母线的场合。并联模块之间即使输出频率一致微小的相位差和开关时刻差都会在零序回路上形成环流电流波形上表现为低频包络的畸变严重时会让某一台机器无故过流保护。常见做法是三个方向同时下手输出侧加共模电感把零序阻抗抬起来调制上保证共模电压一致避免不同模块使用不同的零矢量分配方式控制上加入零序环流的抑制环把检测到的零序电流取反后叠加到调制波上。这三招里调制的共模一致性优先级最高——两台机器用不同的零矢量排布后面再加硬件也很难补回来。注意并机调试时先用独立直流源给每台机器单独供电确认各自的输出相位和共模电压一致后再共母线否则第一次上电就可能触发过流。5. 逆变器电路的分级上电与 THD 验证技巧新板子第一次上电我一般分四级走控制级、驱动级、低压母线、满载。每一级只验证一件事跳过任何一级都可能用管子换经验。第一级只给控制部分供电不接母线。示波器看 TIM1 的四路输出和两路互补输出确认死区间隔在示波器上肉眼可辨同时确认上电瞬间 PWM 处于关断状态——很多炸机事故是初始化顺序写反PWM 先跑起来、驱动使能后置上下管同时导通。第二级接驱动电源不接功率母线测栅极波形。这时要重点看栅极的开通和关断沿有没有米勒平台造成的二次开通驱动电阻取值通常从 10Ω 起调下管比上管略小一点可以让关断更快。第三级给一个 30V 左右的低压母线串上限流电阻或者用带限流的直流源测输出电压波形。低压下看三件事SPWM 的台阶是否连续、LC 滤波后的正弦有没有明显畸变、空载电流是否正常。第四级上全压先半载再满载测输出有效值、THD 和开关管温升。THD 的测量有几个容易翻车的点。示波器 FFT 测 THD 必须保证探头带宽足够20kHz 载波至少要 5 次谐波以内的带宽余量探头用 10:1 加短地线弹簧地线夹子拖长了引进来的共模噪声会把 THD 抬高一倍以上。测量点放在 LC 滤波之后但要在负载端子之前负载线过长会引入额外的电感。空载和满载各测一次两次差值超过 2 个百分点说明环路阻尼不够或者 LC 谐振峰太靠近基波。温升判断不看外壳看结温。用热像仪扫开关管和变压器时注意 MOS 的壳温和结温之间还隔着热阻TO-247 封装在无散热器时热阻能到 40℃/W 以上壳温 80℃ 时结温可能已经逼近 150℃。工程上更稳的做法是留一手满载连续跑两小时让温度进入稳态再看别在刚上电的十分钟内就下结论。最后一个技巧是偏磁的快速判断。空载运行十分钟后断电立刻用手背靠近变压器——老式推挽的偏磁表现为单侧明显发热新式全桥的偏磁则表现为两只开关管温差不一致。温差超过 10℃ 就值得回头查驱动延时和采样零点因为偏磁一旦在满载下积累起来下一次上电就是炸管。本文还有配套的精品资源点击获取