1. 项目背景与核心器件选型在工业测量和传感器信号采集领域将微弱的模拟信号转换为高精度的数字表示一直是关键挑战。ADS122U04作为TI推出的24位精密Δ-Σ ADC配合STM32L021K4低功耗MCU构成了一个高性价比的解决方案。这个组合特别适合需要长时间电池供电的便携式测量设备比如环境监测仪、医疗穿戴设备等。ADS122U04的核心优势在于其极高的集成度内置可编程增益放大器(PGA)增益范围1~128双匹配可编程电流源(10μA~1.5mA)2.048V基准电压(5ppm/°C温漂)集成温度传感器(±0.5°C精度)UART接口简化隔离设计STM32L021K4作为接收端其超低功耗特性与ADS122U04完美匹配运行模式功耗仅89μA/MHz停止模式电流低至0.46μA内置硬件CRC校验单元丰富的外设接口资源2. 硬件设计关键要点2.1 信号链设计规范对于不同传感器类型的信号调理需求传感器类型输入范围推荐PGA增益电流源配置PT100 RTD0-100mV16-32500μA热电偶±10mV128关闭称重传感器±20mV641mA光敏电阻0-50mV32100μA重要提示当使用高增益时必须确保共模电压在AVDD/2 ±0.3V范围内否则会导致非线性失真。2.2 电源与去耦设计ADS122U04对电源噪声极为敏感建议采用三级滤波初级滤波10μF钽电容 100nF陶瓷电容次级滤波LC滤波网络(22μH 10μF)芯片端1μF 100nF陶瓷电容基准电压引脚需单独处理// 基准电压滤波电路示例 VREF 2.048V (内部基准) │ ├─ 10μF (X7R) └─ 100nF (C0G)2.3 PCB布局注意事项模拟部分与数字部分严格分区ADC的AGND和DGND通过0Ω电阻单点连接敏感走线长度控制在10mm以内避免在ADC下方走数字信号线3. 固件实现与优化3.1 UART通信协议配置ADS122U04采用8-N-1格式的UART波特率自动检测范围1200-115200。建议初始化流程void ADC_Init(void) { // 1. 发送同步字0x55 UART_Send(0x55); // 2. 等待至少50ms让ADC完成波特率检测 Delay(50); // 3. 发送复位命令0x06 UART_Send(0x06); // 4. 配置寄存器 uint8_t config[4] { 0x01, // 寄存器0: PGA128, DR20SPS 0x04, // 寄存器1: 50/60Hz抑制 0x10, // 寄存器2: 启用内部基准 0x00 // 寄存器3: 默认设置 }; UART_SendBytes(config, 4); }3.2 数据采集与处理ADS122U04的输出数据为24位补码格式需进行转换int32_t ReadADC(void) { uint8_t data[3]; UART_Receive(data, 3); // 将24位补码转换为32位有符号整数 int32_t value (data[0] 16) | (data[1] 8) | data[2]; if (value 0x00800000) { value | 0xFF000000; // 符号扩展 } // 转换为实际电压值 float voltage (value * 2.048) / (8388607.0 * 128); return voltage; }3.3 低功耗优化技巧利用STM32的LPUART在低功耗模式下接收数据配置ADC的自动休眠模式(寄存器3[3:2]11)采用DMA传输减少CPU唤醒时间采样间隔大于100ms时完全断电ADC4. 校准与性能验证4.1 系统校准流程零点校准短路输入端记录10次采样平均值作为偏移量增益校准输入精确的满量程50%电压计算增益误差温度补偿利用内置温度传感器建立非线性补偿表校准数据建议存储在STM32的Flash备用区域typedef struct { float offset; float gain; float temp_coeff[3]; // 二阶温度补偿系数 } CalibParams;4.2 噪声性能测试在20SPS、PGA128配置下的典型噪声表现测试条件噪声(μV RMS)ENOB(位)输入短路0.1521.510kΩ源阻抗0.1821.350Hz干扰环境0.2221.04.3 常见问题排查数据跳动大检查电源纹波(10mVpp)验证基准电压稳定性确保PGA增益与输入信号匹配通信失败测量UART线路电平(需AVDD)检查波特率误差(2%)验证同步字发送时序异常功耗确认IDAC电流源是否意外开启检查GPIO引脚负载测量AVDD-DVDD间压差(0.3V)5. 高级应用示例5.1 RTD三线制测量利用ADS122U04的双IDAC实现引线补偿RTD接线 IDAC1 → RTD → RREF IDAC2 → 补偿线 AINP/AINN接RTD两端配置代码// 设置IDAC1IDAC2500μA Registers[0] 0x01; // PGA16 Registers[1] 0x4A; // IDAC1500μA Registers[2] 0x1A; // IDAC2500μA, 内部基准5.2 热电偶冷端补偿利用内置温度传感器实现float ReadTemperature(void) { // 切换到温度传感器模式 WriteRegister(0x02, 0x10); int32_t temp_raw ReadADC(); float temp (temp_raw * 0.03125) / 128; // 0.03125°C/LSB // 切换回正常模式 WriteRegister(0x02, 0x00); return temp; }5.3 多通道扫描通过配置输入多路复用器实现4通道轮询void ScanChannels(void) { const uint8_t mux_cfg[4] {0x00, 0x11, 0x22, 0x33}; for(int i0; i4; i) { WriteRegister(0x00, 0x01 | (mux_cfg[i] 4)); Delay(10); // 等待稳定 float value ReadADC(); // 处理数据... } }在实际部署中我发现一个值得注意的现象当环境温度变化超过10°C时建议重新进行零点校准。特别是在PGA128的设置下温度漂移会导致明显的基线偏移。一个实用的解决方案是在固件中添加自动校准触发条件比如每5°C温度变化或每隔24小时自动执行一次零点校准。