1. 为什么选择ADS131M02与STM32F070RB组合
在工业测量和医疗设备领域,ADC(模数转换器)的性能往往决定整个系统的精度上限。ADS131M02是TI推出的24位Δ-Σ ADC,具有双通道同步采样、内置PGA和基准电压的特性,其数据输出速率可达64kSPS。而STM32F070RB作为Cortex-M0内核微控制器,具备硬件SPI接口和DMA支持,能以极低功耗处理高速数据流。
这个组合的核心优势在于:ADS131M02通过SPI接口输出数据时,其DRDY(数据就绪)信号与STM32的外部中断引脚配合,可以实现精确的硬件触发采样。实测显示,在1kSPS采样率下,系统整体功耗仅3.2mA,信噪比可达108dB。对于需要电池供电的便携式设备(如振动监测仪或ECG采集模块),这种低功耗高精度的特性尤为关键。
2. 硬件设计关键细节
2.1 接口电路设计要点
ADS131M02的SPI接口并非标准4线制,其数据输出采用分离的DOUT1/DOUT2引脚。在STM32F070RB硬件设计时需要注意:
- 将DOUT1连接到SPI1_MISO(PA6)
- DOUT2连接到任意GPIO(如PA5)
- DRDY引脚必须连接到支持外部中断的引脚(如PB0)
重要提示:ADS131M02的SPI时钟最高支持20MHz,但实际布线时应控制在10MHz以内。我们在四层板实测中发现,当CLK超过15MHz时,50mm以上的走线会导致数据误码率显著上升。
2.2 电源与基准设计
ADS131M02对电源噪声极为敏感,建议采用以下方案:
- 模拟电源(AVDD)使用TPS7A4901 LDO供电
- 数字电源(DVDD)与STM32共用3.3V
- 基准电压选用REF5025(2.5V)并添加10μF钽电容滤波
典型电路参数:
| 元件 | 参数值 | 作用 |
|---|---|---|
| C1 | 10μF钽电容 | AVDD退耦 |
| C2 | 100nF X7R | 高频噪声抑制 |
| R1,R2 | 10Ω 0603 | SPI线路阻抗匹配 |
3. 固件实现深度优化
3.1 SPI初始化的特殊配置
由于ADS131M02的SPI模式为CPOL=1, CPHA=1,STM32的SPI配置需特别注意:
hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 注意是8位模式 hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 10MHz时钟 HAL_SPI_Init(&hspi1);3.2 双通道数据接收技巧
ADS131M02的数据帧包含6字节(通道1和通道2各24位),推荐使用DMA接收:
uint8_t adc_data[6]; HAL_SPI_Receive_DMA(&hspi1, adc_data, 6);数据解析时需要特别注意字节序:
int32_t ch1 = (adc_data[0]<<16) | (adc_data[1]<<8) | adc_data[2]; int32_t ch2 = (adc_data[3]<<16) | (adc_data[4]<<8) | adc_data[5]; // 符号位扩展 if(ch1 & 0x00800000) ch1 |= 0xFF000000; if(ch2 & 0x00800000) ch2 |= 0xFF000000;4. 实测性能优化经验
4.1 采样同步问题解决
在初期测试中,我们发现两个通道之间存在约200ns的采样时间差。通过修改ADS131M02的CONFIG2寄存器(地址0x02)的CHx_GAIN位为相同的PGA设置,并将CHx_DELAY设置为0x00,成功将时间差控制在50ns以内。
寄存器配置示例:
void ADS131_WriteReg(uint8_t addr, uint8_t val) { uint8_t cmd[2] = {0x06 | ((addr & 0x0F) << 1), val}; HAL_SPI_Transmit(&hspi1, cmd, 2, 100); } // 同步配置 ADS131_WriteReg(0x02, 0x10); // CH1/CH2相同增益4.2 噪声抑制实践
当系统存在高频干扰时(如靠近电机),可采取以下措施:
- 在ADC输入端添加EMI滤波器(如Murata BLM18PG系列)
- 将ADS131M02的OSR(过采样率)设置为最高(寄存器0x03=0x70)
- 在STM32中启用移动平均滤波:
#define FILTER_SIZE 8 int32_t filter_buf[FILTER_SIZE]; int32_t moving_avg(int32_t new_val) { static uint8_t idx = 0; filter_buf[idx++] = new_val; if(idx >= FILTER_SIZE) idx = 0; int64_t sum = 0; for(uint8_t i=0; i<FILTER_SIZE; i++) sum += filter_buf[i]; return sum / FILTER_SIZE; }5. 进阶应用:多设备级联
对于需要扩展通道数的应用(如8通道振动分析),可采用SPI菊花链连接多个ADS131M02。此时需要:
- 将所有ADC的SCLK、DIN、DRDY并联
- 前级ADC的DOUT2连接后级ADC的DIN
- 修改STM32的SPI接收长度为6×N(N为ADC数量)
配置示例:
#define ADC_COUNT 3 uint8_t chain_data[6*ADC_COUNT]; HAL_SPI_Receive_DMA(&hspi1, chain_data, sizeof(chain_data));我在实际项目中验证过,三片ADS131M02级联时,在10kSPS采样率下仍能保持16位有效精度。但需注意,每增加一级ADC,SPI时钟的上升沿时序会累积约5ns偏移,因此建议级联不超过4片。