去年接手一个工业电源项目时,客户要求输出电压纹波必须控制在1%以内。当时选择TI的DSP28335作为主控,配合三相全桥拓扑实现电压闭环控制。这种数字电源方案相比传统模拟控制,最大的优势在于算法可编程——PID参数随时可调,保护逻辑灵活配置,还能通过软件实现各种高级控制策略。
整个系统的工作流程可以概括为:通过电流传感器和分压电阻采集三相输出电压,经ADC转换为数字信号后,与给定电压值比较得到误差信号,经过PID算法处理后生成PWM波驱动逆变桥。其中ADC采样同步性、PID算法实现、PWM死区控制是三大技术难点,也是调试过程中最容易"炸管"的环节。
提示:新手建议先用低压电源(如24V)配合电子负载进行测试,避免直接上高压导致不可逆的硬件损坏
三相逆变桥的MOSFET选型需要考虑以下几个关键参数:
实测案例:在某型号电源中使用IPW60R045C7(600V/45mΩ)MOSFET,当开关频率设为20kHz时,单管温升约35℃(加装散热片条件下)。若改用Rds(on)更大的型号,温升会显著增加。
母线电容的等效串联电阻(ESR)直接影响闭环稳定性。常见误区包括:
推荐配置方案:
三次改版后总结的布线原则:
曾因违反第4条导致采样误差达8%,表现为输出电压周期性波动。
c复制void System_Init(void) {
InitSysCtrl(); // 系统时钟初始化
InitGpio(); // GPIO功能配置
InitPieCtrl(); // 中断控制器初始化
InitEPwm(); // PWM模块配置
InitAdc(); // ADC模块配置
InitSci(); // 串口通信初始化
EnableInterrupts(); // 全局中断使能
}
关键点说明:
c复制void Init_ADC(void) {
AdcRegs.ADCTRL1.bit.ACQ_PS = 0xF; // 采样窗口=16个SYSCLK周期
AdcRegs.ADCTRL3.bit.ADCCLKPS = 3; // HSPCLK四分频
AdcRegs.ADCMAXCONV.bit.MAX_CONV = 2; // 转换3个通道
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0; // A相电压
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 1; // B相电压
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 2; // C相电压
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1; // EPWM1触发SEQ1
}
调试技巧:
c复制typedef struct {
_iq Kp, Ki, Kd; // PID参数(Q格式)
_iq integral; // 积分项
_iq last_error; // 上次误差
_iq max_out; // 输出上限
_iq min_out; // 输出下限
} PID_Struct;
_iq PID_Calc(PID_Struct *pid, _iq error) {
_iq p_term = _IQmpy(pid->Kp, error);
_iq i_term = _IQmpy(pid->Ki, pid->integral);
_iq d_term = _IQmpy(pid->Kd, error - pid->last_error);
pid->integral += error;
// 积分抗饱和处理
if(pid->integral > pid->max_out) pid->integral = pid->max_out;
else if(pid->integral < pid->min_out) pid->integral = pid->min_out;
pid->last_error = error;
_iq output = p_term + i_term + d_term;
return _IQsat(output, pid->max_out, pid->min_out);
}
参数整定经验:
常见问题处理:
调试工具配置:
c复制// 在中断服务程序中添加观测变量
interrupt void epwm1_isr(void) {
g_obs[0] = Vout_A; // A相电压
g_obs[1] = PID_out; // PID输出
g_obs[2] = error; // 电压误差
PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}
CCS Graph配置方法:
| 现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| 输出电压振荡 | PID参数不当 | 观察误差信号相位 | 降低Ki或增加Kd |
| ADC采样跳变 | 地线干扰 | 测量ADC基准电压 | 加强滤波,改进接地 |
| MOSFET过热 | 死区不足 | 测量栅极驱动波形 | 调整DBRED/DBFED值 |
| 启动时炸管 | 软启动缺失 | 检查初始占空比 | 添加电压斜坡函数 |
在负载突变场合,可增加电流前馈补偿:
c复制_iq feedforward = _IQmpy(Kff, I_load);
PID_out += feedforward;
其中Kff = Vbus / I_max(Q格式换算)
针对采样噪声,添加一阶低通滤波:
c复制#define ALPHA 0.2 // 滤波系数
_iq filtered_val = _IQmpy(ALPHA, new_sample) +
_IQmpy(_IQ(1)-ALPHA, old_value);
过流保护示例:
c复制if(I_peak > I_limit) {
EPwm1Regs.TZFRC.bit.OST = 1; // 触发单次故障
Fault_flag = 1;
}
建议保护策略:
这个项目最终实现了0.8%的电压调整率,关键是在PID算法中加入了抗积分饱和处理,并在PCB布局时严格分离了模拟和数字地。调试过程中最耗时的部分是ADC采样时序优化——后来发现需要根据实际布线调整采样窗口时间,这个细节在芯片手册中并没有特别强调。