尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

移相全桥DSP控制:ePWM移相实现与HVPSFB源码拆解

移相全桥DSP控制:ePWM移相实现与HVPSFB源码拆解 简介基于TI DSP2833X的移相全桥控制工程源码面向电源变换器、电机驱动等电力电子领域的开发者和学习者解决PWM移相全桥的工程实现与闭环控制问题。压缩包共45个文件、约266KB以C源文件、ASM汇编、H头文件及CCS工程配置为主同时包含编译生成的obj、out、map文件与宏定义、链接脚本等多种辅助文件便于直接导入开发环境研读、编译和验证。已有1864人学习下载。代码对应HVPSFB工程覆盖PWM模块初始化与频率/占空比/死区配置、移相波形生成、上下桥臂同步锁存、过流过压等故障检测以及基于负载反馈的动态闭环调节等完整环节汇编与C混合实现展示了DSP2833X外设编程和实时中断处理的典型方式。无论是初次接触移相全桥的工程师还是希望优化控制算法、排查软开关调试问题的开发者都能从这些代码中提取可复用的配置思路与逻辑框架。1. 移相全桥控制为什么F2802x的PWM移相需要跳出“调占空比”思维做通信电源或充电桩DCDC的工程师第一次拿到移相全桥PSFB的DSP源码时最先不适应的就是输出电压不再由PWM占空比直接决定而由原边两个桥臂之间的移相角决定。你改CMPA寄存器改得再准超前桥臂和滞后桥臂如果没有严格的相位基准整机效率、ZVS软开关和电磁干扰全部会失控。这套基于TI DSP2802x2833X系列同源的HVPSFB工程把PWM移相链路做在了ePWM模块的同步机制上主桥臂用ePWM1产生中心对齐基准滞后桥臂通过TBPHS寄存器装载移相量再叠加死区模块和故障保护最终在ISR里完成闭环。理解这套源码等于理解了数字移相全桥最核心的时序骨架。2. ePWM移相实现中心对齐基准、相位同步与死区参数配置2.1 移相量不等于占空比偏移相位基准来自时基同步移相全桥有四个开关管对角导通时能量传递到副边。超前桥臂Q1/Q2和滞后桥臂Q3/Q4之间的相位差决定了原边电压的有效占空比。这里最容易误写的地方在于你不是调整Q3的CMPA值来“减少占空比”而是让ePWM2的时基相对ePWM1整体平移一段相位。在F2802x上ePWM模块支持通过同步输入信号装载TBPHS寄存器实现两个PWM模块的相位锁定。ePWM1作为主模块在计数器归零时发出同步输出信号SYNCOePWM2作为从模块收到同步信号后把TBPHS里的值装入计数器随后与ePWM1保持固定的相位关系。这样得到的移相是周期级的精确平移不会因为中断任务抖动而漂移。中心对齐模式CTRMODE TB_COUNT_UPDOWN在这里基本是必选。中心对齐的PWM波形对称开关管应力小且原边电流纹波比边沿对齐小一个量级。代价是同一频率下计数频率翻倍等效的移相分辨率也翻倍这对DSP的ePWM时基来说是完全可以接受的。2.2 主从ePWM寄存器配置TBPHS与同步链路以下配置代码基于HVPSFB-DevInit_F2802x.c的初始化逻辑整理目标开关频率100kHzSYSCLKOUT取60MHz时基时钟30MHz// HVPSFB-DevInit_F2802x.c 中 ePWM1超前桥臂初始化 #define EPWM_CLK_DIV EPWM_CLK_DIV_1 #define EPWM_HSP_CLK_DIV EPWM_HSP_CLK_DIV_2 // 30 MHz TBCLK #define PWM_PERIOD 149 // 中心对齐时fs 30MHz / (2*(1491)) 100kHz #define DEADTIME_TICKS 8 // 250ns 死区在30MHz下的近似值 // ePWM1 作为主模块相位基准为0 EPwm1Regs.TBPRD PWM_PERIOD; EPwm1Regs.TBPHS.bit.TBPHS 0; // 主模块相位始终为0 EPwm1Regs.TBCTR 0; EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 中心对齐0 - TBPRD - 0 EPwm1Regs.TBCTL.bit.PRDLD TB_SHADOW; // 周期寄存器使用影子装载 EPwm1Regs.TBCTL.bit.SYNCOSEL TB_CTR_ZERO; // 计数器归零时输出同步信号 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 主模块不接收相位装载 EPwm1Regs.TBCTL.bit.HSPCLKDIV EPWM_HSP_CLK_DIV; EPwm1Regs.TBCTL.bit.CLKDIV EPWM_CLK_DIV; // 初始占空比50%即 CMPA TBPRD / 2 EPwm1Regs.CMPA.bit.CMPA PWM_PERIOD 1; EPwm1Regs.CMPB.bit.CMPB PWM_PERIOD 1;这段代码的关键在于SYNCOSEL选择TB_CTR_ZERO它让ePWM1在计数器每次回到零时产生同步脉冲。PHSEN设为TB_DISABLE保证主模块自身不被打扰。CMPA和CMPB先各设50%之后ISR里根据闭环计算结果改写CMPA即可改变有效占空比。从模块ePWM2的配置才体现移相核心// ePWM2滞后桥臂从模块装载TBPHS实现移相 #define PHASE_SHIFT_TICKS (PWM_PERIOD 1) // 初始180度移相 EPwm2Regs.TBPRD PWM_PERIOD; EPwm2Regs.TBPHS.bit.TBPHS PHASE_SHIFT_TICKS; // 从模块相位偏移量 EPwm2Regs.TBCTL.bit.PHSEN TB_ENABLE; // 使能相位装载 EPwm2Regs.TBCTL.bit.SYNCOSEL TB_SYNC_IN; // 同步输入来自ePWM1的SYNCO EPwm2Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; EPwm2Regs.TBCTL.bit.PRDLD TB_SHADOW; EPwm2Regs.TBCTL.bit.HSPCLKDIV EPWM_HSP_CLK_DIV; EPwm2Regs.TBCTL.bit.CLKDIV EPWM_CLK_DIV; EPwm2Regs.CMPA.bit.CMPA PWM_PERIOD 1; EPwm2Regs.CMPB.bit.CMPB PWM_PERIOD 1;PHSEN置位是移相生效的开关。TBPHS从150改为120、90时滞后桥臂整体前移移相角减小原边等效占空比变大输出功率上升。2.3 死区模块配置防止直通同时保留软开关余量全桥上下管必须存在死区。F2802x的ePWM死区模块位于比较单元和输出引脚之间可以在边沿插入纯延时也可以配合极性选择生成互补的带死区波形// 死区配置ePWM1A / ePWM1B 互补输出 EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; // 上升沿和下降沿都启用 EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HI; // ePWM1A高有效ePWM1B反相 EPwm1Regs.DBRED.bit.DBRED DEADTIME_TICKS; // 上升沿延时 8个TBCLK EPwm1Regs.DBFED.bit.DBFED DEADTIME_TICKS; // 下降沿延时 8个TBCLKDB_ACTV_HI的含义是ePWM1A输出信号高电平有效且不反相ePWM1B信号经过死区模块后输出为互补的负逻辑。上下管切换时DBRED让开启沿延后DBFED让关闭沿提前两者叠加形成一段两边都不导通的空白时间。死区过大虽然更安全但会缩小有效占空比并破坏ZVS的励磁电流条件所以死区参数要和变压器原边结电容、管子关断延时刻意匹配后面第4章单独展开。3. HVPSFB工程源码拆解ISR中VMC/PCMC控制环路与代码组织3.1 从launch文件到源文件工程结构映射这套源码的目录结构保留了CCS工程的完整形态源码包里的关键文件对应关系如下文件职责HVPSFB-Main.c主循环、模式切换、SCI指令解析HVPSFB-DevInit_F2802x.c系统时钟、GPIO、ePWM、ADC外设初始化HVPSFB-DPL-ISR.asmPWM中断服务程序补偿器与移相量计算HVPSFB-Settings.h开关频率、死区、软硬件过流阈值宏定义PWM_PSFB_VMC_SR_Cnf.c电压模式VMC与同步整流配置ADC_SOC_Cnf.cADC触发源与SOC排序配置DAC_Cnf.c内置DAC输出用于观测环路中间量SciCommsGui.cSCI串口通信配合上位机调节参数HVPSFB_VMC.launch / HVPSFB_PCMC.launchCCS调试器启动配置对应两种控制模式.launch文件直接对应两套调试入口之前有人把这两个文件当成普通配置文件删掉结果是CCS每次都得手动重建target配置。VMC和PCMC两套启动配置共享同一份源文件通过编译宏或者运行时的模式标志切换。3.2 为什么ISR放在汇编文件里HVPSFB-DPL-ISR.asm直接延续了TI数字电源库DPLib的工程风格。数字电源ISR要求确定的执行时间C编译器在流水线调度上和汇编相比存在不可控的差异。INC、MOV、MAC类指令在F2802x上有固定的执行周期TI在DPLib里把采样读取、误差计算、补偿器更新、PWM装载串联成一条流水保证中断在数微秒内完成。这套源代码保留.asm后缀并不是历史包袱而是为了让补偿器的执行周期可预测。3.3 VMC与PCMC两种控制模式的差异电压模式VMC和峰值电流模式PCMC在源码中的区别主要体现在三处补偿器输入量、PWM比较值来源、保护触发条件。// PWM_PSFB_VMC_SR_Cnf.c 中控制回路更新逻辑简化 // VMC 模式用输出误差驱动 CMPA/CMPB更新点位于 ZERO 事件 EPwm1Regs.CMPA.bit.CMPA (Uint16)(PWM_PERIOD * dutyVmc); EPwm2Regs.CMPA.bit.CMPA (Uint16)(PWM_PERIOD * dutyVmc); // PCMC 模式电流比较器直接控制占空比ISR 内只做相位微调 // 电流采样信号送入比较子模块CMPA 由比较器值决定VMC下环路计算出的dutyVmc直接映射到两路CMPA移相角由闭环输出和限幅逻辑一起决定。PCMC下原边峰值电流通过比较器即时终止当前开关周期DSP的ISR只负责在周期开始时装载峰值电流参考值。PCMC的原边电流动态响应明显更快但对电流采样噪声敏感绕组不对称时容易产生占空比抖动。3.4 ISR到移相角度的映射关系在DPL-ISR中补偿器输出的DutyCmd最终要换算为TBPHS装载值。中心对齐模式下的相位分辨率是半个时基周期映射关系为// HVPSFB-DPL-ISR.asm 后半段逻辑的C语言还原 #define MAX_PHASE_TICKS PWM_PERIOD phase_target (Uint16)(DutyCmd * MAX_PHASE_TICKS 0.5f); EPwm2Regs.TBPHS.bit.TBPHS phase_target; EPwm1Regs.ETCLR.bit.INT 1; // 清除ePWM1中断标志DutyCmd的取值范围在0到1之间。当DutyCmd为0时TBPHS为0两桥臂同相同步原边电压为零当DutyCmd为1时TBPHS为149相当于180度移相原边获得最大伏秒积。这个映射改起来很容易出错的是不能用PWM_PERIOD 1作为上限那是占空比50%的移相不是180度。4. 移相全桥参数整定死区、ZVS与TZ故障保护4.1 死区参数计算从物理条件推导寄存器值死区时间要覆盖三个部分开关管关断延时td(off)、驱动芯片传输延时、以及开关管输出电容充放电时间。公式近似为#define VIN_MAX 400.0f // 最大输入电压 #define Q_out_nC 62.0f // MOSFET 输出电荷单位 nC #define I_off_A 8.0f // 关断时刻原边电流 // 死区时间下限 td_off td_driver (Q_out / I_off) #define DEADTIME_NS (120.0f 60.0f (Q_out_nC / I_off_A) * 1000.0f)以Q_out 62nC、关断电流8A计算第三项约7.75ns算上前级延时约190ns。实际工程我一般取250ns把Gate驱动芯片的离散性覆盖掉。但死区取到400ns以上时滞后桥臂的ZVS窗口会明显缩短轻载效率曲线会掉。FPGA或CPLD方案里死区要单独做逻辑而在DSP上直接改DBRED/DBFED寄存器即可方便做温度补偿。4.2 故障保护ePWM的TZ联动而不是软件关断过流保护只靠ISR里比较ADC值再关PWM是不可靠的ADC采样有延迟软件分支也有不确定性。F2802x的TZTrip-Zone模块可以做到硬件级封锁配置过一次之后即使CPU跑飞PWM引脚电平也会被强制拉死// 过流信号接入 TZ1 引脚低电平触发保护 EPwm1Regs.TZSEL.bit.OSHT1 1; // TZ1 作为 one-shot 触发源 EPwm1Regs.TZSEL.bit.OSHT2 1; // TZ2 同时接入冗余保护 EPwm1Regs.TZCTL.bit.TZA TZ_FORCE_LO; // ePWM1A 强制为低 EPwm1Regs.TZCTL.bit.TZB TZ_FORCE_LO; // ePWM1B 强制为低 EPwm1Regs.TZEINT.bit.OST 1; // 触发后保持封锁直到手动清除TZ_FORCE_LO把对应PWM引脚拉到安全电平比用软件置位GPIO的方式快得多。故障恢复时需要把TZCLR里的OST位置1并等一个完整的开关周期再重新装载PWM。这个流程在TI的DSP2833X系列中间接演化而来源码里把过压、欠压、过流分别映射到TZ1/TZ2是值得沿用的配置。4.3 闭环动态下的限幅顺序移相角的限幅不能只在最后输出TBPHS时做要在补偿器输出端限幅。ISR里执行顺序应该是err vout_ref - vout; duty_raw DPL_Compensate(err); // 补偿器输出 duty_lim CLAMPL(duty_raw, 0.02f, 0.95f); // 先限制占空比斜率 phase_out (Uint16)(duty_lim * MAX_PHASE_TICKS); EPwm2Regs.TBPHS.bit.TBPHS phase_out;占空比下限取2%是为了让原边有足够的励磁电流维持ZVS过渡如果直接限到零轻载时会听到变压器间歇啸叫。上限95%则给死区留出完整时间避免有效占空比把死区吃掉。5. 波形验证与CCS调试用eCAP和逻辑分析仪校准移相角5.1 用HVPSFB_VMC.launch进入调试并观察关键变量双击HVPSFB_VMC.launch会直接启动CCS调试会话加载Project_Name.out。连接目标板后在Expression窗口添加EPwm1Regs.TBCTR、EPwm2Regs.TBCTR、TBPHS和phase_target。两个TBCTR的时间差除以TBCLK周期就是实时移相角。如果phase_target在变但TBCTR没有跟住检查EPwm2Regs.TBCTL的PHSEN是否被误清掉。在VMC调试图里把运行模式切到PCMC时需要重新加载HVPSFB_PCMC.launch同时给PWM_PSFB_VMC_SR_Cnf.c中的模式标志重新赋值。launch文件的区别在于初始化脚本和断点预设不同直接用错launch有时候会出现变量无法读取的情况。5.2 用eCAP模块自测PWM移相时序没有示波器时F2802x的eCAP模块可以当简易PWM测量仪用。把ePWM2A映射到eCAP1输入引脚配置上升沿捕获两次的差值// eCAP1 配置为测量 ePWM2A 的周期 ECap1Regs.ECCTL1.bit.CAP1POL EC_RISING; ECap1Regs.ECCTL1.bit.CAP2POL EC_RISING; ECap1Regs.ECCTL1.bit.CAPLDEN EC_ENABLE; ECap1Regs.ECCTL2.bit.TSCTRSTOP EC_RUN; ECap1Regs.ECCTL2.bit.SYNCI_EN EC_DISABLE;连续读取两次捕获值后差值等于一个PWM周期对应的计数长度。再对ePWM1A重复一次测量两个上升沿的差值减去一个整周期就能反推移相角。这个数字量直接和TBPHS寄存器里的值做比对误差要小于2个TBCLK如果偏大会偏了说明该看高边驱动供电了。5.3 四通道观察时的判据逻辑分析仪四通道分别接ePWM1A、ePWM1B、ePWM2A、ePWM2B重点确认三件事同桥臂两个通道之间的死区时间要有明显的低电平间隔ePWM1A和ePWM2A的上升沿间隔对应目标移相角开关周期稳定没有抖动。这里最容易出现的问题是示波器探头地线夹不同步导致两个通道看起来有几十纳秒的相位差实际是测量回路引入的误动。把四个地线夹全部接到功率地母排的同一个点上再测。死区判断上轻载时原边电流过零附近可能会有震荡毛刺那是副边同步整流体二极管反向恢复造成的和死区配置无关。本文还有配套的精品资源点击获取
返回列表