AD7175-8与PIC18F87J11在精密信号采集系统中的应用

📅 2026/7/9 11:31:27 👁️ 阅读次数 📝 编程学习
AD7175-8与PIC18F87J11在精密信号采集系统中的应用

1. 为什么选择AD7175-8与PIC18F87J11组合?

在工业测量和精密仪器领域,信号采集系统的性能直接决定了最终数据的可靠性。AD7175-8作为ADI公司推出的32位Σ-Δ型ADC,其核心优势在于:

  • 超低噪声性能:在2.5V参考电压下,有效分辨率可达31位无失码
  • 灵活的输入配置:支持8通道全差分或16通道伪差分输入,输入范围可编程为±VREF/0.625到±VREF/1.25
  • 片上集成PGA:提供1~128倍可编程增益,可直接连接应变计、RTD等传感器
  • 50kSPS采样率:在保持高精度前提下实现快速建立(4.17μs建立至0.001%)

PIC18F87J11作为Microchip的8位MCU,其互补优势体现在:

  • 丰富的外设接口:自带SPI接口(支持25MHz时钟)完美匹配AD7175-8的通信需求
  • 大容量存储:128KB Flash+3.8KB RAM可满足复杂数据处理需求
  • 低功耗特性:运行模式电流仅8.5mA,待机模式低至0.1μA
  • 工业级可靠性:-40℃~85℃工作温度范围,抗干扰能力强

实际项目中发现:AD7175-8的SPI时序要求较严格,PIC18F87J11的硬件SPI模块能可靠满足其最大20MHz时钟需求,而软件模拟SPI在10MHz以上就容易出现时序错乱。

2. 硬件设计关键细节

2.1 模拟前端设计要点

传感器信号进入AD7175-8前需要特别注意:

  1. 抗混叠滤波:根据信号带宽(fBW)计算RC滤波器参数

    f_cutoff = 1/(2πRC) ≤ fBW/2

    例如采集10Hz心电信号时,建议选用3.3nF电容+4.7kΩ电阻组合(截止频率约10.2Hz)

  2. 参考电压设计

    • 使用ADR4525基准源(2.5V初始精度±0.02%)
    • 在REF+与REF-间并联10μF钽电容+100nF陶瓷电容
    • 走线尽量短且对称,避免温度梯度影响
  3. 电源去耦

    • 每个电源引脚配置0.1μF+10μF去耦电容
    • 模拟电源与数字电源通过10Ω电阻隔离

2.2 数字接口设计

PIC18F87J11与AD7175-8的连接方案:

// PIC18F87J11引脚配置 #define ADC_CS LATBbits.LATB0 // 片选 #define ADC_RDY PORTBbits.RB1 // 数据就绪中断 #define ADC_RESET LATBbits.LATB2 // 硬件复位 // SPI初始化代码示例 void SPI_Init() { SSP1STAT = 0x40; // 输入采样中间周期 SSP1CON1 = 0x32; // SPI主模式,时钟=Fosc/16 (20MHz/16=1.25MHz) TRISC5 = 0; // SDO输出 TRISC3 = 0; // SCK输出 }

3. 软件实现核心逻辑

3.1 ADC配置流程

  1. 复位初始化
void ADC_Reset() { ADC_RESET = 0; __delay_ms(10); ADC_RESET = 1; __delay_ms(100); // 等待上电稳定 }
  1. 寄存器配置范例
void ADC_Setup() { // 设置通道0为全差分输入,增益=1 ADC_WriteReg(REG_CHANNEL0, 0x8001); // 配置数据模式:连续转换,禁用滤波器同步 ADC_WriteReg(REG_MODE, 0x0804); // 设置接口模式:连续读取,CRC禁用 ADC_WriteReg(REG_INTERFACE, 0x0040); }

3.2 数据采集优化技巧

  • 中断驱动采集:利用ADC_RDY引脚触发PIC中断
void __interrupt() ADC_ISR() { if(INT0IF && INT0IE) { INT0IF = 0; adc_value = ADC_ReadData(); data_ready = 1; } }
  • 数字滤波处理:在MCU端实现移动平均滤波
#define FILTER_SIZE 8 uint32_t moving_avg(uint32_t new_sample) { static uint32_t buffer[FILTER_SIZE]; static uint8_t index = 0; static uint64_t sum = 0; sum -= buffer[index]; buffer[index] = new_sample; sum += new_sample; index = (index + 1) % FILTER_SIZE; return (uint32_t)(sum / FILTER_SIZE); }

4. 典型应用场景实现

4.1 工业温度监测系统

采用PT100三线制接法时硬件配置:

  1. 恒流源设计:使用REF200提供100μA激励电流
  2. ADC配置:
    • 通道模式:CH0=AIN1(+), AIN2(-)
    • 增益=32,基准电压=2.5V
    • 更新速率=10SPS

温度计算公式:

float PT100_Calc(uint32_t adc_code) { float voltage = (adc_code / 16777216.0) * 2.5 / 32; float resistance = voltage / 0.0001; // 100μA电流 // Callendar-Van Dusen方程 return (resistance - 100.0) / 0.385; }

4.2 振动信号采集方案

针对50Hz~1kHz振动传感器:

  1. 硬件配置:
    • 抗混叠滤波器:二阶Sallen-Key,fc=1.2kHz
    • ADC设置:增益=1,基准=5V,50kSPS采样
  2. 软件处理:
void FFT_Analysis() { // 采集1024点 for(int i=0; i<1024; i++) { while(!data_ready); samples[i] = (int16_t)(adc_value >> 8); data_ready = 0; } // 执行FFT运算... }

5. 调试与性能优化

5.1 常见问题排查

  1. 数据跳动大

    • 检查模拟地数字地单点连接
    • 测量参考电压纹波(应<100μVpp)
    • 验证SPI时钟极性(CPOL=1, CPHA=1)
  2. 采样速率不达标

    • 确认滤波器设置(SYNC引脚电平)
    • 检查SPI时钟频率(示波器测量SCK周期)
    • 优化中断服务程序(移除耗时操作)

5.2 精度提升技巧

  • 内部校准:上电后执行内部零标和满标校准
void ADC_Calibrate() { ADC_WriteReg(REG_MODE, 0x080C); // 内部零标校准 while(ADC_ReadReg(REG_STATUS) & 0x80); ADC_WriteReg(REG_MODE, 0x081C); // 内部满标校准 while(ADC_ReadReg(REG_STATUS) & 0x80); }
  • 温度补偿:利用AD7175-8内部温度传感器
float Read_Temp() { ADC_WriteReg(REG_CHANNEL0, 0x801F); // 选择温度传感器 __delay_ms(100); uint32_t code = ADC_ReadData(); return (code / 16777216.0) * 2.5 * 281.5 - 273.15; }

在实际部署中发现,将AD7175-8的AVDD与DVDD分开供电(均来自LT3042低噪声LDO),可使SNR提升约3dB。对于关键测量应用,建议在PCB上为模拟部分制作完整的法拉第屏蔽笼,这在我参与的某型医疗设备项目中使50Hz工频干扰降低了40dB以上。