2. C2000过流保护系统硬件基础

ADC模块,说白了就是微控制器的“眼睛”。它把模拟电压转换成数字量,我们才能知道电流到底有多大。C2000系列的ADC,我用了快十年,它的设计思路和普通MCU不太一样。今天咱们就把它拆开看看。

2.1 ADC模块架构:核心部件与数据路径

C2000的ADC,内部其实是一个逐次逼近寄存器(SAR)型转换器。我刚开始接触时,总觉得它就是个黑盒子,直到有一次调试采样值总跳变,才逼着自己把架构吃透。

一个典型的C2000 ADC模块,包含这几个关键部分:

  • 模拟多路复用器(MUX):负责选择哪一路模拟信号进入转换器。C2000通常有16个甚至更多模拟输入通道。
  • 采样保持电路(S/H):在转换开始前,把输入电压“冻结”住。这个电容的充电时间,直接决定了采样窗口的最小值。
  • SAR转换核心:逐位比较,生成12位或16位的数字结果。转换时间由核心时钟决定。
  • 结果寄存器:转换完成后,数字值存放在这里。每个通道都有对应的结果寄存器。
  • 触发与排序器:控制什么时候开始采样,按什么顺序转换多个通道。

核心要点:ADC的精度和速度,取决于采样窗口是否足够长、转换时钟是否稳定。我在过流保护项目中,就吃过采样窗口太短的亏——采样值不准,保护阈值形同虚设。

下面这张图,是我画的一个简化架构。你看一眼,心里就有谱了。

C2000 ADC模块架构图 模拟输入通道 ADCINA0 ADCINA1 ... ADCINB7 最多16路 模拟MUX 通道选择 采样保持 S/H电路 采样窗口 SAR核心 逐次逼近 12/16位 结果寄存器 触发与排序器 SOC / 排序逻辑 💡 数据路径: 模拟信号 → MUX选择 → 采样保持(采样窗口) → SAR转换(转换时间) → 结果寄存器 触发源决定“何时开始”,排序器决定“哪个通道先转”。

2.2 采样模式:顺序采样 vs 同步采样

C2000支持两种采样模式。选哪个,取决于你的应用场景。我个人的习惯是:过流保护用同步采样,普通监控用顺序采样。

2.2.1 顺序采样(Sequential Sampling)

说白了,就是一个通道接一个通道地转。比如你配置了4个通道,ADC会先转通道0,再转通道1,依此类推。每个通道的采样窗口和转换时间可以独立配置。

  • 优点:硬件简单,每个通道的采样参数可以不同。
  • 缺点:通道间存在时间差。如果两个通道的电压变化很快,这个时间差会导致相位误差。
  • 适用场景:温度监控、电压巡检等对时序不敏感的应用。

我的经验:有一次做三相电压监测,用了顺序采样。结果发现三相之间的相位差总是算不准。后来才意识到,是ADC顺序采样引入的延迟。从那以后,凡是涉及相位关系的测量,我都改用同步采样。

2.2.2 同步采样(Simultaneous Sampling)

同步采样,就是两个通道同时采样。C2000内部有两个采样保持电路(S/H-A和S/H-B),可以分别连接不同的模拟输入。触发信号一来,两个S/H同时冻结电压,然后依次转换。

  • 优点:两个通道的采样时刻完全一致,没有时间差。
  • 缺点:只能成对使用(比如A0和B0同时采),灵活性稍差。
  • 适用场景:过流保护(同时采电压和电流)、电机控制(同时采两相电流)。
对比项 顺序采样 同步采样
采样时刻 依次进行 同时进行
通道间延迟 存在(取决于转换时间) 无延迟
硬件需求 1个S/H 2个S/H
典型应用 温度、压力等慢信号 电流、电压瞬时值测量

2.3 ADC触发源配置:谁来决定“开始采样”?

ADC不会自己主动干活。你得告诉它:什么时候开始采样。这个“告诉”的动作,就是触发源。C2000的触发源很灵活,我常用的有这几种:

  1. 软件触发(SW):写寄存器,立即启动。适合调试或非周期性采样。
  2. ePWM触发:PWM模块产生的事件。这是过流保护最常用的方式——PWM周期开始或中间点触发ADC采样,正好采集电流峰值或谷值。
  3. 外部GPIO触发:外部信号上升沿或下降沿触发。适合与外部传感器同步。
  4. CPU定时器触发:固定时间间隔触发。适合周期性数据采集。

⚠️ 避坑指南:我曾经在一个项目中,用ePWM触发ADC,但没注意触发信号的极性。结果PWM输出正常,ADC却一直不采样。查了两天才发现,是触发边沿配置反了。记住:触发源的极性、延迟、分频系数,每一项都要核对。

配置触发源,通常需要设置这几个寄存器:

  • ADCSOCxCTL:每个SOC(Start-of-Conversion)的触发源选择。
  • ADCINTSELxNy:中断触发条件。
  • EPWMxSOCA/SOCB:PWM模块的ADC触发输出。

2.4 采样窗口与转换时间计算

这是ADC配置中最容易出错的地方。采样窗口太短,采样值不准;太长,又影响采样率。你得找到一个平衡点。

2.4.1 采样窗口(Acquisition Window)

采样窗口,就是S/H电路对输入电压充电的时间。C2000的采样窗口,可以通过寄存器ADCSOCxCTL的ACQPS位来配置。单位是ADC时钟周期。

采样窗口的计算公式:

采样窗口时间 = (ACQPS + 1) × ADC时钟周期

比如,ADC时钟为50MHz(周期20ns),ACQPS设为9,那么采样窗口就是:

(9 + 1) × 20ns = 200ns

这个200ns够不够?取决于你的信号源阻抗。信号源阻抗越高,需要的采样窗口越长。我一般会留出20%~30%的余量。

经验公式:采样窗口 ≥ 2 × (信号源阻抗 + 内部开关阻抗) × 采样电容。C2000内部开关阻抗约500Ω,采样电容约5pF。如果信号源阻抗是1kΩ,那么最小采样窗口 ≈ 2 × (1000+500) × 5e-12 = 15ns。但实际中,我建议至少设到100ns以上,保证精度。

2.4.2 转换时间(Conversion Time)

转换时间,是SAR核心把采样电压变成数字量所需的时间。C2000的SAR转换,每个位需要1个ADC时钟周期。12位ADC需要13个时钟周期(12位 + 1个额外周期),16位需要17个时钟周期。

转换时间计算公式:

转换时间 = (分辨率位数 + 1) × ADC时钟周期

举个例子:

ADC时钟频率 时钟周期 12位转换时间 16位转换时间
50 MHz 20 ns 13 × 20 = 260 ns 17 × 20 = 340 ns
25 MHz 40 ns 13 × 40 = 520 ns 17 × 40 = 680 ns
12.5 MHz 80 ns 13 × 80 = 1.04 μs 17 × 80 = 1.36 μs

2.4.3 总采样时间

一个完整的ADC采样周期,包括采样窗口和转换时间:

总时间 = 采样窗口 + 转换时间

如果采样窗口200ns,12位转换260ns,那么总时间就是460ns。理论上,你可以达到约2.17 MSPS的采样率。但实际中,还要考虑触发延迟、中断响应等开销。

我的建议:在过流保护项目中,我通常把采样窗口设为200~300ns,ADC时钟设为50MHz。这样既能保证精度,又能留出足够的时间做其他处理。别把ADC跑到极限,留点余量,系统更稳定。

2.5 实战配置示例:ePWM触发同步采样

下面是一个实际配置片段。假设我们要用ePWM1触发ADC,同步采样A0和B0通道,采样窗口200ns,ADC时钟50MHz。

// 假设ADC时钟已配置为50MHz
// 采样窗口:200ns → ACQPS = 9
// 触发源:ePWM1 SOCA

// 配置SOC0:采样A0通道,ePWM1触发
AdcRegs.ADCSOC0CTL.bit.CHSEL = 0;      // ADCINA0
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 1;    // ePWM1 SOCA
AdcRegs.ADCSOC0CTL.bit.ACQPS = 9;      // 采样窗口200ns

// 配置SOC1:采样B0通道,ePWM1触发(同步采样)
AdcRegs.ADCSOC1CTL.bit.CHSEL = 8;      // ADCINB0
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 1;    // 同一触发源
AdcRegs.ADCSOC1CTL.bit.ACQPS = 9;      // 采样窗口一致

// 使能同步采样模式
AdcRegs.ADCCTL2.bit.SYNCCNTEN = 1;     // 使能同步计数

这段代码配置了两个SOC,使用同一个触发源。当ePWM1的SOCA事件发生时,ADC会同时采样A0和B0,然后依次转换。结果分别存放在ADCRESULT0和ADCRESULT1中。

⚠️ 注意:同步采样时,两个通道的采样窗口必须一致。否则,一个通道还在充电,另一个已经开始转换了,那就不是真正的“同步”了。

好了,ADC模块的基础就讲到这里。这些参数,在后续的过流保护设定中都会用到。特别是采样窗口和触发源的选择,直接影响保护响应的速度和精度。你先把这些基础打牢,后面实战时才不会手忙脚乱。