高精度ADC ADS122U04与PIC18F96J65数据采集方案
2026/7/10 13:30:38 网站建设 项目流程

1. 项目背景与核心器件选型

在工业测量、医疗设备和环境监测等领域,将模拟信号转换为高精度数字表示是嵌入式系统设计中的常见需求。ADS122U04作为德州仪器推出的24位ΔΣ模数转换器(ADC),配合PIC18F96J65微控制器,能够构建一套高性价比的精密数据采集方案。

ADS122U04的核心优势在于其集成度与性能参数:

  • 24位无失码分辨率,有效位数(ENOB)可达21.5位
  • 内置可编程增益放大器(PGA),增益范围1~128倍
  • 低噪声性能:50nV RMS(增益=128时)
  • 单周期稳定数字滤波器,支持2kSPS采样率
  • 集成2.048V基准电压源(温漂5ppm/℃)

PIC18F96J65作为主控MCU,其外设资源与ADS122U04形成完美互补:

  • 支持硬件UART接口,与ADC的串行通信无需占用CPU资源
  • 128KB Flash存储空间,可缓存大量采样数据
  • 3.8KB RAM满足实时数据处理需求
  • 100引脚封装提供充足IO扩展能力

2. 硬件系统设计与接口连接

2.1 信号链路设计要点

典型应用场景中,传感器输出信号需经过适当调理才能接入ADC:

  1. 传感器接口:热电偶需冷端补偿,RTD采用恒流源激励
  2. 抗混叠滤波:在AINP/AINN输入端配置RC低通滤波器,截止频率设为采样率的1/10
  3. 共模抑制:差分走线长度匹配控制在5mm以内,必要时使用屏蔽双绞线

关键提示:当测量微小信号(<10mV)时,必须使用四线制接法消除引线电阻影响

2.2 硬件连接示意图

[传感器] -> [信号调理电路] -> ADS122U04 ︱ ↑ └──[激励源] │ UART接口 ↓ PIC18F96J65

具体引脚连接:

  • ADC的TXD接MCU的RC6/UART1RX
  • ADC的RXD接MCU的RC7/UART1TX
  • ADC的DRDY中断接MCU的RB0/INT0
  • ADC的RESET接MCU的RD4

2.3 电源设计注意事项

  1. 模拟电源(AVDD)与数字电源(DVDD)采用磁珠隔离
  2. 每个电源引脚放置10μF钽电容+100nF陶瓷电容去耦
  3. 基准电压引脚(BYPASS)需配置1μF低ESR电容
  4. 电流源供电(IOVDD)应独立于主电源轨

3. 固件开发与寄存器配置

3.1 ADS122U04初始化流程

void ADC_Init(void) { // 硬件复位 ADC_RST = 1; __delay_ms(10); ADC_RST = 0; __delay_ms(100); // 配置寄存器0 (地址0x00) uint8_t config0 = 0x00; config0 |= (0x01 << 5); // PGA增益=2 config0 |= (0x03 << 2); // 数据速率=20SPS UART_Write(0x40); // 写寄存器命令 UART_Write(0x00); // 寄存器地址 UART_Write(config0); // 配置寄存器1 (地址0x01) uint8_t config1 = 0x00; config1 |= (0x01 << 3); // 启用基准电压 UART_Write(0x40); UART_Write(0x01); UART_Write(config1); }

3.2 数据采集任务实现

连续转换模式下的典型数据读取流程:

int32_t Read_ADC_Data(void) { uint8_t data[3]; int32_t result; while(ADC_DRDY); // 等待转换完成 UART_Write(0x10); // 发送读取命令 data[0] = UART_Read(); data[1] = UART_Read(); data[2] = UART_Read(); result = (data[0] << 16) | (data[1] << 8) | data[2]; if(result & 0x00800000) { // 处理24位有符号数 result |= 0xFF000000; } return result; }

3.3 校准与补偿技术

  1. 偏移校准:短接输入端,读取100次取平均作为零偏
  2. 增益校准:施加已知参考电压,计算比例系数
  3. 温度补偿:利用内置温度传感器修正热漂移
float Apply_Calibration(int32_t raw, float temp) { static float offset = 0.0; static float gain = 1.0; static float temp_coeff = 50.0e-6; // ppm/℃ float calibrated = (raw - offset) * gain; return calibrated * (1 + (temp - 25.0) * temp_coeff); }

4. 系统优化与噪声抑制

4.1 PCB布局关键准则

  1. 模拟与数字区域严格分区,间距至少5mm
  2. 敏感走线远离时钟线和电源线
  3. 接地策略:
    • 采用星型接地,ADC的AGND作为中心点
    • 数字地通过0Ω电阻单点连接模拟地
  4. 电源层与地层相邻布置,形成耦合电容

4.2 软件滤波算法

结合ADC内置滤波与软件后处理:

  1. 移动平均滤波(窗口大小8~16)
  2. 中值滤波(适用于脉冲干扰)
  3. IIR低通滤波(截止频率可调)
#define FILTER_DEPTH 8 int32_t Moving_Average(int32_t new_sample) { static int32_t buffer[FILTER_DEPTH]; static uint8_t index = 0; static int64_t sum = 0; sum -= buffer[index]; buffer[index] = new_sample; sum += new_sample; index = (index + 1) % FILTER_DEPTH; return (int32_t)(sum / FILTER_DEPTH); }

4.3 动态性能优化技巧

  1. 采样率与滤波器设置平衡:
    • 高精度模式:≤20SPS,启用50Hz/60Hz抑制
    • 快速模式:≥200SPS,关闭数字滤波
  2. PGA增益自动切换算法:
    void Auto_Range_Control(void) { int32_t raw = Read_ADC_Data(); if(abs(raw) > 0x7FFFFF) { Decrease_Gain(); } else if(abs(raw) < 0x0FFFFF) { Increase_Gain(); } }
  3. 电源管理:在采样间隔切换至待机模式

5. 典型应用场景实现

5.1 热电偶温度测量系统

硬件配置:

  • 类型K热电偶,测量范围0~1300℃
  • 冷端补偿使用MCP9808温度传感器
  • ADS122U04配置:
    • 增益=64
    • 基准电压=2.048V
    • 采样率=10SPS

软件处理流程:

  1. 读取ADC原始值并转换为电压
  2. 获取冷端温度
  3. 查表法计算热电势
  4. 多项式补偿非线性
float Read_Thermocouple(void) { int32_t adc = Read_ADC_Data(); float voltage = (adc * 2.048f) / 8388607.0f; // 24位有符号转电压 float cj_temp = Read_Cold_Junction(); // 读取冷端温度 // 查表法计算温度 float emf = voltage * 1000.0f; // mV float temp = 0.0f; for(uint8_t i=0; i<LOOKUP_TABLE_SIZE; i++) { if(emf >= emf_table[i] && emf < emf_table[i+1]) { temp = temp_table[i] + (emf - emf_table[i]) * (temp_table[i+1] - temp_table[i]) / (emf_table[i+1] - emf_table[i]); break; } } return temp + cj_temp; // 冷端补偿 }

5.2 工业4-20mA电流环采集

接口设计:

  • 250Ω精密采样电阻
  • RFI滤波器:100Ω+100nF
  • 保护电路:TVS管+自恢复保险丝

配置要点:

  1. ADS122U04工作模式:
    • 差分输入AIN0/AIN1
    • 增益=1
    • 基准电压=外部4.096V
  2. 电流计算:
    float Current_Loop_Convert(int32_t raw) { float voltage = (raw * 4.096f) / 8388607.0f; return (voltage / 250.0f) * 1000.0f; // mA }

5.3 电子秤应用实现

关键参数:

  • 称重传感器:350Ω桥式,2mV/V灵敏度
  • 激励电压:5V(产生10mV满量程输出)
  • ADS122U04配置:
    • 增益=128
    • 基准电压=内部
    • 数据速率=80SPS

数字滤波方案:

  1. 硬件级:启用sinc3滤波器
  2. 软件级:
    #define WEIGHT_SAMPLES 10 float Read_Weight(void) { static float samples[WEIGHT_SAMPLES]; static uint8_t idx = 0; samples[idx] = Read_ADC_Data() * 0.000122f; // 转换为克 idx = (idx + 1) % WEIGHT_SAMPLES; // 去除最大最小值后平均 float sum = 0, min = samples[0], max = samples[0]; for(uint8_t i=0; i<WEIGHT_SAMPLES; i++) { sum += samples[i]; if(samples[i] < min) min = samples[i]; if(samples[i] > max) max = samples[i]; } return (sum - min - max) / (WEIGHT_SAMPLES - 2); }

6. 调试与故障排除

6.1 常见问题诊断表

现象可能原因解决方案
读数跳变大电源噪声检查去耦电容,增加LC滤波
零偏不稳定接地环路改为星型接地,断开地线环路
线性度差基准电压问题测量REFIN电压,检查负载电流
通信失败波特率不匹配确认双方均为115200bps,校验位一致

6.2 性能验证方法

  1. 信噪比测试:

    • 输入短路,记录1000个样本
    • 计算RMS噪声 = stddev(samples)
    • SNR = 20log10(FSR/(2RMS))
  2. 线性度测试:

    void Test_Linearity(void) { float voltages[] = {0.1,0.5,1.0,1.5,2.0}; // V for(uint8_t i=0; i<5; i++) { Apply_Voltage(voltages[i]); int32_t adc = Read_ADC_Data(); float error = (adc/8388607.0*2.048) - voltages[i]; printf("Input:%.2fV, Error:%.2f%%\n", voltages[i], error*100/2.048); } }

6.3 抗干扰增强措施

  1. 空间干扰:

    • 为ADC添加屏蔽罩
    • 敏感走线包地处理
  2. 传导干扰:

    • 电源入口安装共模扼流圈
    • 信号线串联磁珠
  3. 时序优化:

    void Critical_Sampling(void) { Disable_Interrupts(); Start_Conversion(); while(!Data_Ready()); Read_Data(); Enable_Interrupts(); }

在实际项目中,这套方案可实现±0.01%的测量精度。通过合理配置ADS122U04的寄存器参数和优化PCB布局,我们成功将系统噪声降至5μVpp以下。特别是在电池供电应用中,利用ADC的单次转换模式可将平均功耗控制在150μA以下,非常适合便携式检测设备。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询