ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PSOC CLB-MACO实现LLC软启动硬件实时轨迹,压住谐振电流尖峰

PSOC CLB-MACO实现LLC软启动硬件实时轨迹,压住谐振电流尖峰 做LLC电源这几年最让人头大的一个场景就是上电瞬间软启动还没走完谐振电流先冲出一个比满载还高的尖峰然后OCP保护动作电源直接打嗝。要压住这个谐振电流峰值以前靠调软启动曲线、试参数后来我把PSOC里的CLB-MACO用起来把软启动从“软件逐点设置”变成了“硬件实时轨迹”效果完全不一样。这篇blog就聊聊这个思路怎么落地LLC启动电流尖峰到底怎么来的、传统方案为什么压不住、CLB和MACO各自干什么活以及参数怎么定、代码怎么写、调试时要注意什么。适合正在折腾数字电源、服务器电源或者充电模块的工程师也适合对LLC软启动过流头疼但还没来得及深究的朋友。1. 先把敌人看清LLC启动电流尖峰从哪来1.1 半桥中点那个阶跃才是尖峰的真源头很多朋友以为LLC启动尖峰是因为“频率还没扫下来”只要启动频率足够高、增益足够低电流就不会大。这个说法只对了一半。启动频率高确实能压低稳态增益让输出电压慢慢爬但启动瞬间谐振电流的第一波冲击本质上跟频率关系不大而是跟半桥中点电压的阶跃有关。拿半桥LLC举例上电前半桥中点S点是0V谐振电容Cr上也是0V。第一个驱动脉冲到来时上管导通S点从0V跳到Vin/2母线400V就是200V。这个200V的阶跃直接加到Lr和Cr串联组成的谐振网络上产生一个典型的LC阶跃响应——电流瞬间冲上去第一个峰值的大小最理想的情况下大约是I_peak ≈ (Vin/2) / Zn其中Zn是谐振网络的特征阻抗Zn sqrt(Lr / Cr)这个公式很关键它说明峰值电流由母线电压和特征阻抗决定跟开关频率没有直接关系。我手头一台半桥样机Lr22uHCr66nFZn sqrt(22e-6 / 66e-9) ≈ 18.3Ω母线400V理论峰值就有 200/18.3 ≈ 10.9A。再加励磁电流、寄生参数和阻尼偏差实测冲到13~15A很常见。如果这台电源满载设计只有10A启动瞬间就是150%过流OCP不跳才怪。所以第一个要建立的观念是启动尖峰在第一个开关周期就已经决定了后面所有扫频动作都是在补救不是在预防。真正能管住这个尖峰的只有两条路——降低第一个脉宽注入的能量或者给谐振网络一个更平缓的激励建立过程。1.2 尖峰不管的连锁反应从OCP误触发到炸管启动电流尖峰看着只是波形上“duang”一下实际危害比示波器画面上严重得多。首先是过流保护误动作。数字电源的OCP比较器一般盯着谐振电流或者原边电流阈值按稳态满载的1.2~1.5倍设置。启动尖峰一不小心就超过这个值电源进入打嗝保护软启动永远走不完表现出来就是“上电后输出电压起不来或者反复重启”。其次是功率器件的应力。IGBT或者CoolMOS的峰值电流能力虽然有余量但尖峰叠加高压时关断瞬间的应力会明显上升。我见过一次炸管事故事后分析就是启动尖峰太大、关断电流超SOA安全工作区管子直接击穿。这不是危言耸听LLC启动炸管在行业内不算罕见。还有磁芯饱和问题。谐振电流尖峰大意味着励磁电流和原边电流都短时间冲高如果此时变压器磁通还没建立好或者磁芯磁通摆幅因为瞬态偏置而超出设计轻则异响、重则饱和电感量瞬间掉下来电流更失控。你可以把这个过程理解成家里的水管突然打开阀门水流先是“咚”地一下冲出来然后才慢慢稳定。启动尖峰就是电源里的“水锤效应”软启动的目的就是让这个阀门开得慢一点、稳一点而不是让水龙头一开始就全开。2. 传统软启动为什么压不住这个尖峰2.1 固定曲线方案好用但不跟手传统模拟软启动芯片或者很多PWM控制器自带的软启动引脚本质上是给一个电容充电用电容电压去微调频率或者占空比。好处是电路简单、不用写代码、上电就能跑。坏处也很明显曲线是固定的没办法随输入电压、负载状态、温度自适应。同一个LLC220V输入和90V输入时母线电压差一倍启动尖峰也差一倍。固定曲线只能按最恶劣工况来调留很大裕量结果就是正常工况下软启动拖得很慢启动时间长得让人着急。还有些场合需要在启动过程中动态切换频率步进或者跟后级负载通信联动模拟方案完全做不到。更麻烦的是模拟软启动没法处理“启动过程中谐振电容预充电”这类精细问题。LLC上电前谐振电容电压是零半桥中点一跳变就是阶跃冲击。数字方案可以在第一个脉冲之前先给Cr预充电或者用脉宽限幅器把第一个脉宽压到极小模拟方案只能靠外接电容的RC常数瞎蒙。2.2 纯软件查表方案三个绕不开的天花板后来大家转向数字控制用MCU/DSP做软启动最常见的办法是查表把一条频率随时间变化的曲线存在Flash里启动时每隔一个固定间隔刷新一次PWM周期寄存器。这个方案能做但实际用起来有三个天花板。第一是粒度问题。查表本质上是离散逼近表越密越接近理想曲线但Flash空间和刷新间隔有限。步进大了每次跳频都是一次扰动电流波形能看到明显的阶梯步进小了启动时间拉长CPU还得频繁进中断。第二是时序实时性。MCU主循环和中断被环路控制、通信、保护逻辑挤占软启动刷新能不能严格按1ms或者100us间隔执行完全取决于系统实时性。我见过有工程师把软启动放到定时中断里结果中断里还有其他任务实际刷新间隔抖动个30%谐振电流峰值也跟着抖——这种问题最难查波形上看就是“时好时坏”。第三是第一周期的无力。就算查表频率曲线再完美第一个脉冲到来时MCU还在初始化、ADC还没稳定根本来不及对第一个脉宽做限制。只要第一个驱动脉冲宽度是全脉宽尖峰就压不住。那FPGA呢FPGA做这种活当然没问题时序精度极高但成本、PCB面积、开发难度都不是普通电源项目愿意承受的。PSOC这种带可编程逻辑的MCU恰好卡在中间——有硬件逻辑的实时性又不牺牲MCU的灵活性和开发效率。3. PSOC CLB-MACO怎么把软启动变成“硬件实时轨迹”3.1 CLB贴着PWM模块做时序操作的硬件逻辑PSOC里有个外设叫CLBConfigurable Logic Block可配置逻辑块本质是一小撮可编程硬件逻辑可以把它理解成“嵌在MCU里的迷你FPGA”。它能跟芯片里的TCPWM定时/计数/PWM模块直接互联输入接PWM信号输出又能反过来控制PWM。LLC软启动正好需要这种能力。第一个脉宽怎么限制正常半桥LLC的PWM占空比是接近50%的如果能让CLB在启动初期对PWM输出做一次“裁剪”把脉宽从极小值逐步展开就能从物理上掐断第一个脉冲的能量注入。这种裁剪动作必须在纳秒级别完成而且不能依赖CPU中断——刚好CLB的硬件逻辑就是干这个的。再比如周期寄存器的载入。PWM频率要动态调整时如果CPU随手写周期寄存器可能在一个周期中间写入导致这个周期长度异常波形出现毛刺。CLB可以设计成在PWM周期边界处同步载入新值相当于给寄存器更新加了一个“对齐门闩”。这个细节对于软启动轨迹的平滑性非常重要。不同系列PSOC对CLB的命名和资源略有差别有的叫CLB有的叫UDB但思路一致把需要逐周期处理的时序逻辑从CPU手里拿走交给硬件。3.2 MACO为软启动曲线计算准备的数学引擎MACOMath Coprocessor数学协处理器是PSOC里面的硬件数学加速单元专门干CPU不擅长的事——除法、开方、三角函数、指数这些计算。LLC软启动里的指数扫频曲线靠CPU的软件库算一次除法加一次exp可能要几微秒甚至几十微秒用MACO硬件算是纳秒到微秒级别的。功耗还低很多。别小看这点性能差距。软启动频率更新频率如果是每100us一次一次计算差几十微秒直接吃掉一半时间预算如果CPU还在跑电压环路、通信协议根本忙不过来。把数学运算卸载给MACOCPU只负责状态机流转和结果搬运整个系统就从容了。MACO计算的另一个价值是“实时自适应”而不是查表。查表只能选择预先画好的曲线MACO可以根据实时输入电压、温度、负载状态在线算出一条新的软启动轨迹参数。这就把固定曲线方案的死板和纯软件方案的延迟问题一起解决掉了。3.3 频率、占空比、OCP阈值三条轨迹怎么联动我这几年做软启动的经验是只压频率轨迹效果有限三条轨迹联动效果才是质变。频率轨迹从1.5~2倍谐振频率往工作频率方向扫决定增益爬升速度。占空比限制轨迹从极窄脉宽逐步展开到50%带死区决定单位周期注入的能量上限。OCP阈值轨迹启动初期放宽、接近稳态时收紧防止保护误动作同时保留真正的过流保护能力。这三条轨迹是同步变化的。MACO输出的是同一套“曲线参数”CLB拿这些参数分别作用到PWM频率寄存器、PWM比较值、OCP比较器阈值。CPU只在启动开始时给一个“go”信号然后定期读一下状态其余时间基本放手。用生活类比来说CPU是船长决定航线和目的地MACO是领航员负责实时计算和修正航向CLB是舵机以最快速度执行每一次微调。船长不需要自己亲手打舵才能真正腾出手来处理风浪。4. 软启动参数设计起始频率、扫频曲线和脉宽限制怎么定4.1 起始频率和目标频率先定边界再谈曲线设计软启动第一步不是写代码而是定参数边界。LLC工作频率范围一般由谐振频率fr和最低工作频率决定软启动则要在这个范围之外再往上拉一截。我的经验是起始频率取1.5~2倍的fr。太高了虽然增益更低但死区时间内谐振电流过零困难可能丢ZVS太低了靠近容性区边界启动过程一旦有扰动就可能进入ZCS零电流开关失效区电流波形会很难看。以fr100kHz为例起始频率大概取150kHz~200kHz。工作频率也就是软启动要扫到的目标一般取额定工作点频率比如轻载或额定负载对应的110kHz。注意这里有一个常见坑如果把目标定在fr上启动完成后负载一重频率还要往下降等于软启动结束之后还有一次“二次爬坡”电流可能再起一个浪头。所以我的习惯是软启动目标频率定在额定满载工作频率附近让闭环从那里接着走而不是停在fr。扫频时长方面典型值在10ms~50ms之间。太短输出电压冲击大负载侧可能过压太长满载启动时用户等得不耐烦也有可能出现励磁电流异常。具体怎么取要配合脉宽限制一起看下面的公式会给一个判断依据。4.2 指数扫频曲线与脉宽限幅的配合关系扫频曲线我强烈建议用指数曲线而不是直线。原因是LLC的增益-频率曲线本来就是非线性的启动高频段增益变化慢接近谐振点时增益变化陡。如果频率线性下降接近工作点时增益会猛增电流自然跟着猛冲指数下降可以让频率在低增益区走得快一点在高增益区走得慢一点让输出电压爬升速率更均匀。指数扫频的形式是f(t) f_start (f_end - f_start) × (1 - e^(-t/τ))这里的τ是时间常数决定了曲线“拐弯”的快慢。实际操作中MACO硬件算指数很轻松实时改τ也很方便。我一般取τ T_ss / 4让曲线在前1/4段时间内完成大部分频率变化后3/4段时间慢慢逼近目标。脉宽限制轨迹跟频率轨迹必须联动不能各走各的。启动最开始第一个脉宽我建议从5%~10%开始。注意这里说的是占空比不是死区——半桥的正常占空比接近50%启动初期只有这个值的五分之一甚至更小。这直接决定了第一个周期注入谐振网络的能量上限是压尖峰的第一道闸。脉宽展开曲线用线性或者S型都可以我习惯跟频率同步走频率在高速段时脉宽也小频率进入慢速逼近段后脉宽逐步放开到正常值。因为高频段本身增益低脉宽小一点不影响输出建立等频率接近工作点了再把脉宽交还给正常控制这样整个启动过程电压、电流都平滑。4.3 频率步进、扫频时间与电流变化率的换算另一个很多人忽略的参数是频率步进。不是曲线画出来就行步进太大依然会在谐振电流上留下台阶。工程经验是每个扫频周期比如100us更新一次的频率变化量不超过当前频率的0.5%~1%。以100kHz起始、每100us更新一次、50ms扫完为例平均步进大约是(200k - 110k) / 500 180Hz/步相对200kHz启动点的变化率是0.09%这个量级很安全。如果扫频时间压缩到10ms同样500步步进就是1800Hz/步相对变化率接近1%了实测中电流波形就会出现可见的折线。估算电流变化率还有一个实用公式ΔI_Cr ≈ C_r × dV_Cr/dt如果谐振电容Cr66nF频率步进太大导致Cr电压每步跳变20V那么电流跳变量就是66e-9 × 20 / 100e-6 13.2A——这就很夸张。所以频率步进必须跟Cr电压变化率一起审视光盯着频率数字没意义。下面把参数调整方向整理成一张表方便做调试参考参数调大影响调小影响我的建议起始频率增益更低但可能失去ZVS靠近容性区启动易振荡1.5~2倍fr扫频时间启动慢输出冲击小启动快电流台阶大10~50msτ时间常数曲线变缓前期走得快曲线变陡前期慢后期快τ扫频时间/4频率步进电流台阶明显占用时间长CPU负担大每步≤0.5%当前频率起始脉宽第一周期能量大尖峰高电压建立过慢可能启动失败5%~10%占空比OCP阈值轨迹保护太松风险大启动未结束就误触发随脉宽展开同步收紧5. 实操落地在PSoC上一步步搭出来5.1 外设规划把每项工作分给最适合的模块纸上谈兵讲完说说怎么在PSOC里落地。我这里以带CLB和MACO的PSoC系列为参考不同型号引脚和寄存器名有差异但外设分工思路通用。TCPWM输出互补PWM带死区驱动半桥上下管。启动期间频率和比较值会被CLB持续刷新。CLB接TCPWM的PWM输出和周期信号实现脉宽限幅、周期边界同步载入、启动标志逻辑。MACO算指数扫频曲线、算OCP阈值曲线、算脉宽限制曲线把结果写到CLB的寄存器或者影子寄存器。ADC采样母线电压、输出电压、谐振电流提供给MACO做自适应修正。CPU跑软启动状态机负责初始化外设、启动时给go信号、结束后切换闭环。建议先把外设中断分配好。软启动期间不要让CPU做高优先级之外的活ADC转换结果可以直接通过DMA搬运到内存MACO算完通过事件触发一遍CPU读取不要用CPU主动polling等MACO结果否则实时性又回到软件方案的水平了。5.2 CLB内部逻辑要点与关键代码示意CLB的设计方式通常是在芯片配置工具里用原理图或者逻辑描述完成具体语法随平台走但核心逻辑可以用一段概念代码表示。这一段不是能直接编译烧录的完整例程重点看思路// 概念性描述CLB对PWM周期寄存器做同步载入 脉宽限幅 // 具体实现需按平台CLB资源调整 module softstart_clb ( input wire pwm_cycle_done, // TCPWM的周期结束信号 input wire clk, input wire [15:0] maco_target_period, input wire [15:0] maco_limit_duty, input wire start_en, output reg pwm_period_write_en, output reg pwm_duty_force_en ); // 只在PWM周期边界执行寄存器载入避免周期中间写导致的毛刺 always (posedge clk) begin if (start_en pwm_cycle_done) begin pwm_period_write_en 1b1; // 脉冲向TCPWM周期寄存器发出载入请求 pwm_duty_force_en 1b1; // 脉冲使能脉宽限幅比较逻辑 end else begin pwm_period_write_en 1b0; pwm_duty_force_en 1b0; end end endmoduleCLB里还有一块逻辑专门做脉宽限幅比较PWM输出高电平时间和maco_limit_duty对应的数值一旦达到限制值就强制拉低PWM输出。这个动作在每个开关周期都执行完全硬件实时CPU不参与。实测下来这个逻辑只要写对了第一个脉冲的宽度就能被精确限制在设定值不会出现“软件还没跑起来、PWM已经全宽输出”的尴尬。有一点要特别提醒CLB内部逻辑的时序收敛一定要在配置阶段跑一遍静态时序分析。不同PSOC型号的CLB资源有限逻辑级数稍深就可能出现毛刺或时序违例。我有一次把限幅比较逻辑写得复杂了CLB输出在高速PWM下出现偶发毛刺导致一个周期突然全宽导通尖峰又回来了。后来简化逻辑、用两级触发器打拍才解决。5.3 软启动状态机CPU、MACO、CLB怎么协作软件侧的状态机我习惯分成四个阶段每个阶段对应一组不同的MACO计算输入和CLB使能信号/* 软启动状态机代码为思路示例 */ typedef enum { SS_PRECHARGE, // 谐振电容预充电等待 SS_SCAN_FREQ, // 频率扫掠 脉宽限幅 SS_TRANSFER, // 闭环切入过渡 SS_RUN // 正常运行 } ss_state_t; void softstart_tick(ss_state_t state, uint32_t t_ms) { switch (state) { case SS_PRECHARGE: // 等待CLB把谐振电容预充到目标电位期间PWM保持关闭 CLB_start_prc(); if (ADC_vout() TH_VOUT_PRE) state SS_SCAN_FREQ; break; case SS_SCAN_FREQ: // 调用MACO计算指数扫频频率和脉宽限制值 maco_start(MACO_EXP_SCAN, t_ms); maco_wait_done(); CLB_write_period(maco_get_period()); CLB_write_duty_limit(maco_get_duty()); OCP_set_threshold(maco_get_ocp_thd()); // 同步调整OCP阈值 if (t_ms SS_TOTAL_MS) state SS_TRANSFER; break; case SS_TRANSFER: // 打开闭环软启动频率轨迹交给环路 voltage_loop_enable(1); CLB_bypass(); state SS_RUN; break; default: break; } }这段代码的要点是CPU只发起运算和搬运结果每条轨迹的生效由CLB在周期边界硬件执行。MACO_wait_done()在工程上我一般做成超时保护万一MACO异常卡住不能堵死状态机。另外状态机的阶段判断不能只看时间最好加上电压和电流条件。比如SS_SCAN_FREQ阶段如果输出电压已经达到目标值的90%就可以提前切到SS_TRANSFER反过来如果到时间了但输出电压还低说明启动可能被负载拖住需要报错而不是硬切闭环。这种“时间状态”双条件的判断在数字电源里非常实用。6. 实测与排查那些波形图不会告诉你的细节6.1 实测下来的典型差异有轨迹限制和没轨迹限制我拿那台半桥LLC样机对比过三组设置纯频率扫掠、频率脉宽限制、频率脉宽限制OCP阈值轨迹联动。第一组纯频率扫掠启动瞬间谐振电流照样冲到14A跟没做软启动基本一样因为第一个全宽脉冲无法避免。第二组加了脉宽限制第一个脉冲宽度限制到10%谐振电流峰值立刻降到7A以下但OCP阈值如果还是按1.2倍满载设置启动中后段电流爬升时依然会误触发。第三组把OCP阈值也做成随时间收紧的轨迹整段启动电流波形平缓峰值控制在8A以内启动时间大约28ms输出电压单调上升无过冲。这组对比让我彻底认同一个观点软启动不是一条曲线的事是三条曲线互相配合的事。只调频率永远在跟尖峰“捉迷藏”。6.2 启动过程常见问题排查速查表调试中踩过的坑比设计时想到的问题多得多这里整理一份速查表现象可能的根因排查方向第一个脉冲就有大尖峰脉宽限幅逻辑未生效或CLB未同步对齐抓第一个周期Vgs确认PWM宽度是否等于设定值启动中段电流台阶明显频率步进过大减小每周期频率变化量或增大扫频时间高频段丢ZVS波形振荡起始频率太高死区时间与谐振周期不匹配适当降低起始频率或调整死区时间接近工作频率时电流又冲高指数曲线τ太小频率逼近过快增大τ让曲线“软着陆”到目标频率PWM输出偶发毛刺CLB逻辑时序违例或未打拍同步简化CLB逻辑在输入输出加两级触发器软启动正常但OCP误触发OCP阈值轨迹落后于电流轨迹让OCP阈值曲线与脉宽展开曲线同步仿真验证启动时间到但电压没起来起始脉宽限制太低输出建立过慢适当提高起始脉宽到10%~15%观察电流启动完成后闭环切入波形塌陷SS_TRANSFER切换时频率跳变闭环尚未接管切换前让软启动频率接近闭环目标或增加过渡段排查软启动问题我的经验是先抓波形不要上来就改代码。示波器至少抓三路谐振电流、半桥中点电压、PWM驱动波形。谐振电流看尖峰形态半桥中点看是否丢ZVSPWM驱动看实际脉宽——很多问题一眼就能定位根本不用猜。6.3 两个我一直在用的调试习惯最后分享两个我自己长期保留的调试习惯都是在现场踩坑踩出来的。第一个习惯是上电调试时把示波器触发设到第二个开关周期第一个周期单独抓一次。原因很简单启动第一个周期的行为往往决定了整个启动过程的成败但默认触发方式很容易把这一帧漏掉。先确认第一个脉宽被正确限制住再谈后面的曲线优化。如果第一个周期就是全宽脉冲后面所有努力都白搭。第二个习惯是给软启动状态机加“慢动作模式”。调试阶段把时间轴拉长10倍——原来20ms的扫频变成200ms原来1ms的步进间隔变成10ms。这样每条轨迹的变化都能在示波器上看得清清楚楚频率步进、脉宽展开、OCP阈值收紧的配合关系一目了然。调好了再把时间参数恢复到正常值。这个习惯帮我省掉了大量“玄学”排查时间很多问题在慢动作模式下会自己现出原形。个人体会是PSOC这套CLB-MACO方案真正解决的不是算得快而是把软启动从“软件尽力而为”变成了“硬件说到做到”。频率刷新、脉宽限制、阈值收紧这些动作都发生在硬件层面CPU反而解脱出来干它该干的活——判断状态、处理异常、跟外部通信。这种分工方式比单纯堆算力要健康得多。等回头看波形上那个曾经让你失眠的尖峰安安静静地平躺在一个可控的高度上你会觉得这一个下午没有白费。
返回列表