1. 项目背景与核心需求在工业测量和嵌入式系统开发中将模拟信号精确转换为数字表示是一个基础但至关重要的环节。ADS122U04作为TI公司推出的24位Δ-Σ型ADC配合STM32F767ZI这类高性能MCU能够实现微伏级精度的信号采集。这个组合特别适合需要高精度、低噪声测量的场景比如工业传感器信号采集压力/温度/应变医疗设备生物电信号检测精密仪器仪表2. 硬件选型与关键参数解析2.1 ADS122U04核心特性这款ADC的突出优势体现在24位无失码分辨率实际有效位数(ENOB)可达22位2μV RMS噪声在20SPS速率下内置PGA1-128倍可编程增益双差分输入通道支持全差分和单端配置SPI接口最高4MHz时钟速率实际选型时需注意当使用128倍增益时输入电压范围会缩小到±39mV此时需要确保信号不会超出量程。2.2 STM32F767ZI的适配性选择这款MCU主要基于硬件SPI接口支持4线全双工模式时钟频率可达50MHzDMA支持可实现ADC数据的无CPU干预传输192MHz主频足够处理ADS122U04的高速数据流双精度FPU对24位ADC数据的后期处理至关重要3. 硬件连接设计要点3.1 典型连接电路ADS122U04 STM32F767ZI ┌──────────┐ ┌──────────┐ │ VDD ├──────┤ 3.3V │ │ DGND ├──────┤ GND │ │ DRDY ├──────┤ PE7 │ │ SCLK ├──────┤ PB3(SPI1_SCK) │ │ DOUT ├──────┤ PB4(SPI1_MISO)│ │ DIN ├──────┤ PB5(SPI1_MOSI)│ │ CS ├──────┤ PE4 │ └──────────┘ └──────────┘3.2 电源设计注意事项模拟电源滤波建议使用π型滤波器10μF钽电容 10Ω电阻 0.1μF陶瓷电容在ADC的AVDD引脚附近放置1μF去耦电容参考电压选择内部2.048V参考噪声较低但温漂较大±15ppm/℃外部参考推荐使用REF5025±3ppm/℃4. 软件驱动实现4.1 SPI初始化配置void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; SPI_HandleTypeDef hspi1 {0}; // 时钟使能 __HAL_RCC_SPI1_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); // SPI引脚配置 GPIO_InitStruct.Pin GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; GPIO_InitStruct.Mode GPIO_MODE_AF_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOB, GPIO_InitStruct); // SPI参数配置 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_LOW; hspi1.Init.CLKPhase SPI_PHASE_1EDGE; hspi1.Init.NSS SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_16; // 12MHz HAL_SPI_Init(hspi1); }4.2 ADC寄存器配置示例配置为连续转换模式、20SPS、PGA128void ADS122U04_Config(void) { uint8_t config[4] {0}; // 配置寄存器0PGA128, 连续转换模式 config[0] 0x01; // REG0地址 config[1] 0x86; // PGA128 | 连续转换 // 配置寄存器120SPS, 单次转换模式 config[2] 0x02; // REG1地址 config[3] 0x60; // DR20SPS | 单次转换 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, config, 4, 100); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); }5. 数据采集与处理5.1 数据读取流程sequenceDiagram MCU-ADC: 拉低CS ADC-MCU: DRDY变低(数据就绪) MCU-ADC: 发送读取命令(0x12) ADC-MCU: 返回3字节数据 MCU-ADC: 拉高CS5.2 数据转换算法int32_t Read_ADC_Data(void) { uint8_t rxData[3] {0}; uint8_t cmd 0x12; // 读取数据命令 HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, cmd, 1, 100); HAL_SPI_Receive(hspi1, rxData, 3, 100); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_4, GPIO_PIN_SET); // 将24位数据转换为32位有符号整数 int32_t result (rxData[0] 16) | (rxData[1] 8) | rxData[2]; if(result 0x00800000) { // 检查符号位 result | 0xFF000000; // 符号扩展 } return result; }6. 噪声抑制实践技巧6.1 PCB布局建议地平面分割将模拟地和数字地在ADC下方单点连接使用0Ω电阻或磁珠作为连接点信号走线差分对走线长度差控制在5mm以内避免在ADC输入端附近放置高频信号线6.2 软件滤波方案采用移动平均IIR滤波组合#define FILTER_WINDOW 16 typedef struct { int32_t buffer[FILTER_WINDOW]; uint8_t index; float iir_alpha; float filtered_value; } ADC_Filter; float Process_ADC_Data(ADC_Filter* filter, int32_t raw_data) { // 移动平均 filter-buffer[filter-index] raw_data; filter-index (filter-index 1) % FILTER_WINDOW; int64_t sum 0; for(int i0; iFILTER_WINDOW; i) { sum filter-buffer[i]; } float avg (float)sum / FILTER_WINDOW; // IIR滤波 filter-filtered_value filter-iir_alpha * avg (1 - filter-iir_alpha) * filter-filtered_value; return filter-filtered_value; }7. 校准与性能验证7.1 偏移校准流程短接ADC输入端到地采集100个样本计算平均值→得到偏移误差将偏移值写入校准寄存器或软件补偿7.2 增益校准方法施加已知参考电压如满量程的90%测量实际输出值与理论值的比率在软件中应用校正系数float Apply_Calibration(int32_t raw, float offset, float gain) { return (raw - offset) * gain; }实测数据示例使用1.000V参考源采样次数原始值(LSB)校准后值(V)18154230.999828154971.000538153890.99928. 常见问题排查8.1 DRDY无响应检查步骤确认SPI通信正常用逻辑分析仪抓包测量ADC供电电压AVDD应在2.7-5.25V检查复位引脚是否被意外拉低8.2 数据跳变严重可能原因电源噪声→增加LC滤波参考电压不稳定→更换低噪声基准源地环路干扰→优化接地方案8.3 采样值始终为0排查方向检查输入信号是否超出PGA量程验证寄存器配置是否正确特别是MUX设置测量模拟输入端阻抗应1MΩ