1. 基于DSP28335的单相全桥逆变器实现解析
最近在电力电子实验室折腾了一个基于DMS320F28335的单相全桥逆变器项目,采用双极性SPWM调制和闭环电流控制方案。这个项目最让我自豪的不是最终输出的完美正弦波,而是整个工程里那些密密麻麻的代码注释——几乎每行寄存器配置都解释了为什么这么做,有些地方甚至把电力电子的基本原理都补充上了。今天就把这个项目的技术细节和踩坑经验完整分享出来,特别适合刚接触DSP控制的电力电子工程师。
先说说整体方案:这是一个20kHz开关频率的逆变系统,电流环控制周期50μs。系统通过ADC实时采样电感电流,经过PID运算后生成SPWM信号驱动全桥MOSFET。整个工程包含ADC采样模块、ePWM模块、PID算法和中断服务等核心部分,在CCS开发环境下实测波形THD<3%,动态响应时间小于2ms。
提示:虽然这个项目是针对TMS320F28335设计的,但其中的闭环控制思路、PWM生成方法和保护机制同样适用于其他型号的DSP,比如280xx系列。
2. 硬件架构与核心参数设计
2.1 主电路拓扑选择
采用经典的单相全桥结构,由四个MOSFET(IRFP4668)组成H桥,输出端接LC滤波器(L=2mH,C=20μF)。这种拓扑的优势在于:
- 双极性调制下输出电压电平有+Vdc、-Vdc和零三种状态
- 相同直流母线电压下比半桥结构输出功率大一倍
- 天然具备续流回路,无需额外设计死区补偿电路
直流母线电压选择200V,考虑因素包括:
- 满足220Vrms输出需求(200Vdc对应141Vrms基波)
- 留有余量应对负载突变时的电压跌落
- 在MOSFET耐压范围内(IRFP4668的Vds=250V)
2.2 DSP外设资源配置
TMS320F28335的外设配置如下:
- ePWM1/2:生成互补的SPWM信号
- ADCINA0:采样电感电流(通过霍尔传感器)
- GPIO12:过流保护快速关断引脚
- CPU Timer0:50μs电流环定时器
时钟树配置特别重要:
- 外部晶振30MHz
- 通过PLL倍频到150MHz系统时钟
- ePWM时钟不分频(150MHz)
- ADC模块时钟二分频(75MHz)
3. 软件实现关键模块解析
3.1 ADC采样模块精要
电流采样是整个闭环控制的基础,要点在于采样时刻的选择。我们利用ePWM1的SOC(Start-of-Conversion)触发,将采样点精确设置在PWM周期的中点,这样可以有效避开开关噪声:
c复制void InitAdc(void) {
AdcRegs.ADCTRL1.bit.ACQ_PS = 0x0F; // 采样窗口=15*SYSCLK=300ns
AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; // 带隙和基准电源上电
DELAY_US(1000); // 关键等待!基准电压稳定需要时间
AdcRegs.ADCMAXCONV.bit.MAX_CONV = 0x0;// 单通道转换模式
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;// 指定ADCINA0通道
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // 连续运行模式
}
几个关键细节:
- ACQ_PS=15给出的300ns采样窗口,完美匹配ACS712霍尔传感器的响应时间
- 基准电源上电后必须延时1ms,否则采样值会漂移
- 单通道模式比序列模式快约200ns,这对50μs的控制周期很重要
注意:ADC校准值存储在TI保留的OTP存储器中,上电后需要手动加载到ADCOFFTRIM寄存器,否则零点误差可能达到±5%!
3.2 ePWM模块的双极性调制实现
双极性SPWM的核心是对称性,我们采用ePWM1和ePWM2产生互补信号,通过AQ模块自动生成死区:
c复制void InitEPwm(void) {
EPwm1Regs.TBPRD = 7500; // 20kHz载波(150MHz/7500)
EPwm1Regs.CMPA.half.CMPA = 3750; // 初始50%占空比
EPwm1Regs.TBCTL.bit.CTRMODE = 0x2; // 增减计数模式
EPwm1Regs.AQCTLA.bit.CAU = 0x1; // 计数增时置高
EPwm1Regs.AQCTLA.bit.CAD = 0x2; // 计数减时置低
EPwm2Regs.AQCTLA.bit.CAU = 0x2; // EPWM2A与EPWM1A反相
EPwm2Regs.AQCTLA.bit.CAD = 0x1;
EPwm1Regs.DBCTL.bit.OUT_MODE = 0x3; // 使能上升沿和下降沿死区
EPwm1Regs.DBRED = 30; // 上升沿死区=30*6.67ns≈200ns
EPwm1Regs.DBFED = 30; // 下降沿死区对称
}
死区时间计算经验:
- 对于IRFP4668这类MOSFET,建议死区≥100ns
- 实际值需用示波器测量确认,太小会直通,太大会增加谐波
- 死区补偿可以在软件中通过调制波预畸变实现
3.3 数字PID控制器的实现技巧
电流环PID在定时器中断中执行,采用增量式算法避免积分饱和:
c复制interrupt void ISR_CurrentLoop(void) {
static float err_prev = 0, integral = 0;
float current_ref = 10.0; // 10A目标值
// ADC结果转换(3.3V参考,12位分辨率,霍尔灵敏度0.1V/A)
float current_act = AdcResult.ADCRESULT0 * 0.00024414 / 0.1;
float err = current_ref - current_act;
integral += Ki * err * 0.00005; // Ts=50μs
integral = (integral > 1.0) ? 1.0 : ((integral < -1.0) ? -1.0 : integral);
float derivative = Kd * (err - err_prev) / 0.00005;
float output = Kp * err + integral + derivative;
// 输出限幅在±15%(3750±1125)
Uint16 cmp = 3750 + (Uint16)(output * 750);
EPwm1Regs.CMPA.half.CMPA = (cmp > 4875) ? 4875 : ((cmp < 2625) ? 2625 : cmp);
err_prev = err;
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 清除中断标志
}
PID调参经验:
- 先调Kp使系统有响应但不振荡
- 再调Ki消除稳态误差
- 最后加Kd抑制超调
- 本案例最终参数:Kp=0.5, Ki=15.0, Kd=0.001
4. 工程中的实战经验与避坑指南
4.1 GPIO复用配置的血泪教训
曾经因为忘记配置GPIO复用寄存器,导致PWM信号无法输出到引脚,连续烧了三组MOSFET。正确的配置流程:
c复制void InitGpio(void) {
EALLOW;
// 配置GPIO0-1为EPWM1A/B
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;
// 配置GPIO2-3为EPWM2A/B
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1;
EDIS;
}
重要:修改复用寄存器前必须执行EALLOW指令,修改后执行EDIS,这是TI DSP的写保护机制!
4.2 过流保护的硬件加速实现
除了软件检测外,我们还利用DSP的Trip Zone硬件保护:
- 配置TZ1引脚接收比较器信号
- 设置ePWM在故障时立即输出高阻态
c复制void InitTz(void) {
EALLOW;
EPwm1Regs.TZSEL.bit.OSHT1 = 1; // 使能TZ1单次触发
EPwm1Regs.TZCTL.bit.TZA = 2; // 故障时EPWMxA高阻
EPwm1Regs.TZCTL.bit.TZB = 2; // EPWMxB同样处理
GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 3; // GPIO48配置为TZ1
EDIS;
}
实测表明,硬件保护能在200ns内关断PWM,比软件中断快10倍以上。
4.3 开关损耗与热管理技巧
在20kHz开关频率下,每个MOSFET的损耗主要包括:
- 导通损耗:I²R = (10A)²×0.022Ω = 2.2W
- 开关损耗:(Vds×Ids×trr)/6 = (200V×10A×100ns)/6 ≈ 0.33W
- 总损耗:(2.2+0.33)×4 ≈ 10W
散热设计要点:
- 使用带绝缘垫片的铝散热器
- 导热硅脂涂抹要薄而均匀
- 保持环境温度低于40℃
- 必要时增加风扇强制风冷
5. 系统测试与性能优化
5.1 开环测试流程
在实现闭环控制前,必须先验证硬件基础:
- 直流母线加低压(如50V)
- 注入固定占空比测试波形对称性
- 用示波器检查:
- 上下管驱动信号是否互补
- 死区时间是否合理
- 栅极电压上升/下降时间是否<100ns
5.2 闭环调试步骤
- 先开环运行,观察ADC采样值是否合理
- 启用PID但只保留比例项(Ki=0, Kd=0)
- 逐步增加Kp直到出现轻微振荡
- 加入积分项消除稳态误差
- 最后加微分项抑制超调
5.3 性能优化记录
通过以下优化将THD从5%降到3%:
- 将PWM中点采样改为三点采样取平均
- 在PID输出增加二阶低通滤波
- 优化死区时间从300ns降到200ns
- 采用预畸变SPWM波形补偿死区效应
最终的波形质量指标:
- 额定负载下THD<3%
- 空载到满载调整时间<5ms
- 效率>92%(含驱动电路损耗)
- 温升<30℃(环境25℃时)