2. C2000过流保护系统硬件基础
ADC模块,说白了就是微控制器的“眼睛”。它把模拟电压转换成数字量,我们才能知道电流到底有多大。C2000系列的ADC,我用了快十年,它的设计思路和普通MCU不太一样。今天咱们就把它拆开看看。
2.1 ADC模块架构:核心部件与数据路径
C2000的ADC,内部其实是一个逐次逼近寄存器(SAR)型转换器。我刚开始接触时,总觉得它就是个黑盒子,直到有一次调试采样值总跳变,才逼着自己把架构吃透。
一个典型的C2000 ADC模块,包含这几个关键部分:
- 模拟多路复用器(MUX):负责选择哪一路模拟信号进入转换器。C2000通常有16个甚至更多模拟输入通道。
- 采样保持电路(S/H):在转换开始前,把输入电压“冻结”住。这个电容的充电时间,直接决定了采样窗口的最小值。
- SAR转换核心:逐位比较,生成12位或16位的数字结果。转换时间由核心时钟决定。
- 结果寄存器:转换完成后,数字值存放在这里。每个通道都有对应的结果寄存器。
- 触发与排序器:控制什么时候开始采样,按什么顺序转换多个通道。
核心要点:ADC的精度和速度,取决于采样窗口是否足够长、转换时钟是否稳定。我在过流保护项目中,就吃过采样窗口太短的亏——采样值不准,保护阈值形同虚设。
下面这张图,是我画的一个简化架构。你看一眼,心里就有谱了。
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的触发源很灵活,我常用的有这几种:
- 软件触发(SW):写寄存器,立即启动。适合调试或非周期性采样。
- ePWM触发:PWM模块产生的事件。这是过流保护最常用的方式——PWM周期开始或中间点触发ADC采样,正好采集电流峰值或谷值。
- 外部GPIO触发:外部信号上升沿或下降沿触发。适合与外部传感器同步。
- 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模块的基础就讲到这里。这些参数,在后续的过流保护设定中都会用到。特别是采样窗口和触发源的选择,直接影响保护响应的速度和精度。你先把这些基础打牢,后面实战时才不会手忙脚乱。