1. 项目背景与核心需求
在工业测量、医疗设备和便携式仪器等领域,高精度模数转换(ADC)是数据采集系统的核心。传统方案往往面临几个痛点:要么使用集成ADC但精度不足(如STM32内置12位ADC),要么外接标准ADC芯片却要面对复杂的驱动开发。而ADS131M02+STM32L152ZD的组合恰好能平衡性能与灵活性。
ADS131M02是TI推出的24位Δ-Σ ADC,具有以下突出特性:
- 双通道同步采样(最高64kSPS)
- 超低噪声(4μVrms at 1kSPS)
- 内置可编程增益放大器(PGA)
- 支持SPI兼容接口
STM32L152ZD作为低功耗MCU代表,其优势在于:
- 超低功耗(运行模式低至214μA/MHz)
- 丰富的外设接口(含硬件SPI)
- Cortex-M3内核提供足够处理能力
这个组合特别适合电池供电的高精度测量场景,比如:
- 便携式医疗设备(心电图、血氧仪)
- 工业传感器变送器
- 能源计量设备
2. 硬件设计关键点
2.1 信号链设计规范
前端模拟电路设计直接影响ADC性能。对于ADS131M02:
输入保护电路:采用TVS二极管+RC滤波(如100Ω电阻+100nF电容)组成抗混叠滤波器,截止频率计算:
f_c = 1/(2πRC) = 1/(2π×100×100×10^-9) ≈ 15.9kHz这个频率应略高于信号带宽但远低于采样率的一半
参考电压选择:使用REF5025提供2.5V基准,其温漂仅3ppm/℃。注意在VREF引脚加10μF+100nF去耦电容
电源去耦:每个电源引脚(AVDD/DVDD)采用10μF钽电容+100nF陶瓷电容组合,布局时电容尽量靠近引脚
2.2 SPI接口硬件连接
ADS131M02的SPI接口有特殊之处:
STM32L152ZD ADS131M02 PA5(SCK) → SCLK PA6(MISO) → DOUT PA7(MOSI) → DIN PB0 → /CS (软件控制) PB1 → DRDY (中断输入)注意要点:
- SCLK最大频率20MHz(需在CubeMX中设置分频)
- 使用硬件SPI1而非模拟SPI以获得稳定时序
- DRDY连接EXTI中断引脚实现事件驱动采样
3. 固件实现详解
3.1 CubeMX基础配置
SPI1配置:
- Mode: Full-Duplex Master
- Hardware NSS: Disabled
- Data Size: 8 bits
- First Bit: MSB First
- Prescaler: 16 (得到10MHz时钟)
- CPOL: High
- CPHA: 2 Edge
GPIO配置:
- PB0: GPIO_Output(片选)
- PB1: GPIO_EXTI(数据就绪中断)
ADC相关参数计算: 假设需要50Hz工频抑制,采样率应设置为:
f_s = N×50Hz (N为整数) 选择N=128 → f_s=6.4kHz在ADS131M02中对应配置寄存器值为0x46
3.2 关键驱动代码实现
寄存器配置函数
void ADS131_WriteReg(uint8_t reg, uint32_t val) { uint8_t txBuf[4] = { 0x06 | (reg << 1), // 写命令+寄存器地址 (val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF }; HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, txBuf, 4, 100); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); }数据读取中断处理
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == DRDY_Pin) { uint8_t rxBuf[8]; HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); HAL_SPI_Receive(&hspi1, rxBuf, 8, 100); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); int32_t ch1 = (rxBuf[1]<<16) | (rxBuf[2]<<8) | rxBuf[3]; int32_t ch2 = (rxBuf[4]<<16) | (rxBuf[5]<<8) | rxBuf[6]; // 处理24位有符号数据 if(ch1 & 0x800000) ch1 |= 0xFF000000; if(ch2 & 0x800000) ch2 |= 0xFF000000; float voltage1 = (ch1 * 2.5) / 8388608.0; // 2^23=8388608 float voltage2 = (ch2 * 2.5) / 8388608.0; } }4. 性能优化与实测
4.1 噪声抑制技巧
数字滤波配置:
- 在ADS131M02中启用内置sinc3滤波器
- 在STM32中实现移动平均滤波(示例):
#define FILTER_SIZE 8 float filterBuffer[FILTER_SIZE]; uint8_t filterIndex = 0; float movingAverage(float newVal) { filterBuffer[filterIndex++] = newVal; if(filterIndex >= FILTER_SIZE) filterIndex = 0; float sum = 0; for(int i=0; i<FILTER_SIZE; i++) { sum += filterBuffer[i]; } return sum / FILTER_SIZE; }
接地策略:
- 采用星型接地,模拟地(AGND)与数字地(DGND)在ADC下方单点连接
- 避免地环路,所有模拟部分走线尽量短
4.2 实测数据对比
配置条件:
- 采样率:1kSPS
- PGA增益:8
- 输入信号:10mVpp @ 10Hz
| 方案 | 噪声(μVrms) | ENOB(位) |
|---|---|---|
| STM32内置ADC | 320 | 9.2 |
| ADS131M02原始 | 8.5 | 20.1 |
| 优化后方案 | 4.2 | 21.8 |
5. 常见问题排查
5.1 SPI通信失败
现象:读取的数据全为0xFF或0x00 排查步骤:
- 用逻辑分析仪检查SCLK/DIN/DOUT波形
- 确认CPOL/CPHA设置与ADC要求一致(ADS131M02需要CPHA=1)
- 检查片选信号是否正常拉低/拉高
- 测量电源电压是否稳定(AVDD=3.3V±5%)
5.2 数据跳动过大
可能原因及解决:
- 参考电压不稳定 → 增加参考源去耦电容
- 输入信号阻抗过高 → 前端加缓冲运放
- 数字噪声耦合 → 优化PCB布局,避免数字信号线靠近模拟部分
5.3 低功耗优化
实测电流对比(3.3V供电):
| 模式 | STM32电流 | ADS131M02电流 | 总计 |
|---|---|---|---|
| 连续采样 | 2.1mA | 1.8mA | 3.9mA |
| 间歇采样(10Hz) | 320μA | 150μA | 470μA |
优化技巧:
- 在DRDY中断唤醒后立即采样,然后返回STOP模式
- 关闭未用外设时钟(如HAL_ADC_DeInit())
- 降低主频到4MHz(仍可满足1kSPS处理需求)