第二章 采样时钟与触发源:内部时钟配置、外部触发源选择,抖动对精度的影响
各位同学,咱们接着聊ADC。上一章我把ADC的基本架构讲清楚了,这一章咱们聚焦在「什么时候采」这个问题上。
你想想看,ADC采样就像拍照。快门按早了,画面糊了;按晚了,精彩瞬间错过了。采样时钟和触发源,就是决定这个「快门时机」的关键。
2.1 内部时钟配置:别小看这个分频器
英飞凌的ADC模块,内部都有一个可编程的时钟分频器。我习惯叫它「ADC专用节拍器」。这个节拍器决定了ADC的转换速度。
配置其实不复杂,核心寄存器就几个位域。以TC3xx系列为例,你需要在GxARBCFG寄存器里设置ANODIV字段。
// 伪代码示例:设置ADC时钟分频
IfxGtm_Atom_Timer_Config timerConfig;
IfxGtm_Atom_Timer_InitConfig(&timerConfig, &MODULE_GTM);
timerConfig.clock = IfxGtm_Atom_Timer_Clock_sysClock;
timerConfig.base.resolution = 1000000; // 1MHz 基准时钟
// ADC模块时钟 = 系统时钟 / (ANODIV + 1)
// 假设系统时钟100MHz,想要ADC时钟10MHz
// 则 ANODIV = 100/10 - 1 = 9
GxARBCFG.B.ANODIV = 9;
这里有个坑,我踩过。有一次我把分频系数设得太小,ADC时钟跑到了40MHz。结果转换结果跳得跟心电图似的。后来查手册才发现,不同型号的ADC有最大时钟限制。TC2xx系列一般不超过30MHz,TC3xx系列可以到50MHz。但稳妥起见,我一般留20%余量。
2.2 外部触发源选择:谁说了算?
ADC什么时候开始转换?有三种方式:内部定时器、外部GPIO、软件触发。每种都有它的脾气。
2.2.1 定时器触发:最常用的方式
定时器触发,说白了就是让定时器每隔固定时间给ADC发个「开工」信号。这在电机控制、电源管理里用得最多。
英飞凌的GTM模块和CCU6模块都能产生触发信号。我一般用GTM的TOM通道,配置成PWM模式,然后连接到ADC的触发输入。
// 配置GTM定时器触发ADC
IfxGtm_Tom_Timer_Config tomConfig;
IfxGtm_Tom_Timer_InitConfig(&tomConfig, &MODULE_GTM);
tomConfig.clock = IfxGtm_Tom_Timer_Clock_sysClock;
tomConfig.base.resolution = 100000; // 100kHz 触发频率
tomConfig.base.period = 100; // 每100个时钟周期触发一次
// 触发频率 = 100kHz / 100 = 1kHz
// 也就是每1ms触发一次ADC转换
为什么要用定时器?因为稳定。软件触发受中断延迟影响,时间上会有抖动。定时器是硬件控制的,周期精准。
2.2.2 GPIO触发:外部事件驱动
有些场景,ADC需要响应外部事件。比如过流检测,电流一超标,马上采样。这时候GPIO触发就派上用场了。
配置方法很简单:把GPIO引脚配置成输入,然后连接到ADC的触发输入通道。上升沿、下降沿、双边沿都可以选。
2.2.3 软件触发:调试时的好帮手
软件触发,就是写寄存器启动转换。调试阶段特别好用。你可以单步执行,观察每次转换的结果。
// 软件触发ADC转换
// 设置触发源为软件
GxARBCFG.B.TRIGSEL = 0; // 0表示软件触发
// 启动转换
GxARBCFG.B.SWSTART = 1;
// 等待转换完成
while (GxARBSTS.B.BUSY == 1);
// 读取结果
result = GxRES.B.RESULT;
但注意,正式产品里别用软件触发。中断延迟、任务调度都会引入不确定性。我见过有人用RTOS任务里软件触发ADC,结果采样间隔忽长忽短,控制效果一塌糊涂。
2.3 抖动对精度的影响:看不见的杀手
抖动,英文叫jitter。说白了就是触发信号的时间偏差。这个偏差会直接影响ADC的采样精度。
为什么会这样?因为ADC采样的是模拟信号,信号是随时间变化的。如果触发时间有抖动,你采到的电压值就不准了。
举个例子:一个1kHz的正弦波,幅值5V。如果触发抖动是1微秒,那么电压误差大约是:
误差 ≈ 幅值 × 2π × 频率 × 抖动时间
= 5V × 6.28 × 1000Hz × 1e-6s
= 0.0314V = 31.4mV
31.4mV对于12位ADC来说,相当于25个LSB。这个误差已经很大了。
| 信号频率 | 抖动时间 | 电压误差(12位ADC,5V参考) |
|---|---|---|
| 100Hz | 1μs | 3.14mV (≈2.6 LSB) |
| 1kHz | 1μs | 31.4mV (≈25.7 LSB) |
| 10kHz | 1μs | 314mV (≈257 LSB) |
| 100kHz | 1μs | 3.14V (≈2570 LSB) |
看到没?信号频率越高,抖动的影响越大。所以高频采样时,触发源的稳定性至关重要。
1. 时钟源本身的相位噪声
2. 触发路径上的门延迟变化
3. 电源噪声引起的时序抖动
解决办法:用低抖动时钟源(比如晶振而不是RC振荡器),触发路径尽量短,电源做好去耦。
2.4 实战建议:怎么选?
好了,理论讲完了。咱们说说实际项目里怎么选。
- 电机控制:用定时器触发,频率和PWM同步。我一般用GTM的PWM信号直接触发ADC,这样电流采样和PWM开关动作对齐,控制效果最好。
- 电源管理:用定时器触发,频率固定。比如Buck变换器,每1μs采一次输出电压,做PID控制。
- 过流保护:用GPIO触发,响应要快。比较器输出直接连ADC触发引脚,延迟最小。
- 传感器采集:温度、压力这种慢变信号,定时器触发就行。频率不用太高,100Hz足够了。
嗯,这一章就到这里。下一章咱们聊聊采样时间和保持时间,这两个参数直接影响你采到的信号准不准。到时候我会分享一个我调试了三天才发现的坑,保证让你少走弯路。