高精度ADC与STM32的μV级信号采集系统设计
1. 项目背景与核心需求在工业测量、医疗设备和环境监测等领域我们经常需要将物理世界中的连续模拟信号转换为数字信号进行处理。模拟信号具有无限可能的值而数字信号则是离散的二进制表示。这种转换过程需要高精度的模数转换器ADC和强大的微控制器协同工作。ADS122U04是TI公司推出的一款24位精密ADC具有低噪声PGA和双匹配电流源特别适合热电偶、RTD和压力桥式传感器等小信号测量。STM32F413RH则是STMicroelectronics的Cortex-M4内核微控制器具有125MHz主频和丰富的外设接口能够高效处理ADC采集的数据。这个项目的核心目标是通过ADS122U04实现μV级精度的模拟信号采集并通过STM32F413RH进行数字滤波和校准最终获得稳定可靠的数字表示。这种组合在需要高精度测量的场合如电子秤、色谱仪等具有重要应用价值。2. 硬件设计与关键电路2.1 ADS122U04接口电路设计ADS122U04采用SPI接口与MCU通信其基准电压设计对精度至关重要。典型电路配置如下// 基准电压部分 AVDD → 3.3V AVSS → GND REFP0 → 2.5V精密基准源(如REF5025) REFN0 → GND // 传感器接口 AINP → 传感器正极 10kΩ滤波电阻 AINN → 传感器负极 10kΩ滤波电阻 // 添加0.1μF陶瓷电容滤除高频噪声关键提示基准电压的稳定性直接影响转换精度建议使用低温漂系数(10ppm/°C)的基准源并远离数字信号走线。2.2 抗干扰设计要点高精度ADC电路易受干扰需特别注意采用星型接地将模拟地(AGND)与数字地(DGND)在芯片下方单点连接电源入口处放置10μF钽电容并联0.1μF陶瓷电容敏感信号线使用屏蔽双绞线长度不超过15cm在AINP/AINN引脚串联100Ω电阻形成RC滤波实测表明良好的布局可使信噪比(SNR)提升15dB以上。3. STM32软件配置与驱动开发3.1 SPI接口初始化STM32F413的SPI需配置为CPOL1, CPHA1模式时钟不宜超过5MHz// SPI1初始化代码 void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; SPI_HandleTypeDef hspi1 {0}; __HAL_RCC_SPI1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); // SCKPA5, MISOPA6, MOSIPA7 GPIO_InitStruct.Pin GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode GPIO_MODE_AF_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); hspi1.Instance SPI1; hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.Direction SPI_DIRECTION_2LINES; hspi1.Init.DataSize SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity SPI_POLARITY_HIGH; hspi1.Init.CLKPhase SPI_PHASE_2EDGE; hspi1.Init.NSS SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_32; // 2.6MHz 84MHz hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; HAL_SPI_Init(hspi1); }3.2 ADS122U04寄存器配置通过SPI配置ADS122U04的工作模式以下示例设置为PGA32, 数据速率20SPSvoid ADS122U_Config(void) { uint8_t config[4] {0}; // Config Register 0: PGA32, MUXAIN0/AIN1 config[0] 0x01; // 0000 0001 config[1] 0x62; // 0110 0010 (20SPS,单次转换模式) config[2] 0x10; // 0001 0000 (REF内部基准使能) config[3] 0x00; // DRDY引脚作为数据就绪信号 HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, config, 4, 100); HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_SET); }4. 数据采集与数字滤波实现4.1 原始数据读取流程int32_t ADS122U_ReadData(void) { uint8_t txBuf[3] {0x12, 0x00, 0x00}; // 读取数据命令 uint8_t rxBuf[3] {0}; int32_t result 0; HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(hspi1, txBuf, rxBuf, 3, 100); HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_SET); result (rxBuf[0] 16) | (rxBuf[1] 8) | rxBuf[2]; if(result 0x800000) result | 0xFF000000; // 符号位扩展 return result; }4.2 数字滤波算法优化针对不同应用场景可采用以下滤波策略移动平均滤波适合稳态信号#define FILTER_SIZE 8 int32_t MovingAverage(int32_t newVal) { static int32_t buffer[FILTER_SIZE] {0}; static uint8_t index 0; static int64_t sum 0; sum - buffer[index]; buffer[index] newVal; sum newVal; index (index 1) % FILTER_SIZE; return (int32_t)(sum / FILTER_SIZE); }IIR低通滤波适合动态信号// α0.1的系数 #define ALPHA 0.1f float IIR_Filter(float newVal) { static float filteredVal 0; filteredVal ALPHA * newVal (1-ALPHA) * filteredVal; return filteredVal; }5. 系统校准与误差补偿5.1 零点与增益校准高精度测量必须进行两点校准零点校准短接AINP和AINN读取100次采样取平均得到偏移量OFFSET满量程校准施加已知精确电压(如2.0V)读取100次采样取平均得到GAIN系数校准公式实际值 (原始读数 - OFFSET) × (标准电压 / (GAIN - OFFSET))5.2 温度补偿实现ADS122U04内置温度传感器可用于补偿float Read_ChipTemperature(void) { uint8_t cmd 0x14; // 启动温度测量 uint8_t data[3] {0}; HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, cmd, 1, 100); HAL_Delay(10); // 等待转换完成 HAL_SPI_Receive(hspi1, data, 3, 100); HAL_GPIO_WritePin(ADC_CS_GPIO_Port, ADC_CS_Pin, GPIO_PIN_SET); int32_t temp (data[0] 16) | (data[1] 8) | data[2]; if(temp 0x800000) temp | 0xFF000000; return (float)temp / 16.0f; // 转换为°C }6. 实测性能与优化建议在实验室条件下测试系统性能测试条件无滤波移动平均IIR滤波输入短接噪声(μV)42152850Hz工频抑制(dB)354560阶跃响应时间(ms)5020080优化建议对于静态测量如电子秤优先选用移动平均滤波动态信号测量建议使用IIR滤波并适当调整α值定期进行自动校准每24小时在PCB上预留屏蔽罩焊盘必要时可加装屏蔽罩