1. 项目背景与核心需求
在工业自动化、环境监测和医疗设备等领域,我们经常需要将传感器采集的模拟信号(如温度、压力、振动等)转换为数字信号进行处理。传统方案使用分立式ADC芯片和微控制器组合,往往面临电路复杂、通信效率低下的问题。LTC1864这款16位高精度ADC与PIC18F97J60微控制器的组合,提供了一种高度集成的解决方案。
PIC18F97J60是Microchip公司推出的8位微控制器,内置以太网MAC和PHY,特别适合需要网络连接的嵌入式应用。其双SPI接口为高速数据传输提供了硬件基础。而LTC1864作为Linear Technology(现属ADI)的16位SAR型ADC,具有±2.5V的宽输入范围和250ksps的采样率,在工业级温度范围内保证无失码。
这个组合的核心价值在于:
- 通过SPI接口实现硬件级无缝连接,省去额外的电平转换电路
- PIC18F97J60可直接处理ADC数据并通过以太网传输
- 完整的信号链解决方案,从模拟输入到数字输出仅需两个主要芯片
2. 硬件设计与接口连接
2.1 LTC1864关键特性与配置
LTC1864采用单电源2.7V至5.25V供电,典型功耗仅3.5mW(在5V电源和100ksps时)。其引脚配置如下:
| 引脚 | 名称 | 功能描述 |
|---|---|---|
| 1 | VIN+ | 正模拟输入 |
| 2 | VIN- | 负模拟输入 |
| 3 | GND | 地 |
| 4 | REF | 参考电压输入(2.5V典型值) |
| 5 | SDO | 串行数据输出 |
| 6 | SDI | 串行数据输入(用于菊花链配置) |
| 7 | SCK | 串行时钟输入 |
| 8 | CONV | 转换启动信号 |
| 9 | CS | 片选(低电平有效) |
| 10 | VCC | 电源(2.7V至5.25V) |
实际连接时需注意:
- REF引脚建议使用低噪声基准源,如LT6654
- 模拟输入端应添加RC滤波(如1kΩ+100nF)
- 布线时保持模拟和数字地分离,在芯片下方单点连接
2.2 PIC18F97J60的SPI接口配置
PIC18F97J60提供两个独立的SPI模块,我们使用SPI1连接LTC1864。关键寄存器配置如下:
// SPI1初始化代码示例 SSP1CON1 = 0b00100010; // SPI主模式,时钟= Fosc/64 SSP1STAT = 0b01000000; // 数据采样在中间,时钟上升沿发送 PIE1bits.SSP1IE = 0; // 禁用中断(使用轮询方式)硬件连接示意图:
PIC18F97J60 LTC1864 RC3(SCK1) ------> SCK RC5(SDO1) ------> SDI RC4(SDI1) <------ SDO RA5(CS) ------> CS RB0 ------> CONV注意:CONV信号可使用任意GPIO控制,建议选择带中断能力的引脚以便精确控制采样时序。
3. 软件实现与通信协议
3.1 LTC1864的SPI通信时序
LTC1864采用特殊的SPI时序要求:
- 拉低CS启动通信
- 在CONV上升沿开始转换(转换时间约1.2μs)
- 在转换期间发送配置字(控制单端/差分模式等)
- 转换完成后自动输出数据
典型操作序列:
void LTC1864_Read(uint16_t *data) { CONV_PIN = 0; // 启动转换 __delay_us(1); // 等待tCONV CONV_PIN = 1; CS_PIN = 0; // 使能SPI通信 SSP1BUF = 0x80; // 发送配置字(单端CH0) while(!SSP1STATbits.BF); // 等待发送完成 *data = SSP1BUF << 8; // 读取高字节 SSP1BUF = 0x00; // 发送空字节获取低字节 while(!SSP1STATbits.BF); *data |= SSP1BUF; CS_PIN = 1; // 结束通信 }3.2 数据格式转换与校准
LTC1864输出为二进制补码格式,需转换为实际电压值:
float ConvertToVoltage(uint16_t adc_value) { // 假设使用2.5V参考电压 float voltage; if(adc_value & 0x8000) { // 负数 voltage = (int16_t)adc_value * 2.5 / 32768.0; } else { // 正数 voltage = adc_value * 2.5 / 32767.0; } return voltage; }为提高精度,建议实施两点校准:
- 在已知电压V1(如0.5V)下读取ADC值D1
- 在已知电压V2(如2.0V)下读取ADC值D2
- 计算实际转换公式:V = a*D + b
4. 系统集成与性能优化
4.1 抗干扰设计要点
在工业环境中需特别注意:
- 在电源引脚添加10μF钽电容+0.1μF陶瓷电容组合
- 模拟输入走线使用双绞线或屏蔽线
- 数字信号线上串联22Ω电阻减少振铃
- 避免将高频数字信号(如PWM)靠近模拟线路
4.2 采样速率优化技巧
要实现最高250ksps采样率:
- 使用DMA传输SPI数据(PIC18F97J60支持)
- 预配置SPI缓冲区减少软件开销
- 采用中断驱动方式而非轮询
示例DMA初始化:
DMASRC = (uint16_t)&dummy_tx; // 传输源地址 DMADST = (uint16_t)&adc_data; // 目标地址 DMACNT = 2; // 传输2字节 DMACON = 0x80C0; // 使能DMA, SPI1为触发源4.3 以太网数据传输实现
利用PIC18F97J60内置的以太网模块,可将ADC数据实时上传:
void SendADCData(uint16_t data) { uint8_t packet[20]; // 构建UDP数据包 sprintf(packet, "ADC:%.3fV", ConvertToVoltage(data)); // 使用Microchip的TCP/IP协议栈 UDPBegin(1234); // 本地端口 UDPPutString(packet); UDPSend(remoteIP, 5678); // 目标IP和端口 }5. 常见问题与调试技巧
5.1 信号失真诊断
若发现采集信号异常:
- 检查参考电压稳定性(用示波器观察REF引脚)
- 验证输入信号在±2.5V范围内
- 测试SPI时钟质量(应干净无振铃)
- 确认CONV信号时序满足tCONV > 1.2μs
5.2 SPI通信失败排查
当无法读取数据时:
- 用逻辑分析仪捕获SPI信号
- 检查CS信号是否正常拉低
- 确认时钟极性(CPOL)和相位(CPHA)设置
- 测量电源电压是否在2.7-5.25V范围内
5.3 提高测量精度的实践
从我的项目经验看,这些措施很有效:
- 在ADC输入端添加1kΩ电阻与100nF电容组成抗混叠滤波器
- 对同一信号连续采样8次取平均可降低噪声约3倍
- 定期自动校准零点(短接输入测量偏移)
- 保持PCB温度稳定(温度变化会引起增益漂移)
我在一个工业温度监测项目中,通过上述方法将系统精度从±1.5%提升到±0.3%,关键是在信号输入端使用了仪表放大器(如LTC6915)将小信号放大到接近满量程。