TMS320F28035 EPWM触发ADC采样的精准时序设计与实践
1. EPWM与ADC协同工作的基本原理
在电机控制或电源监测等工业场景中,经常需要对电流、电压等模拟信号进行周期性采样。TMS320F28035这款DSP芯片的EPWM(增强型脉宽调制)模块与ADC(模数转换器)模块的协同工作,能够实现高精度的定时采样。这种硬件级联的设计比软件触发采样更可靠,因为它避免了软件延迟带来的时序抖动。
EPWM模块本质上是一个可编程的定时器,通过配置它的时钟分频、计数模式和周期寄存器,可以生成精确的脉冲信号。当计数器达到特定条件(比如向上计数到周期值)时,会触发一个SOC(Start of Conversion)信号,这个信号可以直接连接到ADC模块,告诉它"现在开始采样"。
ADC模块收到触发信号后,会按照预设的通道选择和采样窗口时间进行模数转换。这种硬件触发机制的关键优势在于:
- 时序精准:EPWM的时钟基于系统时钟,抖动通常在纳秒级
- 资源占用低:不需要CPU干预,解放了处理器资源
- 确定性高:每个采样点的时间间隔严格一致,适合闭环控制
2. EPWM模块的精细配置
2.1 时钟树与频率计算
EPWM的时钟源来自系统时钟,经过两级分频得到实际的工作时钟。第一级是HSPCLKDIV(高速外设时钟分频),第二级是CLKDIV(时钟分频)。计算公式为:
EPWM时钟频率 = 系统时钟频率 / (HSPCLKDIV * CLKDIV)假设系统时钟为60MHz,配置:
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // 分频系数1 EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 分频系数1得到的EPWM时钟就是60MHz,每个时钟周期约16.67ns。
2.2 周期与频率的匹配设计
如果需要生成300kHz的PWM波,计算过程如下:
- 周期时间 = 1/300000 ≈ 3.333μs
- 时钟周期数 = 3.333μs / 16.67ns ≈ 200
因此需要设置周期寄存器:
EPwm1Regs.TBPRD = 200;实际项目中建议保留10%的余量,避免计数器溢出。
2.3 关键寄存器配置详解
完整的EPWM初始化函数应该包含这些关键配置:
void InitEPWM1(void) { EALLOW; // 触发源配置 EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能A组SOC EPwm1Regs.ETSEL.bit.SOCASEL = 4; // 选择向上计数时触发 // 定时器配置 EPwm1Regs.TBPRD = 200; // 设置周期值 EPwm1Regs.TBCTL.bit.CTRMODE = 2; // 上下计数模式 // 相位对齐 EPwm1Regs.TBPHS = 0; // 相位寄存器清零 // 时钟配置 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; EPwm1Regs.TBCTL.bit.CLKDIV = 0; EDIS; }3. ADC模块的触发配置
3.1 SOC通道的参数设置
ADC的SOC(Start of Conversion)通道需要与EPWM的触发信号绑定。关键参数包括:
- CHSEL:选择模拟输入通道,比如AIO2对应值2
- ACQPS:采样窗口时间,单位是SYSCLK周期
- TRIGSEL:选择触发源,EPWM1的SOCA对应值5
典型配置示例:
AdcRegs.ADCSOC0CTL.bit.CHSEL = 2; // 选择AIO2通道 AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; // 采样窗口7个周期(6+1) AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // EPWM1 SOCA触发3.2 中断服务例程绑定
采样完成后通常需要中断处理,配置步骤:
- 清除中断标志
- 绑定中断服务函数
- 使能中断
代码实现:
EALLOW; AdcRegs.INTSEL1N2.bit.INT1SEL = 0; // SOC0完成触发INT1 AdcRegs.INTSEL1N2.bit.INT1E = 1; // 使能INT1 AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除中断标志 PieVectTable.ADCINT1 = &ADC_ISR; // 绑定中断函数 EDIS; IER |= M_INT1; // 使能CPU级中断 EINT(); // 开启全局中断4. 时序对齐与误差优化
4.1 硬件触发延迟补偿
EPWM触发到ADC实际采样存在约40-100ns的硬件延迟,在高精度应用中需要考虑补偿。有两种常用方法:
- 相位提前:设置EPWM的TBPHS寄存器,让触发信号提前
- 软件校准:通过测量实际延迟,动态调整触发时机
4.2 采样窗口时间计算
采样窗口(ACQPS)需要足够长以保证采样保持电路稳定。计算公式:
采样时间 = (ACQPS + 1) × SYSCLK周期对于60MHz系统时钟,设置ACQPS=6时:
采样时间 = 7 × 16.67ns ≈ 117ns4.3 抗干扰设计要点
- 在EPWM触发沿前后各留出20ns的死区时间
- 避免在ADC采样期间切换数字IO
- 配置ADC的滤波器参数(ADCREFSEL)
- 定期执行ADC自校准(AdcOffsetSelfCal)
5. 调试技巧与常见问题
5.1 使用CCS的实时监控
在Code Composer Studio中可以通过Graph工具实时观察采样数据:
- 添加ADC结果存储区的watch变量
- 右键选择"Graphic Display"
- 设置显示参数为"Signed 16-bit integer"
- 调整采样率与触发频率一致
5.2 典型故障排查
问题1:采样值不稳定
- 检查ACQPS是否足够
- 验证电源纹波是否超标
- 确认信号地与被测共地
问题2:触发间隔不均匀
- 检查EPWM是否被更高优先级中断打断
- 测量EPWM输出波形稳定性
- 确认CLKDIV配置是否正确
问题3:数据偏移
- 执行ADC偏移校准
- 检查参考电压精度
- 验证信号调理电路
6. 电机控制应用实例
以三相电机电流采样为例,典型配置流程:
- 配置3个EPWM模块,相位差120°
EPwm1Regs.TBPHS = 0; EPwm2Regs.TBPHS = PERIOD/3; EPwm3Regs.TBPHS = 2*PERIOD/3;- 绑定对应的ADC SOC通道
// 电流A相 AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // EPWM1触发 // 电流B相 AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 6; // EPWM2触发- 设置交错采样模式
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; // 采样完成后立即触发中断- 在中断中读取并处理数据
__interrupt void ADC_ISR(void) { currentA = AdcResult.ADCRESULT0; currentB = AdcResult.ADCRESULT1; ... AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; // 清除中断 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; }在实际项目中,我发现EPWM触发ADC的稳定性很大程度上取决于PCB布局。模拟信号走线要远离高频数字信号,必要时使用屏蔽层。另外,上电后建议延迟100ms再开始采样,等待电源和基准电压稳定。
