1. 项目概述:EPWM与ADC的精准联动
在嵌入式控制系统和电力电子应用中,精确的模拟信号采集往往需要与PWM波形保持严格的时序关系。"EPWM触发ADC单次转换"正是实现这种硬件级同步的经典方案。通过ePWM模块的特定事件触发ADC启动采样,可以确保每次ADC转换都发生在PWM周期的精确相位点,这对于电机控制、逆变器系统等需要周期采样场景至关重要。
以无刷电机控制为例,相电流检测需要在PWM开通或关断的特定时刻进行,以避免功率管开关噪声干扰。传统软件触发方式难以保证微秒级的时间精度,而EPWM硬件触发则能实现纳秒级抖动控制。我在变频器开发中就曾遇到因采样时机偏差导致的电流波形畸变问题,改用EPWM触发后波形质量显著提升。
2. 硬件架构与工作原理
2.1 ePWM模块的事件触发机制
现代微控制器(如TI C2000系列)的ePWM模块通常包含时基计数器(TB)、计数比较(CC)和动作限定(AQ)三个核心子模块。当TB计数器与CC寄存器匹配时,会生成以下关键事件:
- CTR=PRD:计数周期匹配(用于PWM周期同步)
- CTR=CMPA:比较匹配A(常用于占空比控制)
- CTR=CMPB:比较匹配B(辅助比较点)
以TMS320F28379D为例,其ePWM模块支持通过EPWMxSOCA/EPWMxSOCB信号触发ADC。配置流程如下:
- 在TBCTL寄存器设置时钟分频和计数模式
- 通过CMPCTL配置比较器A/B的加载时机
- 在ETSEL寄存器选择触发源(如CTR=CMPA)
- 用ETPS寄存器设置触发分频(通常为1:1立即触发)
关键经验:比较值CMPA建议在PWM周期前半段设置,避免因中断延迟导致触发点错过。我在实际调试中发现,当CMPA>PRD*0.7时,偶尔会出现触发丢失现象。
2.2 ADC模块的单次转换模式
与连续转换模式不同,单次转换(Single-Convert)具有以下特点:
- 收到触发信号后只执行一次完整的采样-转换流程
- 转换完成后自动进入空闲状态
- 结果寄存器更新后产生中断标志
以TI ADC为例的关键配置步骤:
c复制AdcRegs.ADCSOC0CTL.bit.CHSEL = 2; // 选择通道2
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; // 触发源选择EPWM1SOCA
AdcRegs.ADCSOC0CTL.bit.ACQPS = 15; // 采样窗口=15个SYSCLK周期
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;// 转换结束后置位中断标志
3. 具体实现与寄存器配置
3.1 ePWM模块完整配置示例
以下是基于C2000的典型配置代码:
c复制void InitEPWM1(void) {
EPwm1Regs.TBPRD = 1000; // PWM周期=1000个TBCLK
EPwm1Regs.TBPHS.bit.TBPHS = 0; // 相位清零
EPwm1Regs.TBCTL.bit.CTRMODE = 2; // 增计数模式
EPwm1Regs.TBCTL.bit.PHSEN = 0; // 禁止相位加载
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1; // 高速时钟分频
EPwm1Regs.CMPA.bit.CMPA = 300; // 比较点A在30%占空比处
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能SOCA触发
EPwm1Regs.ETSEL.bit.SOCASEL = 1; // 选择CTR=CMPA作为触发源
EPwm1Regs.ETPS.bit.SOCAPRD = 1; // 每次事件都触发
}
3.2 ADC模块的时序优化技巧
采样保持时间(ACQPS)的设置直接影响转换精度:
- 过短:采样电容未充分充电,导致读数偏小
- 过长:可能错过下一个触发事件
计算公式:
code复制最小ACQPS = (Rsource + Rswitch) × Csample × ln(2^n+1) / Tsysclk
其中:
- Rsource:信号源阻抗(通常50-100Ω)
- Rswitch:ADC内部开关电阻(约50Ω)
- Csample:采样电容(如C2000为3.5pF)
- n:ADC分辨率(12bit时n=12)
实测案例:当输入阻抗为1kΩ时,计算得ACQPS≥23,实际取25可获得稳定读数。
4. 常见问题与调试方法
4.1 触发信号未到达ADC
排查步骤:
- 用示波器检查EPWMxSOCA引脚是否有脉冲
- 确认ADC的TRIGSEL选择与ePWM模块号匹配
- 检查EPWM和ADC的时钟是否使能(PCLKCR0/1寄存器)
- 验证SOCxCTL寄存器的CHSEL选择有效通道
4.2 转换结果异常波动
可能原因及对策:
- 采样时机不当:调整CMPA位置避开开关噪声区
- 地线干扰:在ADC输入端加10-100nF去耦电容
- 参考电压不稳:检查VREFHI/VREFLO引脚电压纹波
- 信号阻抗过高:增加电压跟随器缓冲
调试技巧:先用固定直流电压测试ADC线性度,再逐步引入PWM触发。我曾遇到因PCB布局不当导致采样值随PWM频率变化的问题,最终通过重新布线解决。
5. 进阶应用:多通道交错采样
对于需要更高采样率的场景,可以配置多个SOC(Start-of-Conversion)单元,由同一ePWM事件触发但选择不同通道:
c复制// 配置SOC0-2分别采样通道0-2
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;
AdcRegs.ADCSOC1CTL.bit.CHSEL = 1;
AdcRegs.ADCSOC2CTL.bit.CHSEL = 2;
// 共用EPWM1SOCA触发
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5;
// 设置不同的采样偏移
AdcRegs.ADCSOC0CTL.bit.ACQPS = 15;
AdcRegs.ADCSOC1CTL.bit.ACQPS = 30;
AdcRegs.ADCSOC2CTL.bit.ACQPS = 45;
这种配置下,单个PWM周期内可完成3个通道的采样,等效采样率提升3倍。我在三相电流采集中采用此方法,成功将采样延迟差异控制在50ns以内。
