2. C2000 ADC模块基础:架构、采样模式与触发源配置

做电力电子的人都知道,ADC是数字控制的“眼睛”。过流保护阈值整定,说白了就是让这颗“眼睛”看得准、反应快。C2000系列的ADC模块,我用了快十年,今天把核心干货拆开讲。

核心要点:ADC模块的架构决定了你能采多快,采样模式决定了你采几次,触发源决定了什么时候采。三者配合不好,阈值整定就是纸上谈兵。

2.1 ADC模块架构:不只是“模数转换”那么简单

C2000的ADC,不是一颗孤立的芯片。它内部集成了多路模拟开关、采样保持器、逐次逼近转换器,还有一堆控制逻辑。我刚开始做项目时,以为ADC就是“电压进去,数字出来”,结果在过流保护上栽了跟头——采样速率跟不上PWM开关频率,保护动作慢了半拍。

来看一张架构图,你就明白了:

C2000 ADC模块架构图 模拟输入通道 ADCINA0 - A7 ADCINB0 - B7 最多16路单端 或8路差分 MUX 多路选择 S/H 采样保持 12位 SAR ADC 逐次逼近 结果寄存器 ADCRESULT0-15 触发源配置 • 软件触发 (SOC) • ePWM 触发 • 外部GPIO触发 • CPU定时器触发 控制逻辑 SOC / EOC 说明: SOC = Start of Conversion EOC = End of Conversion

从图上你能看到,信号从模拟输入进来,经过MUX选通,再到采样保持器,最后进入SAR核心转换。结果存到寄存器里,等着CPU或DMA来读。

我的经验:过流保护场景下,我习惯把电流信号接到ADCINA0-A3,电压信号接到ADCINB0-B3。这样分组清晰,调试时一眼就能看出哪路是电流。

2.2 采样模式:单次 vs 连续

C2000的ADC支持两种采样模式。选哪个,取决于你的应用场景。

特性 单次采样 连续采样
触发一次 只采1个通道 按顺序采完所有配置通道
典型应用 过流保护(只采电流) 电压电流同时监测
CPU负担 低 中
配置寄存器 ADCSOCxCTL ADCCTL1.CONT_RUN

单次采样:每次触发只转换一个SOC(Start of Conversion)通道。我做过一个项目,只需要监测直流母线电流,就用单次采样。触发一次,读一次结果,简单直接。

连续采样:设置CONT_RUN位后,ADC会循环转换所有配置的SOC通道。比如你配了SOC0-SOC3,每次触发就从SOC0采到SOC3,然后自动重头再来。嗯,这里要注意:连续模式下,EOC中断会频繁触发,别在中断里做太多事。

避坑指南:我曾经在一个三相逆变器项目里用了连续采样,结果中断服务函数里做了滤波计算,导致下一个EOC来了还没处理完。ADC结果被覆盖,过流保护误动作。后来改成单次采样+DMA,问题解决。

2.3 触发源配置:让ADC在正确的时间干活

触发源,就是告诉ADC“该干活了”。C2000提供了多种触发方式,我挑最常用的三种讲。

2.3.1 软件触发

最简单的方式。写寄存器ADCSOCFRC1,立即触发一次转换。适合调试阶段,或者非实时性要求不高的场景。

// 软件触发示例
AdcRegs.ADCSOCFRC1.all = 0x01;  // 触发SOC0转换
while(AdcRegs.ADCINTFLG.bit.ADCINT1 == 0); // 等待转换完成
result = AdcRegs.ADCRESULT0.all >> 4;      // 读取结果(右对齐)

2.3.2 ePWM触发(最常用)

电力电子控制中,90%的场景用ePWM触发。为什么?因为ADC采样需要和PWM载波同步。比如你在PWM的三角波顶点或底点触发采样,正好避开开关噪声。

配置方法:

  • 设置ePWM模块的SOCA或SOCB信号
  • 在ADC模块中,将对应SOC的触发源选为ePWM
  • 配置触发时刻(CTR=0、CTR=PRD、CTR=CMP等)
// ePWM触发ADC配置(以ePWM1触发SOC0为例)
// 1. 配置ePWM1产生SOCA信号
EPwm1Regs.ETSEL.bit.SOCAEN = 1;          // 使能SOCA
EPwm1Regs.ETSEL.bit.SOCASEL = 1;         // CTR=0时触发
EPwm1Regs.ETPS.bit.SOCAPRD = 1;          // 每个事件触发一次

// 2. 配置ADC的SOC0由ePWM1触发
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 1;      // 触发源为ePWM1 SOCA
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;        // 通道ADCINA0
AdcRegs.ADCSOC0CTL.bit.ACQPS = 15;       // 采样窗口15个时钟周期

我的习惯:过流保护采样,我通常把触发时刻设在PWM载波的底点(CTR=0)。这时候开关管刚关断,di/dt引起的噪声最小,采样值最干净。

2.3.3 外部GPIO触发

有时候你需要外部信号来启动ADC。比如故障信号一来,立即采样。C2000支持GPIO输入作为ADC触发源。

// GPIO触发配置
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 15;     // 触发源为外部GPIO
// 具体GPIO引脚需参考数据手册的ADC触发映射表

2.4 采样窗口与转换时间

这个参数直接影响过流保护的响应速度。采样窗口(ACQPS)决定了采样保持电容的充电时间。窗口太短,采样值不准;窗口太长,转换周期变长。

参数 典型值 说明
ACQPS 15 (80MHz时约187.5ns) 采样窗口 = (ACQPS+1) × SYSCLK
转换时间 13个ADCCLK周期 12位SAR转换固定13个周期
总时间 采样窗口 + 转换时间 决定了单次采样的最小周期

举个例子:系统时钟80MHz,ADCCLK设为40MHz,ACQPS=15。那么采样窗口=16×12.5ns=200ns,转换时间=13×25ns=325ns,总时间=525ns。也就是说,理论上每秒能采190万次。对于过流保护,这个速度绰绰有余。

避坑指南:我曾经把ACQPS设成3(采样窗口50ns),想着能提高采样率。结果发现ADC读数跳变厉害,过流阈值老是误触发。后来用示波器一看,采样保持电容根本没充满。记住:采样窗口宁长勿短,尤其是信号源阻抗较高的时候。

2.5 多通道采样与排序

过流保护通常需要同时监测多路电流。C2000的ADC支持自动排序采样,你只需要配置好SOC0-SOC15的通道和触发源,ADC会自动按顺序转换。

// 配置3路电流采样(SOC0-SOC2)
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;   // 通道A0 - U相电流
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 1; // ePWM1触发
AdcRegs.ADCSOC0CTL.bit.ACQPS = 15;

AdcRegs.ADCSOC1CTL.bit.CHSEL = 1;   // 通道A1 - V相电流
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 1; // 同一触发源
AdcRegs.ADCSOC1CTL.bit.ACQPS = 15;

AdcRegs.ADCSOC2CTL.bit.CHSEL = 2;   // 通道A2 - W相电流
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 1;
AdcRegs.ADCSOC2CTL.bit.ACQPS = 15;

触发一次,ADC自动采完U、V、W三相电流。结果分别存在ADCRESULT0、ADCRESULT1、ADCRESULT2里。你想想看,这比用软件轮询高效多了吧?

2.6 本章小结

ADC模块的基础配置,说白了就是三件事:选对架构、定好模式、配准触发。对于过流保护阈值整定,我建议你:

  • 用单次采样,避免连续采样带来的中断风暴
  • 用ePWM触发,同步PWM载波,采样最干净
  • 采样窗口设15-20,别为了省时间牺牲精度
  • 多路电流用自动排序,省CPU资源

这些基础打牢了,后面讲阈值计算和滤波算法时,你才不会手忙脚乱。