1. 项目背景与核心需求
在工业测量、医疗设备和能源监控等领域,高精度模数转换(ADC)是确保数据采集可靠性的关键技术。传统方案往往面临几个痛点:采样精度不足导致信号失真、多通道同步采样难以实现、SPI通信时序稳定性差,以及低功耗需求与高性能之间的矛盾。
ADS131M02作为TI推出的24位ΔΣ ADC,其核心价值在于:
- 双通道同步采样(消除通道间相位差)
- 可编程增益放大器(PGA增益最高128倍)
- 集成负电荷泵(支持-1.3V~1.3V单电源测量)
- 三种功耗模式(HR模式32kSPS,VLP模式1kSPS)
STM32F091RC作为Cortex-M0内核MCU,其优势体现在:
- 硬件SPI接口支持Mode 0/1/2/3
- 内置DMA控制器减轻CPU负载
- 72MHz主频满足实时处理需求
- 低成本与低功耗特性
典型应用场景包括:
- 三相电能计量(需同步采样电压电流)
- 生物电信号采集(ECG/EEG需要高PGA)
- 工业传感器接口(RTD/热电偶小信号放大)
2. 硬件设计关键点
2.1 信号链设计规范
输入前端需要RC滤波(如1kΩ+100nF组合),截止频率计算公式:
f_c = 1/(2πRC) ≈ 1.6kHz对于高频噪声环境,建议增加二阶有源滤波。PGA增益选择需遵循:
最大输入电压 = VREF / 增益当使用内部1.2V基准时,增益设为128对应±9.4mV量程。
2.2 电源设计要点
- 模拟电源AVDD需采用低噪声LDO(如TPS7A4901)
- 去耦电容布局:10μF钽电容+100nF陶瓷电容靠近芯片
- 数字电源DVDD与AVDD需星型连接
- 实测表明,添加铁氧体磁珠(如BLM18PG121SN1)可降低PSRR
2.3 SPI接口优化
STM32F091RC硬件SPI配置建议:
hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 注意:实际数据为24位 hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0 hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA=1 hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 9MHz @72MHz PCLK hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; HAL_SPI_Init(&hspi1);3. 固件实现详解
3.1 寄存器配置流程
上电初始化序列:
- 发送RESET命令(0x11)
- 等待1ms复位完成
- 配置CLOCK寄存器(设置OSR和功耗模式)
- 写入CFG寄存器(增益、通道使能)
- 校准OFFSET和GAIN寄存器
关键寄存器位域示例:
// 设置高分辨率模式,OSR=1024 uint16_t clock_reg = (0x01 << 8) | (0x03 << 4); adc_write_reg(ADC_REG_CLOCK, clock_reg); // 启用CH1+CH2,PGA增益=32 uint16_t cfg_reg = (0x03 << 8) | (0x04 << 4); adc_write_reg(ADC_REG_CFG, cfg_reg);3.2 数据采集实现
推荐使用DMA+中断方案:
// DMA配置 __HAL_LINKDMA(&hspi1, hdmatx, hdma_spi1_tx); __HAL_LINKDMA(&hspi1, hdmarx, hdma_spi1_rx); HAL_DMA_Start_IT(&hdma_spi1_rx, (uint32_t)&SPI1->DR, (uint32_t)rx_buf, 6); // 中断服务程序 void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) { int32_t ch1_data = (rx_buf[0]<<16) | (rx_buf[1]<<8) | rx_buf[2]; int32_t ch2_data = (rx_buf[3]<<16) | (rx_buf[4]<<8) | rx_buf[5]; // 数据转换处理... }4. 性能优化技巧
4.1 噪声抑制实践
- 在PCB布局时,模拟走线需远离时钟线
- 使用屏蔽电缆连接传感器
- 启用ADS131M02内置sinc3滤波器
- 实测数据:添加屏蔽后SNR提升12dB
4.2 时序关键问题
SPI通信必须严格满足时序要求:
- tSU: 最小建立时间15ns(对应最大66MHz CLK)
- tHOLD: 最小保持时间10ns
- 在STM32中通过SPI_CR1的BR[2:0]调节
常见故障排查:
- 无数据返回:检查CS信号是否有效
- 数据错位:确认CPHA/CPOL设置
- 采样值跳动:检查基准电压稳定性
5. 实测数据对比
测试条件:VREF=1.2V,增益=1,输入正弦波1kHz
| 参数 | 理论值 | 实测值 |
|---|---|---|
| ENOB | 19.5位 | 18.7位 |
| THD | -105dB | -98dB |
| 通道间隔离度 | 80dB | 76dB |
| 功耗(HR模式) | 3.5mW | 3.8mW |
校准后线性度测试结果:
输入电压(mV) | 测量值(mV) -------------|----------- 100.0 | 99.87 500.0 | 499.92 1000.0 | 999.896. 进阶应用示例
6.1 三相电能计量实现
void measure_power(void) { float voltage = read_adc_channel(0) * PT_RATIO; float current = read_adc_channel(1) / CT_RATIO; instantaneous_power = voltage * current; // 使用STM32内置CRC计算校验和 uint32_t crc = HAL_CRC_Calculate(&hcrc, (uint32_t*)&instantaneous_power, 2); }6.2 低功耗模式切换
void enter_low_power(void) { // 切换ADC到VLP模式 adc_write_reg(ADC_REG_CLOCK, 0x0020); // 配置STM32进入STOP模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); }实际项目中,通过上述方案可实现:
- 同步采样误差<1μs
- 动态范围达到110dB
- 整机功耗低至5mW(VLP模式)