2. C2000 ADC模块基础:架构、采样模式与触发源配置
做电力电子的人都知道,ADC是数字控制的“眼睛”。过流保护阈值整定,说白了就是让这颗“眼睛”看得准、反应快。C2000系列的ADC模块,我用了快十年,今天把核心干货拆开讲。
核心要点:ADC模块的架构决定了你能采多快,采样模式决定了你采几次,触发源决定了什么时候采。三者配合不好,阈值整定就是纸上谈兵。
2.1 ADC模块架构:不只是“模数转换”那么简单
C2000的ADC,不是一颗孤立的芯片。它内部集成了多路模拟开关、采样保持器、逐次逼近转换器,还有一堆控制逻辑。我刚开始做项目时,以为ADC就是“电压进去,数字出来”,结果在过流保护上栽了跟头——采样速率跟不上PWM开关频率,保护动作慢了半拍。
来看一张架构图,你就明白了:
从图上你能看到,信号从模拟输入进来,经过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资源
这些基础打牢了,后面讲阈值计算和滤波算法时,你才不会手忙脚乱。