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前需要特别注意:
抗混叠滤波:根据信号带宽(fBW)计算RC滤波器参数
f_cutoff = 1/(2πRC) ≤ fBW/2例如采集10Hz心电信号时,建议选用3.3nF电容+4.7kΩ电阻组合(截止频率约10.2Hz)
参考电压设计:
- 使用ADR4525基准源(2.5V初始精度±0.02%)
- 在REF+与REF-间并联10μF钽电容+100nF陶瓷电容
- 走线尽量短且对称,避免温度梯度影响
电源去耦:
- 每个电源引脚配置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配置流程
- 复位初始化:
void ADC_Reset() { ADC_RESET = 0; __delay_ms(10); ADC_RESET = 1; __delay_ms(100); // 等待上电稳定 }- 寄存器配置范例:
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三线制接法时硬件配置:
- 恒流源设计:使用REF200提供100μA激励电流
- 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振动传感器:
- 硬件配置:
- 抗混叠滤波器:二阶Sallen-Key,fc=1.2kHz
- ADC设置:增益=1,基准=5V,50kSPS采样
- 软件处理:
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 常见问题排查
数据跳动大:
- 检查模拟地数字地单点连接
- 测量参考电压纹波(应<100μVpp)
- 验证SPI时钟极性(CPOL=1, CPHA=1)
采样速率不达标:
- 确认滤波器设置(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以上。