ARTICLE DETAIL

资讯详情

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

DAB变换器DSP28335移相PWM控制:从移相角到寄存器全解析

DAB变换器DSP28335移相PWM控制:从移相角到寄存器全解析 简介基于DSP28335的DAB变换器控制程序源码包面向数字音频广播DAB系统开发初学者及嵌入式信号处理工程师提供从信号解码、FFT处理到DAC输出控制的完整实现参考。压缩包内共414个文件约487KB以24个C源文件与39个头文件为核心配合261个批处理脚本及汇编启动文件、CCS工程配置文件涵盖DSP2833x标准外设库与DAB专用控制逻辑批处理脚本覆盖工程构建、烧写与备份流程便于在CCS环境中直接编译调试。已有496人学习下载。程序按功能拆分为信号接收解码、数字信号处理、数模转换和系统控制等模块并包含中断管理、内存复制及ADC校准等底层例程注释清晰、模块划分明确。初学者可借此理解DAB链路中DSP浮点运算与实时控制的配合方式掌握从外设初始化到算法落地的完整流程开发者也能基于现有代码快速移植到自研硬件平台显著缩短项目开发周期。1. DAB变换器遇上DSP28335一套从移相角到PWM寄存器的完整链路打开 MSSPS.zip里面是 DAB 控制器的 DSP28335 工程包这个场景对做过电力电子的人一点都不陌生DAB 变换器的硬件已经调通仿真也验证过波形但烧进 DSP28335 的程序要么不敢改要么改了之后功率管直接炸。DAB双有源桥拓扑不复杂两套 H 桥中间夹一个高频变压器控制本质是原副边桥之间移相角的事。麻烦在于DSP28335 上产生移相 PWM 不只是一个寄存器的事它牵扯到 ePWM 主从同步、死区配置、ADC 采样时序、中断服务程序里的 PID 计算还有启动时的软启动逻辑。这篇文章把这条链路完整拆开讲先立住移相控制的数学关系再落到可抄的寄存器代码接着是电压环闭环和软启动实现最后是调试阶段三板斧。适合手上有类似工程包但还没完全吃透的工程师也适合准备在 28335 上从零写 DAB 控制的人。2. DAB变换器移相控制的数学关系与DSP28335外设映射2.1 双有源桥的功率传输公式与移相角占空比DAB 的原边 H 桥把直流电压 V1 逆变成方波经过高频变压器隔离副边 H 桥再把方波整流成直流 V2。原边桥输出电压为 Vp副边桥输出电压折算到原边为 nVs两个方波之间的相位差就是移相角 δ。副边桥相对原边滞后 δ两侧方波通过变压器漏感或外加串联电感传递能量。单移相控制SPS下传输功率的表达式是P nV1V2 / (2πfsL) × δ × (1 - δ/π)这个公式在几乎所有 DAB 相关文档里都会出现真正用的时候把它换成移相占空比 D 更直观。令 D δ/π则P nV1V2 / (2fsL) × D × (1 - D)D 的取值范围是 0 到 1。D 0.5 时传输功率最大但此时回流功率也最大效率并不是最高D 在 0.2 到 0.4 之间时效率通常更好。闭环控制的任务就是根据输出电压误差去调整 D本质上是调整两个 H 桥之间的相位关系。对于标题里这类单极交错并联隔离型 DAB 式 AC/DC 变换器前级交流整流成直流母线后级 DAB 做隔离和调压控制量同样是移相角跑控制的芯片也还是一颗 DSP28335。2.2 DSP28335上承载DAB控制需要的外设资源DSP28335 主频 150MHz带硬件浮点单元这是它至今还在电力电子控制器里大量出现的原因——PID、坐标变换、移相角换算都可以直接用 float 算不需要像 C28x 定点芯片那样做 IQmath 定标。DAB 控制里用到的外设并不多但每个都要配置到位。外设承载功能关键寄存器ePWM1主模块H桥1方波输出产生同步信号TBCTL、TBPRD、CMPA、AQCTLAePWM2从模块H桥2方波输出执行移相TBPHS、TBCTL.PHSEN、CMPADBCTL/DBRED/DBFED同一桥臂互补PWM死区DBCTL.OUT_MODE、POLSELADCINA0/A1输出电压反馈、输入电流保护ADCCHSELSEQ1、ADCRESULT0/1EPWM1_INT10kHz控制中断跑PID和移相更新ETSEL、ETCLR、PIEIER3DAB 两个 H 桥共有 8 个开关管但用 ePWM1A/1B 和 ePWM2A/2B 四路带死区的互补 PWM 就能驱动——每个桥的上下管互补对角管同时导通。ePWM1 工作在向上计数模式计数器归零时产生同步信号给 ePWM2ePWM2 的 TBPHS 寄存器里预先装载移相值收到同步信号后从该值开始计数两路方波之间就有了精确的相位差。移相角的分辨率由 TBCLK 决定150MHz 计数频率下100kHz 开关周期对应 1500 个计数值移相角分辨率接近 0.24 度对功率控制足够了。2.3 工程包里的典型文件结构与初始化顺序MSSPS.zip 这类交付包解压后常见的目录结构是 TI 官方 DSP2833x 库加应用层 C 文件。第一步不是打开 main.c而是确认 DSP2833x_common 和 DSP2833x_headers 两个目录是否完整。缺了这两个目录编译会报几百个 undefined symbol因为 28335 的寄存器结构体定义全在 GlobalVariableDefs.c 里。目录或文件作用使用注意28335_RAM_lnk.cmd链接脚本程序在RAM中运行调试用掉电丢失适合单步F28335_FLASH_lnk.cmd链接脚本程序烧写到Flash量产用需复制RAM函数段DSP2833x_GlobalVariableDefs.c外设寄存器结构体定义不能删删了所有寄存器访问报错main.c主流程初始化顺序和主循环先看这个文件的初始化顺序DAB_Control.c应用层移相、PID、软启动改控制逻辑主要改这个文件初始化顺序有固定套路DINT 关中断 → InitSysCtrl 配置系统时钟和看门狗 → InitGpio 配置 PWM 引脚复用 → InitPieCtrl 和 InitPieVectTable 初始化中断向量表 → 挂接中断服务函数 → 初始化 ePWM 和 ADC → 使能中断。如果看到 GPIO 初始化放在 InitSysCtrl 之前外设时钟还没打开GPIO 复用配置会静默失败PWM 引脚输出不了波形这种问题排查起来很隐蔽。3. DSP28335产生DAB移相PWM的关键寄存器配置3.1 ePWM1/ePWM2的初始化与死区配置代码ePWM1 作为主模块产生 H 桥1的方波同时在每个周期归零时输出同步信号。ePWM2 作为从模块收到同步信号后装载 TBPHS产生滞后指定角度的方波。以下代码可以直接抄进工程TBPRD1499 对应 100kHz 开关频率。// ePWM1 主模块H桥1的 PWM1A/PWM1B 互补输出 void InitEPwm1(void) { EPwm1Regs.TBSTS.all 0; EPwm1Regs.TBPHS.half.TBPHS 0; // 主模块相位归零 EPwm1Regs.TBCTR 0; EPwm1Regs.TBPRD 1499; // 150MHz / (14991) 100kHz EPwm1Regs.TBCTL.bit.CTRMODE 0; // 向上计数锯齿波模式 EPwm1Regs.TBCTL.HSPCLKDIV 0; // TBCLK SYSCLKOUT 150MHz EPwm1Regs.TBCTL.CLKDIV 0; // 再分频1TBCLK保持150MHz EPwm1Regs.TBCTL.SYNCOSEL 1; // 计数器归零时产生同步信号 EPwm1Regs.CMPA.half.CMPA 750; // 高电平时间750个周期约50%占空比 EPwm1Regs.AQCTLA.bit.ZRO 2; // 计数器0时A输出高 EPwm1Regs.AQCTLA.bit.CAU 1; // 计数器CMPA时A输出低 // 死区配置A不反相B反相经典互补对 EPwm1Regs.DBCTL.bit.OUT_MODE 3; // A和B都启用死区 EPwm1Regs.DBCTL.bit.POLSEL 2; // A不反相B反相 EPwm1Regs.DBRED.bit.DBRED 15; // 上升沿延时15个TBCLK100ns EPwm1Regs.DBFED.bit.DBFED 15; // 下降沿延时15个TBCLK100ns }ePWM2 的配置与 ePWM1 基本一致区别在 TBCTL 的同步相关位SYNCOSEL0 表示接收外部同步信号PHSEN1 使能相位装载。CMPA 同样设为 750保证副边桥也是 50% 占空比。// ePWM2 从模块H桥2的 PWM2A/PWM2B通过TBPHS实现移相 void InitEPwm2(void) { EPwm2Regs.TBSTS.all 0; EPwm2Regs.TBPHS.half.TBPHS 0; // 初始移相角为0 EPwm2Regs.TBCTR 0; EPwm2Regs.TBPRD 1499; // 与ePWM1保持一致 EPwm2Regs.TBCTL.bit.CTRMODE 0; // 向上计数 EPwm2Regs.TBCTL.HSPCLKDIV 0; EPwm2Regs.TBCTL.CLKDIV 0; EPwm2Regs.TBCTL.SYNCOSEL 0; // 从模式同步信号由SYNCI输入 EPwm2Regs.TBCTL.PHSEN 1; // 使能同步信号装载TBPHS EPwm2Regs.TBCTL.PHSDIR 0; // 同步后向上计数 EPwm2Regs.CMPA.half.CMPA 750; // 50%占空比 EPwm2Regs.AQCTLA.bit.ZRO 2; EPwm2Regs.AQCTLA.bit.CAU 1; EPwm2Regs.DBCTL.bit.OUT_MODE 3; EPwm2Regs.DBCTL.bit.POLSEL 2; EPwm2Regs.DBRED.bit.DBRED 15; EPwm2Regs.DBFED.bit.DBFED 15; }死区时间不是拍脑袋定的。DBRED 和 DBFED 的单位是 TBCLK 周期个数150MHz 下每个周期约 6.67ns。15 个周期约 100ns是针对 100kHz 开关频率和常见的 IGBT 驱动模块的保守值。如果用的是 SiC MOSFET死区可以压到 50ns如果驱动模块自带死区DSP 侧甚至可以设 0。死区太小会直通炸管太大则增加占空比损失和回流功率。开关频率TBPRDCMPA(50%)DBRED/DBFED实际死区50kHz2999150030200ns100kHz149975015100ns150kHz9995001067ns3.2 移相角在线修改TBPHS相位装载机制移相角不是直接写在某个寄存器里的角度值而是换算成计数个数放进 TBPHS。向上计数模式下一个完整 PWM 周期对应 360 度周期计数个数是 TBPRD1所以角度到计数的换算是线性的。// 将移相角度写入ePWM2的相位寄存器 // phase_deg: 正值表示副边桥滞后原边桥功率正向传输 void SetPhaseShift(float phase_deg) { Uint16 tbps; float period_count (float)EPwm1Regs.TBPRD 1.0f; tbps (Uint16)(phase_deg / 360.0f * period_count); EPwm2Regs.TBPHS.half.TBPHS tbps; }参数说明phase_deg 的范围建议限制在 -180 到 180 之间超过 180 度在数值上等价于反向移相逻辑容易混乱。写入 TBPHS 不会立即生效硬件会在下一个同步信号到来时把新值装载进计数器这意味着移相角更新有一个开关周期的延迟。100kHz 下就是 10us对电压环来说可以接受但如果要做电流内环或对动态响应要求高的场景这个延迟要在环路设计里算进去。另外TBPHS 是 16 位寄存器写入的分辨率是 1 个 TBCLK 周期。以 100kHz 开关频率为例1 度约等于 4.17 个计数量化误差约 0.24 度对应功率误差在 1% 以内不会对闭环造成实质影响。3.3 ePWM中断里完成ADC采样与控制计算控制中断用 ePWM1 的周期事件触发频率等于开关频率 100kHz。在这个中断里完成 ADC 采样、过流判断、PID 计算和移相角更新。中断服务函数在 main 函数里通过 PIE 向量表挂接EALLOW; PieVectTable.EPWM1_INT epwm1_isr; EDIS; PieCtrlRegs.PIEIER3.bit.INTx1 1; // 使能PIE组3的EPWM1中断 IER | M_INT3; // 使能CPU中断组3 EINT;中断服务函数内部采样时序是重点。开关管动作瞬间会产生强烈的 dv/dt 和 di/dt 噪声ADC 采样点如果落在开关瞬态读回来的电压电流全是毛刺。常见做法是在 PWM 计数器归零后延时一小段时间再触发采样让死区内的振荡先衰减掉。interrupt void epwm1_isr(void) { float vout_fb, iin_fb; // 软件触发ADC转换两个通道级联采样 AdcRegs.ADCTRL2.bit.SOC_SEQ1 1; // 等待转换完成注意ADCRESULT是左对齐12位 while (AdcRegs.ADCST.bit.INT_SEQ1 0) { } AdcRegs.ADCST.bit.INT_SEQ1_CLR 1; vout_fb (float)(AdcRegs.ADCRESULT0 4) * 3.3f / 4096.0f * VOUT_SCALE; iin_fb (float)(AdcRegs.ADCRESULT1 4) * 3.3f / 4096.0f * IIN_SCALE; // 过流保护优先先切移相角再报故障 if (iin_fb IIN_OVER_CURRENT) { dab_state FAULT; SetPhaseShift(0.0f); GpioDataRegs.GPASET.bit.GPIO12 1; // 点亮故障灯 EPwm1Regs.ETCLR.INT 1; PieCtrlRegs.PIEACK.all PIEACK_GROUP3; return; } // 电压环PID输出移相占空比换算成角度 float duty PidUpdate(vout_pid, VOUT_REF, vout_fb); SetPhaseShift(duty * 180.0f); EPwm1Regs.ETCLR.INT 1; // 清除ePWM1中断标志 PieCtrlRegs.PIEACK.all PIEACK_GROUP3; // 清除PIE组3应答 }参数说明VOUT_SCALE 和 IIN_SCALE 是电压电流传感器的变比换算系数由调理电路决定。ADC 输入范围是 0 到 3.3V所以采样电阻分压后要保证最高电压对应的 ADC 输入不超过 3.3V。过流比较阈值取额定电流的 1.2 到 1.5 倍留出启动浪涌的余量。中断里用 while 等待 ADC 转换这种方式实现简单但会阻塞中断现场如果系统里还有其他中断源建议改用 ADC 中断完成后再做计算。4. DAB闭环电压环PID离散化与软启动逻辑4.1 数字PID的C语言实现与参数整定起点电压外环用位置式 PID 足够了。采样率 100kHz 对电压环来说偏高实际可以在中断里做分频每 5 次或 10 次中断才执行一次 PID等效控制频率 10kHz 到 20kHz。这样做的好处是 PWM 频率可以保持较高变压器利用率高而 PID 的周期 Ts 也能取到合适的值。typedef struct { float Kp, Ki, Kd; float Ts; // 控制周期秒 float integral; float prev_error; float out_max, out_min; } DabPid; void PidInit(DabPid *p, float kp, float ki, float kd, float ts) { p-Kp kp; p-Ki ki; p-Kd kd; p-Ts ts; p-integral 0.0f; p-prev_error 0.0f; p-out_max 0.45f; // 移相占空比限幅对应D0.45 p-out_min -0.45f; } float PidUpdate(DabPid *p, float ref, float fb) { float err ref - fb; float d_err err - p-prev_error; // 积分分离大误差下积分清零只走比例防止积分饱和 if (fabsf(err) 0.05f * ref) { p-integral 0.0f; } else { p-integral err * p-Ts; } // 积分限幅 if (p-integral 0.5f) p-integral 0.5f; if (p-integral -0.5f) p-integral -0.5f; float out p-Kp * err p-Ki * p-integral p-Kd * d_err / p-Ts; if (out p-out_max) out p-out_max; if (out p-out_min) out p-out_min; p-prev_error err; return out; }参数整定从 Kp0.01、Ki0.0001、Kd0 开始试。接上直流电源和电子负载给一个稍低的电压参考值观察输出电压波形。Kp 太小电压爬升慢Kp 太大输出电压会振荡Ki 的作用是消除静差逐步加大直到稳态误差消失。Kd 在 DAB 电压环里一般不给因为微分项放大开关噪声容易让移相角抖动。积分分离阈值取参考电压的 5%是为了避免启动阶段和负载大幅突变时积分饱和。out_max 限制在 0.45 是刻意让 D 不超过 0.5因为 D 超过 0.5 之后功率反而下降控制量进入非线性区PID 会失去调节能力。4.2 软启动移相角从零逐步爬升DAB 启动瞬间如果直接给目标移相角变压器和串联电感上会产生远大于稳态的冲击电流严重时直接炸 IGBT。常见做法是软启动把移相角从 0 开始按固定斜率逐步增加到目标值。下面这段代码放在 ePWM1 中断里调用200 次中断20ms增加 1 度目标 30 度需要约 600ms完成启动。static Uint16 soft_cnt 0; static float soft_phase 0.0f; void SoftStartRoutine(float target_phase) { if (dab_state ! SOFT_START) return; soft_cnt; if (soft_cnt 200) { // 200次中断 x 0.1ms 20ms soft_cnt 0; soft_phase 1.0f; // 每个步进加1度 if (soft_phase target_phase) { soft_phase target_phase; dab_state RUNNING; } SetPhaseShift(soft_phase); } }软启动斜率的选择跟负载特性有关。空载启动可以快每步进 2 到 3 度都没问题带整流性负载启动要慢每步进 0.5 到 1 度更安全。变斜率方式也可以前 10 度快速爬升接近目标值时放慢但会增加状态判断的复杂度多数工程场景不需要。4.3 负载突变时的动态响应与故障保护DAB 带载从 0 跳到额定值输出电压会瞬间跌落此时积分分离逻辑生效误差超过参考电压 5%积分清零比例项输出较大的校正量把移相角快速拉开。等电压回到误差范围内积分重新累积消除静差。这套逻辑在纯阻性负载下表现良好但在整流性负载或恒功率负载下电压环带宽要适当压低避免动态过程中移相角大幅度过冲引起二次冲击。故障保护的处理顺序也有讲究。过流发生时先清零移相角再置故障标志最后才关 PWM 输出或拉低使能引脚。如果先关 PWM电感电流突变会产生高压尖峰反而可能打坏功率管。对于单极交错并联隔离型 DAB 式 AC/DC 变换器这类拓扑前级 PFC 的输出波动会叠加到 DAB 输入侧电压环带宽要设计得比前级慢否则两个环路会相互影响系统容易振荡。5. DAB程序调试三板斧波形观察、参数在线修改、寄存器坑排查5.1 用CCS Graph工具对齐PWM波形和移相角在 CCS 的 Tools → Graph → Dual Time Graph 里添加变量 EPwm1Regs.TBCTR 和 EPwm2Regs.TBCTR数据类型选 Unsigned 16-bit采样点数 512。两个计数器波形都是锯齿波它们的波峰起点之间的横向差距就是移相角的实际计数值除以 TBPRD1 再乘 360 就是实际移相角度。这个工具比示波器接探头方便在能直接读到数字不会因为探头延时产生误判。5.2 用Expressions窗口在线修改PID参数与移相限幅DSP28335 的优势就是浮点运算和 CCS 的在线调试能力。在 Expressions 窗口添加 vout_pid.Kp、vout_pid.Ki、vout_pid.out_max显示格式设为 Float。程序跑起来之后直接修改数值下一拍 PID 计算就会用新参数不需要重新编译烧录。在线整定参数时先改 Kp 观察输出再改 Ki每次改动幅度控制在 30% 以内避免系统突然失稳。5.3 三个高频寄存器坑对照坑点现象排查方向死区极性配置反了空载正常加载就过流保护示波器看 PWM1A/1B 的死区方向互斥期间两路应为低TBPHS 换算基准错误移相角与理论不符偏大或偏小周期计数是 TBPRD1 不是 TBPRD向上计数模式注意区分ADC 采样触发点没对齐电压反馈毛刺大PID 输出抖动软件触发采样有随机延迟改用 ePWM 的 SOCA 硬件触发极性配置反了这条尤其隐蔽DSP 输出的死区是上下管都关闭的互斥间隔如果 POLSEL 配错变成上下管同时导通空载时电流小不一定触发保护一加载必然过流。排查方法是用示波器同时看同桥臂两路驱动正常波形补口处应有一段锯齿状死区而两个管子同时导通的波形没有死区。提示TBPHS 量化误差在提高开关频率后变得明显150kHz 以上时移相角分辨率下降角度换算建议改用查表或定点累加方式。调试完成后把 Expressions 里调好的 Kp、Ki 写回初始化代码再做一次完整的空载→加载→满载测试。软启动时间、过流阈值、移相限幅三个参数在工程交付时建议做成宏定义集中放在头文件里方便后续维护。本文还有配套的精品资源点击获取
返回列表