DSP28335,三相逆变电路电压闭环程序,三相逆变数字电源程序。 包括源代码文件和PDF说明文件。 详细说明了代码含义,三相逆变电路电路电压闭环分析,电路设计步骤,软件设计流程,软件调试步骤等。

最近在搞三相逆变电源的项目,用DSP28335做电压闭环控制真是酸爽。这玩意儿既要懂电力电子又要会写代码,调试时被炸过几次管子的兄弟应该都懂。今天咱就唠唠这个数字电源开发里的门道,关键代码直接贴出来分析。

硬件部分建议先拿现成驱动板练手,重点注意母线电容的ESR参数。我见过有人拿普通电解电容硬上,结果闭环震荡直接炸出烟花。软件层面最核心的是ADC同步采样,用EPWM触发采样序列这个配置特别关键:
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相电压
}
这段配置实现了三相电压同步采样,注意ADC的采样保持时间要和PWM载波周期匹配。之前有个坑是采样窗口设太小导致结果抖动,后来发现是没考虑PCB走线的分布电容。

闭环控制的核心在PID算法实现,这里用增量式PID防止积分饱和。特别要注意Q格式处理,DSP的定点运算得做好防溢出:
c
int32 PID_Calc(PID_Struct *pid, int32 error) {
int32 p_term = _IQmpy(pid->Kp, error);
int32 i_term = _IQmpy(pid->Ki, pid->integral);
int32 d_term = _IQmpy(pid->Kd, error - pid->last_error);
pid->integral += error;
pid->last_error = error;
//输出限幅防止过调
int32 output = p_term + i_term + d_term;
output = (output > pid->max_out) ? pid->max_out : output;
output = (output < pid->min_out) ? pid->min_out : output;
return output;
}
调试时建议先开环跑SPWM,用示波器看死区时间是否正常。重点检查EPWM模块的CMPA/CMPB配置,特别是动作限定模块AQ的设置:
c
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; //CTR=CAU时置高
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;//CTR=CAD时拉低
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //使能死区
EPwm1Regs.DBFED = 100; //死区上升沿延迟
EPwm1Regs.DBRED = 100; //死区下降沿延迟
有个骚操作是拿CCS的Graph功能实时看电压波形,比用串口打印快得多。遇到闭环震荡别慌,先把Ki设0调纯比例,然后慢慢加积分项。记得在软件里埋几个观测变量,实时监控PID输出和电压误差值。

最后说个血泪教训:PCB的地线处理不好会导致ADC采样漂移。有次调了三天发现是数字地和功率地之间形成了环路,后来在ADC基准脚加了个π型滤波才解决。硬件软件真是打断骨头连着筋,缺哪边都玩不转。