24位ΔΣ ADC与STM32的高精度数据采集系统设计 1. 项目背景与核心需求在工业测量、医疗设备和环境监测等领域将模拟信号精确转换为数字表示是一项基础且关键的技术需求。传统8位或12位ADC模数转换器的分辨率往往难以满足高精度测量要求而24位ΔΣ型ADC凭借其优异的噪声抑制能力和高分辨率特性成为精密测量系统的首选方案。ADS122U04是德州仪器TI推出的一款24位精密ΔΣ模数转换器具有以下突出特性内置可编程增益放大器PGA增益范围1~128倍低噪声性能50nV RMS增益128时集成2.048V精密基准电压源温漂典型值5ppm/°C支持单周期稳定数字滤波UART兼容接口简化与MCU的连接STM32F469II作为STMicroelectronics的高性能MCU具备180MHz Cortex-M4内核带FPU丰富的外设接口包括多个USART2MB Flash384KB RAM的大存储容量硬件CRC校验单元适合实时信号处理的DSP指令集这对组合能够实现微弱信号的高精度采集如热电偶、RTD、称重传感器输出工业环境下的抗干扰测量温度、压力、流量等物理量的数字化监测电池供电设备的低功耗数据采集2. 硬件系统设计与连接2.1 ADS122U04关键电路设计电源配置模拟电源AVDD3.0~5.5V建议使用LDO稳压器如TPS7A4700数字电源DVDD1.65~3.6V可与MCU共用电源去耦电容AVDD和DVDD各需10μF钽电容0.1μF陶瓷电容并联输入信号调理// 典型差分输入配置 AINP ──┬── 10kΩ ──┐ │ ├─ 0.1μF ── GND AINN ──┼── 10kΩ ──┘ │ └── 1MΩ电阻对地提供直流路径基准电压选择内部基准2.048V默认启用外部基准通过REF_SEL跳线选择3.3V或4.096V基准旁路电容建议2.2μF X7R陶瓷电容2.2 STM32F469II接口设计UART连接配置ADS122U04 STM32F469II TXD ────── PA10 (USART1_RX) RXD ────── PA9 (USART1_TX) DRDY ────── PE6 (EXTI6中断) RESET ────── PE5 (GPIO输出)注意ADS122U04的UART波特率固定为115200bps8数据位无校验1停止位2.3 PCB布局要点模拟与数字地分割使用磁珠或0Ω电阻单点连接AGND和DGND模拟部分布局在ADC芯片一侧信号走线原则差分输入走线等长、等距避免数字信号线平行穿越模拟区域基准电压走线尽量短且粗热管理发热元件如LDO远离ADC芯片必要时添加散热过孔3. 软件实现与配置3.1 ADS122U04寄存器配置关键寄存器设置示例// 配置寄存器0 (地址0x00) #define CONFIG0_DEFAULT 0x0C // PGA1, DR20SPS, 连续转换模式 // 配置寄存器1 (地址0x01) #define CONFIG1_DEFAULT 0x04 // 内部基准温度传感器禁用 // 配置寄存器2 (地址0x02) #define CONFIG2_DEFAULT 0x10 // 50Hz陷波滤波使能 // 配置寄存器3 (地址0x03) #define CONFIG3_DEFAULT 0x00 // 默认IDAC设置寄存器写入函数实现void ADS122U04_WriteReg(uint8_t reg, uint8_t val) { uint8_t cmd[2] {0x40 | (reg 2), val}; HAL_UART_Transmit(huart1, cmd, 2, HAL_MAX_DELAY); HAL_Delay(1); // 等待配置完成 }3.2 数据采集流程中断驱动采集实现// DRDY中断回调函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin GPIO_PIN_6) { uint8_t cmd 0x10; // 读取数据命令 uint8_t data[3]; HAL_UART_Transmit(huart1, cmd, 1, HAL_MAX_DELAY); HAL_UART_Receive(huart1, data, 3, HAL_MAX_DELAY); int32_t raw (data[0] 16) | (data[1] 8) | data[2]; if(raw 0x800000) raw | 0xFF000000; // 符号扩展 // 触发数据处理回调 if(DataReadyCallback) DataReadyCallback(raw); } }3.3 数据校准与处理偏移校准算法#define CAL_SAMPLES 100 int32_t PerformOffsetCalibration(void) { int64_t sum 0; ADS122U04_StartSync(); for(int i0; iCAL_SAMPLES; i) { while(!DRDY_Asserted()); // 等待转换完成 sum ReadADCData(); } return (int32_t)(sum / CAL_SAMPLES); }电压计算函数float RawToVoltage(int32_t raw, float vref, uint8_t gain) { // 24位有符号数转电压 float lsb vref / (gain * 8388607.0f); // 2^23-1 return raw * lsb * 1000.0f; // 返回mV值 }4. 系统优化与性能提升4.1 噪声抑制技术数字滤波优化根据信号频率调整数据速率5~2000SPS启用50Hz/60Hz陷波滤波器CONFIG2[4]软件滤波算法#define FILTER_WINDOW 16 typedef struct { int32_t buffer[FILTER_WINDOW]; uint8_t index; } MovingAverageFilter; int32_t FilterSample(MovingAverageFilter* filter, int32_t newSample) { filter-buffer[filter-index] newSample; filter-index (filter-index 1) % FILTER_WINDOW; int64_t sum 0; for(int i0; iFILTER_WINDOW; i) { sum filter-buffer[i]; } return (int32_t)(sum / FILTER_WINDOW); }4.2 低功耗设计睡眠模式管理void EnterLowPowerMode(void) { // 发送单次转换命令 uint8_t cmd 0x08; HAL_UART_Transmit(huart1, cmd, 1, HAL_MAX_DELAY); // 配置MCU进入STOP模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); }动态配置切换void AdjustForSignalRange(float expectedVoltage) { if(expectedVoltage 0.5f) { SetPGA(ADC_GAIN_128); } else if(expectedVoltage 2.0f) { SetPGA(ADC_GAIN_32); } else { SetPGA(ADC_GAIN_1); } }4.3 温度补偿实现利用内置温度传感器float ReadInternalTemperature(void) { // 启用温度传感器模式 ADS122U04_WriteReg(0x01, 0x84); HAL_Delay(100); int32_t raw ReadADCData(); return (float)raw * 0.03125f; // 0.03125°C/LSB }外部传感器补偿void ApplyTemperatureCompensation(float temp) { // 根据温度特性曲线计算补偿值 float offset temp * temp * 0.0023f temp * 0.15f - 0.78f; CalibrationData.tempOffset (int32_t)(offset / CurrentLSB()); }5. 实测数据与性能分析5.1 静态特性测试测试条件输入电压0~2.048VPGA1环境温度25±1°C采样率20SPS测试结果输入电压(mV)测量均值(mV)标准差(μV)INL(LSB)0.00.122.10.5500.0500.082.3-0.31000.0999.922.00.71500.01500.152.2-0.22000.01999.892.40.45.2 动态特性测试FFT分析1kHz正弦输入频率分量 幅值(dBFS) 1kHz -0.12 2kHz -86.4 3kHz -92.1 50Hz -102.3ENOB有效位数计算SNR 106.2dB (实测) ENOB (SNR - 1.76)/6.02 17.3位5.3 实际应用案例电子秤系统实现#define LOADCELL_MV_PER_V 2.0f // 2mV/V规格的称重传感器 float ReadWeight(void) { static float calibrationFactor 1.0f; int32_t raw ReadADCData(); float voltage RawToVoltage(raw, 2.048f, 128); // 假设激励电压为5V float weight (voltage / (5.0f * LOADCELL_MV_PER_V)) * calibrationFactor; return weight; }热电偶测量实现float ReadThermocouple(void) { // 使用通道0测热电偶通道1测冷端温度 float hotJunction RawToVoltage(ReadChannel(0), 2.048f, 128); float coldJunction ReadInternalTemperature(); // 查表法计算温度简化示例 return ColdJunctionCompensate(hotJunction, coldJunction); }通过实际验证这套系统在工业温度测量中可实现±0.5°C的精度K型热电偶0-400°C范围在电子秤应用中可实现1/10,000的分辨率。硬件设计中特别要注意模拟前端的抗干扰处理软件上则需要合理配置ADC的滤波参数和采样速率。