ePWM与ADC的同步触发配置,C2000电机控制中的PWM斩波与电流采样时序
在C2000实时控制系统中,PWM斩波与电流采样的时序配合,决定了FOC控制环路的性能上限。若采样点偏离PWM中心或中断响应延迟不可控,电流反馈的相位误差会直接削弱转矩响应速度,甚至引发环路振荡。基于ePWM模块的SOC(Start-of-Conversion)硬件触发机制,将ADC采样时刻精确锁定在PWM波形的特定相位点,是实现微秒级采样-输出延迟的关键技术路径。
采样时机:为什么必须“掐着点”采样
在PWM斩波驱动的逆变器中,功率管开关动作瞬间会产生剧烈的电压尖峰和振铃。若在此时刻采样,ADC读入的将是噪声而非真实的相电流。只有在PWM周期的特定时间段——下桥臂导通且续流路径稳定的“零矢量”期间,采样电阻上的电压才能真实反映相电流。
在F28027平台上,下桥臂采样电阻法将采样点配置在PWM计数器的周期匹配点(即下溢中断处)。此时三个下桥臂均处于导通状态,上桥臂全部关断,电机绕组通过下桥臂续流,采样电阻上的压降与相电流精确对应。TI在双电阻采样方案中推荐在PWM周期的开始处(下溢中断)触发采样,因为此时U、V两相上桥臂关断、下桥臂导通,可以稳定读取两个相电流值。
C2000系列MCU允许ADC的SOC触发点出现在PWM周期的任意位置,不仅限于周期匹配或零点匹配。配置时需考虑电流建立时间和开关噪声持续期——采样点必须安排在Trise(电流跳变稳定时间)和Tnoise(开关噪声持续时间)之后,否则采样数据将含有无效成分。
同步触发机制:硬件级联的“三步协同”
ePWM与ADC同步触发的硬件链路可分为三个环节:ePWM配置SOC触发源、ADC配置SOC参数、PIE中断路由数据。
**第一步:配置ePWM发令枪**。在PWM模块中,通过SOCASEL寄存器选择触发事件——计数器等于零、等于周期值或比较值匹配。电机控制应用中通常选择PWM周期顶点(CTR=PRD)或谷底(CTR=ZERO)作为触发点,此时载波相位处于最稳定的时刻。触发频率可选每个周期触发一次或每两个周期触发一次,取决于控制环路的更新率需求。
**第二步:配置ADC接收命令**。每个ADC模块包含16个可独立配置的SOC单元,每个SOC需要指定三个参数:采样通道(CHSEL)、采样窗口长度(ACQPS)和触发源(TRIGSEL)。将TRIGSEL指向ePWM模块的SOCA或SOCB输出,即完成硬件绑定。采样窗口长度影响ADC采样精度和转换时间——典型配置为7个ADC时钟周期,可提供足够的采样保持时间。
**第三步:配置中断通知CPU**。ADC转换完成后,EOC信号触发PIE中断,CPU进入ISR读取结果寄存器并执行FOC算法。需要注意的是,进入中断后必须先清除ADC中断标志并向PIE发送ACK应答,否则PIE会认为该中断仍在处理中,拒绝后续中断请求。
时序细节:CMPA更新时刻与影子寄存器
在C2000系列中,ePWM的比较寄存器(CMPA)支持影子寄存器模式——写入新值后不会立即生效,而是在特定的事件点(CTR=ZERO或CTR=PRD)同步加载到活动寄存器。
在电机控制应用中,ADC触发和CMPA更新可能在同一时刻发生。若在CTR=ZERO时刻触发ADC采样,同时在ISR中计算并写入新的CMPA值,而CMPA的加载事件也配置在CTR=ZERO,则新计算的值需等到下一个周期的ZERO点才能生效,这意味着当前周期内使用的仍是旧占空比——相当于控制信号滞后了一个完整周期。
解决这一问题的方法是错开ADC触发时刻与CMPA加载时刻。典型做法是:在CTR=ZERO触发ADC采样,但将CMPA的加载事件配置在CTR=PRD(载波顶点)。这样ADC采样的数据在半周期后生效,相比一个完整周期的延迟,相位滞后减半。若采用上下计数模式,可在CTR=ZERO和CTR=PRD两处分别触发ADC并更新CMPA,实现每个PWM周期两次控制更新。在双轴电机驱动中,通过在两个电机轴之间施加固定的90°相移,进一步避免了采样与控制执行的背靠背冲突。
C语言程序实现
// ePWM配置:在周期匹配点触发SOCA
EPwm3Regs.SOCAEN.bit.SOCAEN = 1; // 使能SOCA脉冲输出
EPwm3Regs.SOCASEL.bit.SOCASEL = 0x10; // CTR=PRD时刻触发
EPwm3Regs.SOCAPRD.bit.SOCAPRD = 0x01; // 每个周期触发一次
// ADC配置:SOC0绑定至ePWM3的SOCA触发源
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 9; // 触发源:ePWM3 SOCA
AdcRegs.ADCSOC0CTL.bit.CHSEL = 1; // 采样通道:ADCINA1
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; // 采样窗口:7个ADC时钟周期
// 中断配置:ADCINT1绑定至SOC0的EOC
AdcRegs.INTSEL1N2.bit.INT1SEL = 0x00; // 选择EOC0作为中断源
AdcRegs.INTSEL1N2.bit.INT1E = 1; // 使能ADCINT1中断
// ISR中的CMPA更新(注意影子加载事件选择)
__interrupt void adc_isr(void) {
uint16_t current = AdcResult.ADCRESULT0;
float duty = pi_controller(current);
EPwm1Regs.CMPA.bit.CMPA = (uint16_t)duty;
// 清除中断标志并向PIE发送应答
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.bit.ACK10 = 1;
}
采样延迟的工程代价
采样时刻与控制更新时刻之间的延迟,直接转化为电流环的相位滞后。实测数据显示,500ns的采样延迟在10kHz基频下引入1.8°相位误差,在50kHz基频下达8.9°;1μs的采样延迟在50kHz下更放大至17.8°。这种相位滞后会削弱电流环的带宽和稳定裕度,C2000的可配置ADC中断延迟特性允许将中断触发时刻精确对齐到转换完成前一个周期,有效压缩这段无效等待。





