在电力电子和电机控制领域,精确的时序控制是系统稳定运行的关键。以开关电源为例,我们需要在每个PWM周期开始时采集输出电压或电流信号,这个时刻通常对应功率管刚导通的状态。如果采样时刻出现偏差,轻则导致控制环路不稳定,重则可能损坏功率器件。
传统定时器触发ADC的方式存在两个痛点:一是软件触发难以保证严格的时序一致性,二是中断响应会引入不可预测的延迟。而TMS320F28035的ePWM模块与ADC模块的硬件级联动,能够实现纳秒级精度的同步采样。实测表明,这种方案的时间抖动可以控制在5ns以内,远优于软件触发的微秒级波动。
举个实际案例,我在设计一台3kW的LLC谐振变换器时,最初尝试用定时器中断触发ADC采样,结果发现输出电压纹波比预期大了30%。改用ePWM同步触发后,不仅纹波降低了,整个系统的动态响应速度也提升了20%。这就是硬件同步的威力。
TMS320F28035的最小系统需要关注三个核心部分:
特别注意ADC参考电压设计:
c复制// 参考电压配置示例
AdcRegs.ADCCTL1.bit.ADCREFSEL = 1; // 使用内部2.048V参考
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // 开启带隙电源
对于可变电阻采样,推荐使用这种结构:
实测中发现,当采样阻抗超过5kΩ时,需要增加采样保持时间(ACQPS)。例如:
c复制AdcRegs.ADCSOC1CTL.bit.ACQPS = 15; // 16个时钟周期的采样窗
要让ePWM在计数器归零时触发ADC,需要配置以下寄存器组:
c复制EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 递增计数模式
EPwm1Regs.TBPRD = 6000; // 对应10kHz PWM频率
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能SOCA
EPwm1Regs.ETSEL.bit.SOCASEL = 1; // TBCTR=0时触发
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 每个周期触发一次
特别注意CMPA值的设置:它决定了PWM占空比,但不会影响触发时刻。我曾踩过一个坑:误将CMPA设为0导致无法产生触发信号,实际上触发只与TBCTR相关。
ADC配置的核心在于SOC(Start-of-Conversion)设置:
c复制AdcRegs.ADCSOC1CTL.bit.CHSEL = 8; // 选择ADCINB0通道
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // 触发源选择EPWM1SOCA
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;// 转换完成后触发中断
这里有个实用技巧:利用SOC0做dummy采样可以规避F28035首样值异常的问题。具体做法是配置SOC0和SOC1相同的参数,但只使用SOC1的结果。
在CCS中观察采样值时,推荐使用Graph功能而非Watch窗口:
遇到采样值异常时,建议按这个顺序排查:
问题1:采样值始终为0
问题2:采样值随机跳变
问题3:触发间隔不稳定
通过配置多个SOC,可以实现单触发下的多通道采样:
c复制AdcRegs.ADCSOC0CTL.bit.CHSEL = 8; // 通道B0
AdcRegs.ADCSOC1CTL.bit.CHSEL = 9; // 通道B1
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5; // 相同触发源
要提高采样精度,可以:
实测数据显示,开启4x硬件平均后,采样噪声从±5LSB降至±1LSB。
在实验室验证通过后,产品化阶段还需要考虑:
有个实际教训:某批次产品在高温环境下出现采样偏差,后来发现是未处理ADC参考电压的温度系数。加入以下代码后问题解决:
c复制if(温度传感器 > 60) {
AdcRegs.ADCOFFTRIM.bit.OFFSET_TRIM = 补偿值;
}