1. 项目背景与核心器件选型
在工业测量、医疗设备和精密仪器等领域,高精度模拟信号采集一直是系统设计的关键难点。AD7175-8作为Analog Devices公司推出的24位Σ-Δ型ADC,其出色的噪声性能和灵活的通道配置,使其成为精密测量系统的理想选择。这款ADC具有以下突出特性:
- 8/16通道差分输入配置
- 可编程数据输出速率从5SPS到250kSPS
- 积分非线性误差(INL)仅为±0.0015%FSR
- 内置可编程增益放大器(PGA),增益范围1~128
- 多种数字滤波器选项(sinc3、sinc5+sinc1等)
与之搭配的PIC18F87K22微控制器是Microchip公司针对嵌入式控制应用推出的8位MCU,其特点包括:
- 高达64MHz的工作频率
- 128KB Flash程序存储器
- 3.9KB RAM
- 丰富的外设接口(5个SPI/I2C模块)
- 低至1.8V的工作电压
这对组合能够满足大多数中高精度测量场景的需求,特别是在需要多通道采集的场合。AD7175-8通过SPI接口与PIC18F87K22通信,其硬件连接框图如下:
模拟信号源 → 信号调理电路 → AD7175-8(ADC) ↔ SPI ↔ PIC18F87K22(MCU)2. 硬件系统设计与接口配置
2.1 信号输入电路设计
AD7175-8支持多种输入配置方式,在实际应用中需要根据信号特性选择合适的设计方案:
单端输入配置:
- 适用于对地参考的信号源
- 最大输入电压范围:±VREF/增益
- 典型应用电路:
SIGNAL_IN → 10kΩ → AINx+ | 100nF → AGND
差分输入配置:
- 适合抑制共模噪声的场合
- 输入阻抗典型值为200kΩ
- 推荐使用仪表放大器作为前端:
SIGNAL → INA128 → 100Ω → AINx+ | 100Ω → AINx-
关键提示:无论采用哪种配置,都应在ADC输入端添加RC低通滤波器(如1kΩ+100nF),以抑制高频噪声干扰。
2.2 SPI接口硬件连接
PIC18F87K22与AD7175-8的SPI接口连接需要特别注意时序匹配:
| PIC18F87K22引脚 | AD7175-8引脚 | 功能说明 |
|---|---|---|
| RC3/SCK | SCLK | SPI时钟 |
| RC5/SDO | DIN | 主机输出 |
| RC4/SDI | DOUT/RDY | 主机输入 |
| RB2/CS | CS | 片选信号 |
硬件设计要点:
- SPI时钟频率建议设置在1MHz以下以确保稳定通信
- CS信号线应添加10kΩ上拉电阻
- DOUT/RDY线可配置为中断触发模式,提高系统效率
2.3 参考电压设计
参考电压的稳定性直接影响ADC精度,推荐设计方案:
外部基准方案:
- 使用ADR445(5V)或ADR434(3.3V)等高精度基准源
- 添加0.1μF+10μF去耦电容
- 典型电路:
VREF_OUT → 10Ω → AD7175-8 REFIN+ | 100nF → AGND
内部基准方案:
- AD7175-8内置2.5V基准(±5mV初始精度)
- 需通过配置寄存器启用
- 适合对成本敏感的应用
3. 固件设计与关键代码实现
3.1 SPI通信初始化
PIC18F87K22的SPI模块需要正确配置以匹配AD7175-8的时序要求:
void SPI_Init(void) { // 配置SPI主模式,时钟极性=1,相位=1 SSP1CON1 = 0b00110010; // SPI主模式,时钟=Fosc/64 SSP1STAT = 0b11000000; // 数据在时钟下降沿传输 // 配置引脚方向 TRISC3 = 0; // SCK输出 TRISC5 = 0; // SDO输出 TRISC4 = 1; // SDI输入 TRISB2 = 0; // CS输出 CS_ADC = 1; // 初始时取消选择ADC }3.2 ADC寄存器配置
AD7175-8有丰富的配置寄存器,典型初始化流程如下:
void ADC_Init(void) { // 1. 复位ADC ADC_WriteRegister(REG_RESET, 0x00); __delay_ms(10); // 2. 配置接口模式 ADC_WriteRegister(REG_INTERFACE, 0x01); // 连续读取模式 // 3. 设置通道0为差分输入(AIN1+, AIN1-) ADC_WriteRegister(REG_CH0, 0x01); // AIN1+ -> AIN1- // 4. 配置采样率(10SPS)和滤波器类型 ADC_WriteRegister(REG_FILTER, 0x0A); // Sinc3滤波器 // 5. 启用内部基准 ADC_WriteRegister(REG_REF, 0x01); }3.3 数据采集实现
高效的数据采集需要考虑RDY信号和SPI时序的配合:
uint32_t ADC_ReadData(void) { uint8_t buffer[3]; uint32_t result = 0; while(RDY_PIN == 1); // 等待数据就绪 CS_ADC = 0; // 选择ADC // 读取3字节数据(24位) buffer[0] = SPI_Transfer(0xFF); buffer[1] = SPI_Transfer(0xFF); buffer[2] = SPI_Transfer(0xFF); CS_ADC = 1; // 取消选择ADC // 组合数据 result = ((uint32_t)buffer[0] << 16) | ((uint32_t)buffer[1] << 8) | (uint32_t)buffer[2]; return result; }4. 系统校准与性能优化
4.1 校准流程实现
AD7175-8支持多种校准模式,系统上电时应执行校准:
void ADC_Calibrate(void) { // 1. 内部零标度校准 ADC_WriteRegister(REG_MODE, 0x04); // 启动校准 while(ADC_ReadRegister(REG_STATUS) & 0x80); // 等待完成 // 2. 内部满标度校准 ADC_WriteRegister(REG_MODE, 0x08); while(ADC_ReadRegister(REG_STATUS) & 0x80); // 3. 系统校准(可选) if(DO_SYSTEM_CAL) { ADC_WriteRegister(REG_MODE, 0x0C); while(ADC_ReadRegister(REG_STATUS) & 0x80); } }4.2 噪声抑制技巧
提高测量精度的实用方法:
数字滤波优化:
- 对于慢变信号,选择sinc5+sinc1滤波器组合
- 调整输出数据速率(ODR)平衡噪声和响应速度
电源去耦设计:
- AVDD和DVDD分别添加10μF+0.1μF电容
- 模拟和数字地单点连接
PCB布局要点:
- 保持模拟信号走线远离数字线路
- 使用地平面分割技术
- 缩短ADC基准电压走线
5. 典型应用案例
5.1 温度测量系统
利用AD7175-8的高精度特性构建热电偶测量系统:
硬件配置:
- 通道0:热电偶输入(MAX31855作为冷端补偿)
- 通道1:PT100温度传感器
- 参考电压:外部4.096V基准
软件处理:
float Read_Temperature(void) { uint32_t adc_value = ADC_ReadData(); float voltage = (adc_value / 16777216.0) * 4.096; return (voltage - 1.25) / 0.005; // 热电偶转换公式 }
5.2 振动监测系统
多通道同步采集实现机械振动分析:
系统配置:
- 使用4个差分通道采集加速度计信号
- 采样率设置为10kSPS
- 开启50Hz/60Hz工频抑制滤波器
数据处理流程:
void Process_Vibration(void) { for(int i=0; i<4; i++) { ADC_SelectChannel(i); vib_data[i] = ADC_ReadData(); } FFT_Analysis(vib_data); // 执行频谱分析 }
6. 调试技巧与常见问题
6.1 典型故障排查
无数据输出:
- 检查SPI时钟极性/相位设置
- 验证CS信号是否正常切换
- 测量基准电压是否稳定
数据跳变严重:
- 检查输入信号是否超出范围
- 验证电源去耦是否充分
- 尝试降低SPI时钟频率
通道间串扰:
- 确保未使用通道被禁用
- 检查多路复用器切换时间设置
- 增加通道切换后的稳定时间
6.2 性能测试方法
静态参数测试:
- 使用高精度电压源输入直流信号
- 记录100个采样点计算标准差
- 绘制传递曲线分析非线性误差
动态性能测试:
- 输入1kHz正弦波信号
- 采集1024点做FFT分析
- 计算信噪比(SNR)和有效位数(ENOB)
在实际项目中,我发现AD7175-8的基准电压稳定性对系统精度影响极大。曾有一个案例,由于基准电源去耦不足,导致测量结果出现周期性波动。后来在基准引脚添加了10μF钽电容并联0.1μF陶瓷电容后,噪声水平降低了60%。这也提醒我们,高精度ADC设计必须重视电源质量。