拆解15kW充电桩模块:从PFC到LLC的数字电源控制全解析 1. 模块整体框架一块PCB上的功率变换与数字控制年前从渠道收了一台某默生15kW充电桩模块准确说是一个二手返修件成色还行外壳上贴的标签已经磨得只剩“15kW”几个字。我不是第一次拆功率模块但这台模块的布局和代码风格确实给了我不少启发。如果你想搞充电桩逆向、想理解数字电源的控制链路或者单纯想看看一台能稳定出15kW的模块内部到底长什么样这篇文章应该能帮你少走几条弯路。模块整体分三大块输入侧、隔离侧、控制侧。输入侧是三相四线接进来经过EMI滤波器、浪涌保护、软启动电阻再到三相整流桥整流后的母线直流大概在530V左右然后进入到PFC升压部分。这里的PFC不是传统单管Boost而是两相交错并联Boost效率和纹波表现都更好。隔离侧的核心是一个全桥LLC谐振变换器通过高频变压器把能量传到副边输出经过同步整流和滤波电容之后直接挂到充电桩的直流母排上。控制侧则是一块主控板主控芯片是一颗DSP配合采样电路、驱动电路、CAN通信和辅助电源承担了所有的闭环控制和状态管理。整块模块的功率密度其实很高15kW的输出能力被压缩在一个不到40厘米见方的壳子里。打开壳体之后最显眼的不是变压器而是一整排MOS管和一整排整流二极管散热底板上还能看到导热硅脂的痕迹。拆这类模块之前一定记得先放电母线电容上的电压可以存很久安全第一。1.1 输入侧的EMI与预充电电路输入侧是最容易被忽视但出问题也最多的地方。EMI滤波器一般由共模电感和X/Y电容组成有些模块还会加两级滤波目的就是抑制高频开关产生传导干扰避免影响同一电网上其他设备。这里我看到的是两级共模电感设计第一级靠近输入端子感值偏大负责低频段第二级靠近整流桥感值偏小负责高频段。这种组合方式在工业电源里很常见做EMI整改时也方便分频段处理。预充电电路也是输入侧的一个关键环节。模块上电瞬间母线电容相当于短路如果不做软启动整流桥和保险丝都容易被冲击电流打掉。所以这里用了一颗NTC热敏电阻加继电器旁路的结构上电时电流先经过NTC限制冲击电流等母线电容充到一定电压之后控制板给继电器信号把NTC短接掉减少正常工作的损耗。拆机的时候我特意量了一下NTC的阻值常温下大概5Ω左右这个阻值按15kW功率等级来说是合理的。如果用继电器旁路的方案做成代码逻辑本质上就是软件里的软启动状态机这也是后面我会重点讲的部分。1.2 控制核心的架构思路主控板上最大的一颗芯片就是DSP周围密密麻麻布置了采样调理电路、驱动隔离芯片、EEPROM和CAN收发器。从计算机组成原理的角度看整个控制核心就是一个典型的嵌入式系统CPU负责运算和控制Flash存放固件RAM存放运行数据ADC模块负责采集电压电流信号PWM模块负责输出驱动波形CAN外设负责通信Timer负责产生时间基准。搞懂这个架构读代码的时候才能顺着外设寄存器去理解每一步在干什么。DSP里跑的是一个前后台系统前台是各种中断后台是一个死循环状态机。中断包括ADC采样中断、PWM中断、通信接收中断、故障保护中断主循环里则处理状态切换、参数计算、故障记录上报等任务。这种架构在工业数字电源里非常常见因为它实时性可控代码结构也相对简单不像RTOS那样存在任务调度上的不确定性。读这类代码千万不要一开始就扎进某个函数里先把中断向量、内存映射、外设初始化和主循环跑一遍搞清楚后面的逻辑就会清晰很多。2. 关键电路原理与功率拓扑选择一台充电桩模块要做的事情本质上是把三相交流电变成可调的高压直流电同时满足效率和EMC要求。要实现这个目标功率拓扑的选择至关重要。现在市面上15kW级别的模块基本上都是两级结构前级PFC把交流整成稳定的高压母线后级隔离DC-DC把母线电压变换成输出直流电压。两级结构的优势在于前后级可以独立设计PFC只负责功率因数校正和母线稳压DC-DC只负责隔离和输出电压调节控制上也相对解耦调试难度比单级结构低很多。2.1 为什么PFC要用交错并联Boost前级PFC电路我重点说下交错并联Boost。Boost电路原理大家应该都很熟简单讲就是利用电感的储能特性让输出电压高于输入电压再通过控制开关管的占空比来调节输出。充电桩PFC的输入是三相整流后的电压波形是一个带有纹波的馒头波Boost电路的工作就是要让输入电流跟随输入电压的波形让功率因数接近1。交错并联的意思是把两个Boost电路并联在一起但两个开关管的驱动信号错开180度。这样做的好处有两个一是等效开关频率翻倍输入电感的总纹波电流大幅下降EMI滤波器可以做得更小二是每个开关管只需要承担一半功率散热压力小器件选型也可以降档。我在模块里看到两颗IGBT就是两个Boost管输入电感也对应有两个磁环这就是交错拓扑的实物证据。PFC的控制通常采用平均电流模式电流环的任务是让电感电流实时跟随一个和输入电压同相位的正弦参考电压环的任务是稳住母线电压。控制带宽上电压环带宽一般设在10~20Hz左右主要为了抗输入电压波动电流环带宽可以做到几千赫兹保证波形跟随能力。实际调试中电压环太慢会导致负载突变时母线电压跌落明显太快又会把输入电压的谐波传到电流环参考上需要根据具体模块的参数慢慢调。2.2 全桥LLC和ZVS软开关的实现后级DC-DC部分某默生这块模块用的是全桥LLC谐振变换器。和传统的移相全桥相比LLC最大的优势是可以在很宽的负载范围内实现原边开关管的ZVS也就是零电压开通。ZVS电路图原理讲解起来并不复杂在开关管开通之前谐振电流先流过开关管的体二极管把开关管的漏源电压钳到零此时再给栅极信号开关管就在零电压条件下导通了。这样一来开关管的开通损耗几乎为零频率可以拉到100kHz以上变压器可以做得很小功率密度自然就上去了。实现ZVS是有条件的核心就是要保证死区时间和谐振参数匹配。死区太短谐振电流还没来得及完成换流开关管就被硬开通了死区太长谐振电流会反向效率反而下降。LLC的谐振频率设计也和输出电压范围有关充电桩模块的输出要覆盖200V到1000V的范围所以LLC的增益曲线需要设计得比较宽通常会用调频控制加调脉宽控制的混合策略。我在拆解时特意看了副边的同步整流方案。15kW这么大的电流如果用二极管整流导通损耗会非常可观所以必须用同步整流也就是用MOS管的导通压降替代二极管的导通压降。同步整流的难点在于时序副边驱动信号必须和原边开关状态严格同步否则会出现共通或体二极管导通的情况导致效率反而变差。好的模块会用一个单独的控制器或者通过变压器绕组感应电压来生成同步驱动信号这块模块用的是后者从变压器副边绕组上取电压信号经过比较器和逻辑电路再生成驱动这样省掉了一路隔离通信。2.3 辅助电源和驱动电路的特别设计2.3 辅助电源和驱动电路的特别设计主控板要用电驱动芯片也要用电不可能直接从高压母线上拉所以模块里一定有一路辅助电源。这块模块的辅助电源用的是反激拓扑输入从母线电容取电输出几路相互隔离的低压电分别给控制板、驱动芯片和采样电路供电。反激方案的优点是电路简单、成本低、多路输出容易实现虽然效率不如正激或LLC但辅助电源本身功率很小效率不是主要矛盾。有意思的是驱动电路部分。IGBT驱动需要稳定的正压和负压正压用来开通负压用来可靠关断防止dv/dt过高导致误开通。我在驱动板上看到了交叉耦合电荷泵电路原理的影子这个电路用在驱动IC内部通过电容的充放电产生一个负压用来给IGBT提供负压关断信号。以前很多驱动方案是用独立的负压电源现在不少集成驱动IC把负压生成集成到了芯片内部交叉耦合电荷泵就是其中一种实现方式。看到这个细节的时候我对这块驱动板的设计水平还是比较认可的说明设计者在元器件选型和成本控制上是动过脑子的。驱动电路的另一个关键是隔离。高压侧的IGBT驱动信号必须和低压侧控制信号隔离这里用的是数字隔离芯片相比光耦它的传输延迟小一致性更好适合高频应用。拆机时看到驱动板上有几颗带有加强绝缘标识的数字隔离器这个选型对电磁干扰的抑制和安全性都很重要。如果隔离芯片的爬电距离不够长期运行在高压环境下很容易出问题这一点在做模块替换或者维修选型时要特别注意。3. 控制代码拆解从启动到闭环的完整流程硬件是骨架代码才是灵魂。一块充电桩模块能不能稳定输出15kW除了功率电路本身的性能控制代码的设计水平也极其关键。这次拆解我花了很大精力去看代码逻辑虽然没有拿到全部源代码但通过固件反汇编和UART调试接口的输出基本可以还原整个控制流程。如果你要自己开发类似的数字电源模块下面的内容可以直接作为参考省去很多踩坑的时间。3.1 启动流程和“启动失败代码2”的由来模块上电之后代码的第一阶段是系统初始化包括DSP时钟配置、GPIO方向设定、ADC校准、PWM模块配置、CAN和UART初始化。这个阶段如果出错整个程序会直接卡在错误循环里对应的就是各种“启动失败代码”。我这次在用户手册上看到的“启动失败代码2”对应的含义基本上就是PFC母线电压建立失败。启动失败代码2的完整触发路径我推测是这样的系统初始化完成之后控制板首先闭合预充电继电器让母线电容通过NTC电阻充电。与此同时程序在等待母线电压上升到某个阈值比如530V。如果在规定时间内没有达到这个阈值程序就会判定PFC启动失败把状态机切换到故障态并通过CAN上报启动失败代码2。这个逻辑很符合数字电源的软启动设计每个环节都有超时判断任何一个环节没达成就退出启动流程不让功率管在不确定的状态下工作。软启动流程里还有几个容易被忽略的细节。PFC开始工作之后占空比不是一步给到位的而是从较小的值开始逐步往上爬升同时监控母线电压的上升速率。这样做的目的是限制启动瞬间的浪涌电流防止母线电容充电电流过大把整流桥和PFC电感打坏。我在代码里看到PFC占空比是按照一个斜坡函数缓慢增加的每一轮PWM中断增加一点点而不是直接给到一个固定值。类似的后级LLC的启动也是从最低频率开始让输出电压慢慢建立等输出电压稳定后再进入闭环控制。这个阶段还有个容易出问题的点是软启动参数和负载条件的匹配。如果模块接了一个已经充到很高电压的电池组启动时输出端和电池组之间的电压差就会很大充电电流会瞬间飙升。为了避免这种情况模块在启动时会先检测输出电压如果检测到输出端已经有残压就会先把输出目标设定到残压附近再逐步往上提这种逻辑叫做输出电压预同步。我在某个版本的固件里看到过相关处理非常实用。3.2 电压电流双闭环的控制代码实现充电桩模块的输出特性是恒功率曲线也就是说在低压段以最大电流输出在高压段以最大电压输出中间是恒功率区域。实现这个特性的核心就是电压电流双闭环控制这也是自动控制原理在数字电源中最经典的应用案例。控制环路的具体实现是这样的采样电路把输出电流和输出电压分别转换成0~3.3V的模拟信号送到DSP的ADC引脚。ADC采样完成后进入中断中断服务函数里计算当前的输出电压和电流再经过数字PI控制器计算PWM占空比或开关频率。电压外环的输出作为电流内环的参考值电流内环的输出再控制PWM占空比两个PI控制器串联实现输出电压和电流的精确控制。具体到代码层面一个PI控制器通常用结构体来表示内部包含比例系数、积分系数、积分累加值和输出限幅值。比例系数决定响应的快慢积分系数负责消除稳态误差积分限幅则防止积分饱和导致系统超调。我在代码里看到过类似这样的结构typedef struct { float kp; float ki; float integral; float out_max; float out_min; } PID_TypeDef; float PID_Calc(PID_TypeDef *pid, float ref, float feedback) { float error ref - feedback; pid-integral error; if (pid-integral pid-out_max) pid-integral pid-out_max; if (pid-integral pid-out_min) pid-integral pid-out_min; return pid-kp * error pid-ki * pid-integral; }上面这段代码是典型的离散化位置式PI控制虽然和实际固件里的代码不完全一致但结构是相同的。这里的积分限幅非常关键如果不做限幅负载突变的时候积分项会累加到一个很大的值恢复过程就会出现严重的超调甚至震荡。另外PI参数在工程上很少直接用理论公式算出来更多是靠经验和实验调出来的。我后面尝试用粒子群算法对PI参数做过一次离线寻优效果不错这部分我会在最后一节展开讲。双闭环的带宽设计也有讲究。电流内环带宽要高一点一般设计在开关频率的1/10左右这样电流跟随速度快动态响应好电压外环带宽要低一点一般是电流环的1/5到1/10防止两个环路互相影响发生控制震荡。这个比例关系在很多电源控制教科书里都有提到实际调试的时候也基本符合。3.3 I2C读写EEPROM与参数存储设计充电桩模块有很多参数需要保存比如输出电压上限、电流上限、通信地址、故障记录等。这些参数如果每次都靠上位机下发通信一断就丢了所以模块内部一般会有一颗EEPROM用来存参数。EEPROM通过I2C接口和DSP连接读写的代码套路其实很固定。I2C读写EEPROM的特点是一个字节一个字节地传C语言文件读写操作代码的思路在这里同样适用只不过底层操作对象从文件换成了I2C总线。每次读写都要先发送设备地址和寄存器地址然后再传数据最后还需要有应答信号。如果I2C总线有问题比如线路太长导致信号质量差或者地址配置错误读写就会失败参数无法保存。实际项目中参数存储不能只是简单地把数据写进EEPROM还需要考虑数据校验和容错。比如每个参数存储区域配置一个校验和字段通常是CRC16或者累加和读取时先算一遍校验值如果对不上就认为数据损坏回退到默认值。再比如写入EEPROM是需要时间的每个页大约5ms左右如果在写操作进行中发生掉电就可能出现半写状态所以写入策略上一般是先写备份区成功后再更新主用区防止关键参数损坏导致模块启动异常。我拆的这块模块EEPROM用的是标准的I2C接口型号尾部标着24C256也就是32KB容量。我个人很推荐在参数存储的设计中把所有参数组织成一个结构体统一打包写入这样读写函数只需要维护一份内存缓冲区和EEPROM地址映射表就行逻辑简单很多。3.4 通信协议和CAN数据上报的逻辑充电桩模块和整桩主控之间的通信几乎都走CAN总线。这块模块的通信协议我没拿到完整版本但从日志输出和报文监听来看大概能推断出它的报文结构定时周期上报电压、电流、温度、故障码等状态数据收到主控的命令报文后执行开启、关闭、设定电压电流等动作。从通信原理的角度看CAN总线的关键优势在于多主通信和差分信号抗干扰能力强传输距离远非常适合电动汽车充电这种干扰严重的工业现场。CAN报文本身的优先级由ID决定ID越小优先级越高所以模块上报状态时用的是低优先级ID而故障上报和主控命令一般会用高优先级ID确保关键信息能第一时间传递。代码层面CAN的收发通常也是基于中断实现的。接收中断里把报文解析成对应的变量比如电压设定值、电流设定值发送则一般放在主循环或定时中断里按照设定的周期把实时数据填充到发送邮箱。模块的CAN波特率我通过监听报文确认是250kbps和绝大多数充电桩主控默认配置一致。3.5 数据处理的几个实用技巧3.5 数据处理的几个实用技巧读代码的过程中我还发现了一些挺实用的数据处理技巧用在这里的采样调理和故障诊断上。比如ADC采样的原始值通常会有很大的噪声不能直接拿来闭环用需要先做滤波处理。最简单的滤波方式是中值滤波和滑动平均滤波我在代码里看到的是一个一阶低通滤波器公式就是 new_value old_value alpha * (sample - old_value)alpha取0.1到0.3之间。这个算法在很多处理器上都没有除法用移位运算就能实现非常高效。还有一处用到快速排序代码的地方是模块在做多点温度采样时对温度值进行排序然后取中位数作为保护判断的依据。温度传感器的数据容易受到偶发干扰如果直接拿最大值或最小值去做保护很容易误报警。取中位数就稳妥很多至少能扛住一个通道的异常数据。类似这种思路在工程里非常实用简单但有效。FFT在充电桩模块里也有应用场景。为了做输入电流谐波分析模块在诊断模式下会采集一段输入电流波形然后用FFT算法分解出各次谐波的幅值用来判断功率管或滤波电容是否老化。FFT原理本质上就是把时域信号变换到频域工程实现上用基2时间抽取FFT比较多代码也不复杂但要注意输入数据长度必须是2的幂次方否则会出错。4. 实测波形、故障排查与优化实践读了很多原理和代码最终还是要回到台架上去验证。我把这块模块接到了直流回馈负载上做了从空载到满载的测试也复现了几个典型故障并结合示波器波形分析了IGBT退饱和保护和一个启动失败故障的触发逻辑。这一节的内容算是整个拆解过程里最有实践价值的部分。4.1 用示波器验证ZVS和PFC波形先把示波器探头接到LLC原边MOS管的漏源电压和驱动信号上确认ZVS是否真正实现。理想情况下在MOS管驱动信号变为高电平之前漏源电压应该已经被谐振电流拉到了零波形上表现就是漏源电压先下降到零然后驱动才开始上升。实测波形和我预期的一致在额定负载下ZVS实现得很干净开通时刻的电压基本是零说明死区和谐振参数匹配得不错。轻载情况下ZVS窗口会变窄这也是LLC电路的一个特点轻载效率会有所下降。再看PFC电感的电流波形。两相交错Boost两个电感的电流波形相位差180度纹波在叠加之后被抵消掉不少输入侧总电流的纹波明显比单路小。示波器上看到的电流波形是一个三角形波包络跟随输入电压的正弦半波变化说明电流环在正常工作功率因数应该很高。理论上数据通过功率分析仪可以测到PF值大于0.99这在充电桩模块里是标准水平。FOC和占空比调节这里不多说稍微提一点LLC的闭环调节是通过改变开关频率做到的负载变化时频率会自动调整。如果负载加重频率会下降增益上升从而输出更多能量如果负载变轻频率会上升增益下降限制输出功率。这个逻辑在示波器上直接看频率变化就能验证。4.2 启动失败代码2的完整排查过程我这次复现的启动失败场景是模拟PFC母线电压没有建立起来。正常来说模块上电后母线电容要充到530V左右但我在输入端串了一个限流电阻人为降低了充电速度结果模块在设定时间内检测到母线电压没到阈值就报出了启动失败代码2直接切到了待机状态。排查的时候我按这个顺序处理先看输入电压是否正常排除电网缺相和欠压然后用万用表量PFC电感是否有断路因为电感断路会导致Boost根本建立不起电压再用示波器看PFC MOS管的驱动信号是否正常如果驱动没起来母线电压肯定上不去。最后用逻辑分析仪抓CAN总线确认识别到的是启动失败代码2而不是其他故障。整个过程走下来问题点基本能定位到单个器件或单条线路上。这个排查流程本身就是一个标准的故障处理模板碰到类似的数字电源故障都可以按“电源输入-驱动信号-反馈采样-通信上报”四个维度去排查效率会高很多。不要一上来就盲改代码先通过数据和波形确认故障源在哪里才能避免做无用功。4.3 IGBT退饱和保护原理与误动作处理IGBT退饱和保护是功率模块里非常重要的一个保护功能也是保障模块安全运行的最后一道防线。IGBT正常导通时饱和压降很低大概1.5V到2V但如果发生短路大电流会让IGBT退出饱和区进入线性区管压降会迅速升高到10V以上。退饱和保护电路做的就是检测管压降一旦发现IGBT导通期间管压降异常升高就在几微秒内把栅极电压拉低强制关断IGBT防止其被短路电流烧毁。IGBT退饱和保护原理听起来简单实际调试的时候坑很多尤其是误动作问题。我在这块模块上做短路测试时就遇到了保护误触发的情况明明是正常导通状态驱动芯片却在每个开关周期的同一位置输出故障信号。后来用示波器抓驱动波形发现是驱动芯片的消隐时间设置得太短。退饱和保护电路在检测管压降之前需要有一段消隐时间去避开开通瞬间的di/dt噪声这个时间通常设在2~5微秒如果太短就会把正常的开通噪声误判成短路导致误保护。另一个常见的误动作原因是检测电路的滤波响应太慢或者参考电压设置不合理。在维修或者做样机时如果发现IGBT老是莫名其妙保护可以先检查这两项。这项排查经验同样适用于其他品牌的充电桩模块和工业变频器因为它们的驱动电路设计思路基本都是类似的。4.4 满载老化与效率测试记录把模块接到电子负载上设置恒压500V输出从10%负载逐步加到100%负载每级停留15分钟记录输入输出功率和关键点温度。在满载15kW时输入功率大概是16.1kW效率大约93%这个数值对15kW级别的隔离型充电模块来说是正常水平。整机最高温度点出现在PFC电感上大概110℃虽然有点烫手但还在绝缘等级允许范围内。实测下来还有个小发现就是模块在30%负载附近的效率最高能达到95%左右满载反而会下降一些这主要和LLC谐振变换器的特性有关。如果你在做一个充电桩系统需要兼顾不同负载区间的综合效率建议把模块的常驻工作点设计在30%到60%负载之间这样能最大化利用模块的高效区间。4.5 用粒子群算法离线整定PI参数PI参数的整定是数字电源调试里最费时间的环节之一传统做法是手动调节靠经验和示波器波形一步步逼近。这次我尝试了一个取巧的方法在离线仿真环境里用粒子群算法去自动寻优PI参数然后把寻优结果搬到实际台架上验证。粒子群算法的思路很简单就是模拟鸟群觅食的行为每个粒子代表一组PI参数通过不断迭代更新粒子的位置和速度让目标函数逐步收敛到最小值。目标函数定义为阶跃响应的超调量、调整时间和稳态误差的加权和权重按实际工程需求调整。我设定种群数量30迭代50次几分钟就得到了一组在仿真里表现很好的参数实测在台架上也能稳定工作。当然仿真和实际存在差异仿真参数不能直接照搬但用算法找到一个比较好的初始值再在实机上进行微调整体调试时间可以从一整天缩短到一两个小时。这个方法我推荐给所有做电源控制的工程师尤其是手上没有太多调试经验的新人可以让调参与时少走很多弯路。5. 几个容易踩坑的细节最后补充几个我在拆解和测试过程中踩过的坑这些细节在规格书和原厂资料里通常不会写得那么直白但对实际开发非常关键。第一做模块替换测试时一定要确认输入电压范围和输出电容的耐压是否匹配。充电桩模块的输出电压范围通常很宽比如200V到1000V如果手头负载的耐压不足测试时很容易把负载打坏。我刚开始测试时就因为电子负载的耐压只有600V输出目标设到了800V结果把负载的输入电容给打穿了损失了一个负载通道。第二CAN通信的地电位处理。模块内部的控制地和整桩的通信地之间有时会存在电位差如果CAN总线两端没有做隔离长时间运行容易烧毁收发器。正规的模块在CAN接口处都加有隔离电源和数字隔离器但在自制测试线束时很容易忽略这一点。建议无论测试还是量产CAN接口都做隔离成本不高稳定性提升却很明显。第三注意驱动的负压关断波形。IGBT驱动负压如果幅度不够在母线电压很高的时候可能发生误导通导致上下桥臂共通。实测时可以把示波器探头直接夹在驱动电阻两端量一下开通和关断时的栅极波形。如果关断负压低于-5V基本可靠如果只有-2V就要小心了最好在驱动板电源上检查一下负压生成电路。这次拆解给我最大的感受是一块成熟的充电桩模块是硬件设计和软件设计深度耦合的产物。硬件上每一个电感、每一个电容的选型背后都有明确的电气应力计算和热设计考量软件上每一个状态机、每一个滤波参数也都是无数次调试和故障分析沉淀下来的结果。如果你准备开发或者维修类似的模块不要只盯着某一个部分而是要把功率电路、控制策略、通信协议和故障保护作为一个整体去理解和设计才能真正把问题看清楚。