3、模数转换器(ADC)选型与配置:Σ-Δ ADC与SAR ADC对比、分辨率与采样率权衡、参考电压设计、SPI/I2C接口配置
做压传感器测量,ADC选型是绕不开的核心环节。我见过不少工程师,传感器选得挺好,结果ADC没配好,整个系统精度直接拉胯。今天咱们就把ADC这块掰开揉碎了讲清楚。
3.1 Σ-Δ ADC与SAR ADC:两种主流架构的硬碰硬
先说说这两种ADC的本质区别。说白了,SAR ADC就像个急性子,一次比较就能出结果;Σ-Δ ADC则像个慢性子,反复采样、积分、再处理。但慢性子往往更精细。
| 对比项 | Σ-Δ ADC | SAR ADC |
|---|---|---|
| 分辨率 | 16~24位,甚至更高 | 8~16位为主 |
| 采样率 | 通常低于1kSPS(高精度模式) | 可达数MSPS |
| 噪声性能 | 极低,内置数字滤波器 | 中等,依赖外部抗混叠 |
| 功耗 | 较高(尤其高精度模式) | 较低 |
| 典型应用 | 称重、压力、温度 | 数据采集卡、示波器 |
我个人习惯,做压传感器测量,首选Σ-Δ ADC。为什么?因为压传感器输出信号通常很微弱,mV级别,而且变化缓慢。Σ-ADC内部有过采样和数字滤波,能有效抑制工频干扰和噪声。我在一个工业称重项目里用过24位的ADS1232,效果相当稳。
核心结论:压传感器测量,Σ-Δ ADC是更合适的选择。SAR ADC适合高速、低分辨率的场景。
3.2 分辨率与采样率:鱼和熊掌怎么兼得?
很多新手上来就问:「我要24位ADC,采样率要1kSPS。」嗯,这个要求其实挺矛盾的。为什么?因为Σ-Δ ADC的分辨率和采样率是成反比的。
拿ADS1256举例,它有个数据速率寄存器。你设成2.5SPS时,有效分辨率能到23.7位;但设成30kSPS时,有效分辨率就掉到16位左右了。这就是权衡。
// ADS1256 数据速率配置示例
// 寄存器地址 0x02 - DRATE
// 0xF0 -> 2.5 SPS (最高分辨率)
// 0xE0 -> 5 SPS
// 0xD0 -> 10 SPS
// 0xC0 -> 15 SPS
// 0xB0 -> 25 SPS
// 0xA0 -> 30 SPS
// 0x90 -> 50 SPS
// 0x80 -> 60 SPS
// 0x70 -> 100 SPS
// 0x60 -> 500 SPS
// 0x50 -> 1000 SPS
// 0x40 -> 2000 SPS
// 0x30 -> 3750 SPS
// 0x20 -> 7500 SPS
// 0x10 -> 15000 SPS
// 0x00 -> 30000 SPS
void setADCRate(uint8_t rate) {
// 写寄存器命令
SPI_CS_LOW();
SPI_TransferByte(0x50); // 写寄存器命令
SPI_TransferByte(0x02); // 寄存器地址
SPI_TransferByte(rate); // 速率值
SPI_CS_HIGH();
delayMicroseconds(10);
}
我的经验:做静态压力测量,10SPS完全够用。你想想看,压力变化能有多快?除非是做动态冲击测试,否则别盲目追求高采样率。我曾经有个项目,客户非要1kSPS,结果噪声大得没法看,最后降到20SPS,问题全解决了。
3.3 参考电压设计:ADC精度的基石
参考电压,说白了就是ADC的「尺子」。这把尺子不准,后面再好的算法也白搭。
我见过最坑的案例:有人直接用板子上的3.3V电源给ADC做参考电压。结果电源纹波有50mV,ADC的16位分辨率直接废了一半。嗯,这里要注意,参考电压的噪声必须比ADC的LSB小一个数量级。
举个例子,24位ADC,参考电压5V,LSB = 5V / 2^24 ≈ 0.3μV。你想想看,参考电压的噪声得控制在0.03μV以内。普通LDO根本做不到,必须用专用的参考电压芯片。
| 参考电压芯片 | 初始精度 | 温漂 | 噪声(0.1-10Hz) | 适合场景 |
|---|---|---|---|---|
| REF5025 | ±0.05% | 3ppm/°C | 3μVpp | 16位系统 |
| ADR421 | ±0.04% | 1ppm/°C | 1.75μVpp | 20位系统 |
| LTZ1000 | ±0.01% | 0.05ppm/°C | 0.3μVpp | 24位系统 |
避坑指南:我曾经在24位系统里用了REF5025,结果发现噪声还是偏大。后来排查发现,是PCB布局时参考电压走线离数字信号线太近,串扰进来了。记住:参考电压的走线要单独铺地隔离,远离时钟线和SPI线。
3.4 SPI/I2C接口配置:通信的最后一公里
ADC和MCU之间怎么通信?主流就两种:SPI和I2C。我个人更倾向SPI,为什么?速度快、协议简单、抗干扰强。
但I2C也有它的优势:只需要两根线,适合引脚少的MCU。不过I2C的速率上限通常只有400kHz(快速模式),对于高采样率的ADC可能不够用。
下面给个SPI配置的示例,以ADS1256为例:
// SPI初始化配置
void SPI_Init(void) {
// 设置SPI为主模式
// CPOL = 1, CPHA = 1 (模式3)
// 时钟频率: 2.5MHz (ADS1256最高支持10MHz)
SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA);
SPSR = (1 << SPI2X); // 双倍速
}
// 读取ADC数据
uint32_t ReadADC(void) {
uint32_t data = 0;
// 拉低片选
SPI_CS_LOW();
delayMicroseconds(1);
// 发送读取命令 0x01
SPI_TransferByte(0x01);
// 读取3个字节 (24位数据)
data |= (uint32_t)SPI_TransferByte(0xFF) << 16;
data |= (uint32_t)SPI_TransferByte(0xFF) << 8;
data |= (uint32_t)SPI_TransferByte(0xFF);
// 拉高片选
SPI_CS_HIGH();
return data;
}
小技巧:SPI通信时,片选信号一定要干净。我遇到过因为片选抖动导致数据错位的问题,后来在片选引脚上加了个10kΩ上拉电阻,问题就解决了。另外,SPI时钟线尽量短,别超过10cm,否则信号反射会让你头疼。
3.5 知识体系总览
下面这张图把ADC选型与配置的核心逻辑串起来了,你一看就明白:
这张图把ADC选型的四个核心维度都串起来了。你从中心出发,往四个方向看,每个分支都是一个独立的决策点。实际做项目时,我习惯先定架构(Σ-Δ),再定分辨率(24位),然后选参考电压芯片,最后配通信接口。按这个顺序走,基本不会出大问题。
最后说一句:ADC选型没有绝对的「最好」,只有「最合适」。你想想看,一个静态称重系统,用24位Σ-Δ ADC加REF5025,10SPS采样率,SPI通信,这套配置下来,精度做到0.01%完全没问题。但如果你非要用SAR ADC硬上,那可能得在模拟前端花更多功夫。
公众号:蓝海资料掘金营,微信deep3321