从电桥测温到数据采集:ADS1115电路设计与程序调试全解析
1. 电桥测温原理与ADS1115选型
温度测量在工业控制和物联网设备中非常常见,而电桥电路因其高精度和稳定性成为测温的首选方案之一。PT1000热敏电阻作为电桥的一个桥臂,其阻值会随温度变化,导致电桥输出差分电压信号。这个微弱的电压信号(通常在毫伏级别)需要高精度的模数转换器才能准确采集。
ADS1115作为一款16位精度的ADC芯片,其最小可检测电压变化为0.0078mV(在±0.256V量程下),完全满足电桥测温的需求。相比常见的12位ADC,它的分辨率提高了16倍。我在实际项目中发现,当使用普通MCU内置ADC时,温度波动经常达到±0.5℃,而改用ADS1115后精度可以稳定在±0.1℃以内。
选择ADS1115还有几个重要原因:它内置可编程增益放大器(PGA),支持多种电压量程;采用I2C接口,只需要两根线就能实现通信;芯片自带128SPS的数据速率,既不会拖慢系统响应,又能有效抑制噪声。记得第一次使用时,我尝试用软件模拟I2C协议,结果发现时序总是不稳定,后来改用硬件I2C才解决问题。
2. 电桥电路设计与信号调理
2.1 电桥参数计算
典型电桥电路由四个电阻组成,我们使用PT1000作为温度敏感元件。假设在25℃时PT1000阻值为1000Ω,其他三个桥臂电阻分别取2kΩ、2kΩ和1kΩ。这种非对称设计可以产生更大的输出电压变化。根据分压原理,电桥输出电压Vout = Vin*(R3/(R3+R4) - R2/(R1+R2))。
实际焊接时有个细节要注意:所有电阻都应该选用精度至少1%的金属膜电阻,我曾在测试时发现温度读数漂移,后来发现是用了5%精度的碳膜电阻导致。贴片电阻建议选择0805或更大封装,0603虽然节省空间但手工焊接难度大。
2.2 参考电压与差分信号处理
电桥激励电压的稳定性直接影响测量精度。REF3025是一款2.5V精密电压基准,温漂仅10ppm/℃,比普通LDO稳压效果好得多。在PCB布局时,这个芯片要尽量靠近电桥,走线要粗短,避免引入压降。
ADS1115的差分输入阻抗高达6MΩ,这意味着它几乎不会从电桥汲取电流,保证了测量准确性。但要注意,当电桥输出电压可能为负时(比如温度低于0℃),必须确保ADS1115的AIN0和AIN1引脚电压都在GND-0.3V到VDD+0.3V范围内。我遇到过引脚电压超出范围导致芯片锁死的情况,后来在输入端加了保护二极管才解决。
3. ADS1115硬件连接与配置
3.1 引脚定义与电路连接
ADS1115采用MSOP-10封装,关键引脚包括:
- VDD:2.0-5.5V供电
- GND:接地
- SCL/SDA:I2C时钟和数据线
- A0-A2:地址选择引脚
- ALERT/RDY:中断输出
典型连接方式是将A0-A2接地,这样I2C地址为0x48(写入地址0x90,读取地址0x91)。如果板上有多个ADS1115,可以通过改变这三个引脚的电平来区分。SCL和SDA线要加上拉电阻,一般4.7kΩ即可,长距离传输时可以减小到2.2kΩ。
3.2 电源滤波与抗干扰
虽然ADS1115功耗很低(工作时约0.6mA),但电源滤波仍然很重要。建议在VDD引脚就近放置一个0.1μF陶瓷电容和一个10μF钽电容。有一次我的读数总是有周期性波动,后来发现是电源滤波不足,增加电容后问题消失。
对于高精度应用,还可以考虑以下措施:
- 使用独立电源给模拟部分供电
- 在I2C线上加EMI滤波器
- 保持模拟地和数字地单点连接
- 在PCB底层铺铜作为屏蔽层
4. 程序设计详解
4.1 I2C通信基础
ADS1115采用标准I2C协议,支持100kHz和400kHz速率。初始化时需要配置几个关键参数:
#define ADS1115_WRITE_ADDR 0x90 #define ADS1115_READ_ADDR 0x91 void I2C_Init() { // 初始化硬件I2C,设置时钟频率等参数 // 不同MCU的初始化代码不同 }实际调试时,建议先用逻辑分析仪抓取I2C波形。常见问题包括:
- 起始/停止条件不符合时序要求
- 数据建立时间不足
- 从设备无应答
- 时钟速率设置错误
4.2 配置寄存器设置
ADS1115的配置寄存器(0x01)决定了工作模式,主要关注这几个位:
- OS:单次转换触发位
- MUX:输入通道选择
- PGA:增益设置
- MODE:连续/单次模式
- DR:数据速率
- COMP_*:比较器设置
典型的温度测量配置如下:
void ADS1115_Config() { uint8_t config[3]; config[0] = 0x01; // 指向配置寄存器 config[1] = 0x8B; // 高字节:AIN0-AIN1差分,±0.256V,单次模式 config[2] = 0x83; // 低字节:128SPS,传统比较器,非锁存 I2C_Write(ADS1115_WRITE_ADDR, config, 3); }4.3 数据读取与转换
读取转换结果分为三步:
- 写入配置寄存器启动转换
- 等待转换完成(可轮询或使用中断)
- 读取转换寄存器(0x00)
int16_t ADS1115_Read() { uint8_t reg = 0x00; // 指向转换寄存器 uint8_t data[2]; I2C_Write(ADS1115_WRITE_ADDR, ®, 1); I2C_Read(ADS1115_READ_ADDR, data, 2); return (data[0] << 8) | data[1]; }将原始数据转换为实际电压:
float rawToVoltage(int16_t raw) { float fsr = 0.256f; // 对应±0.256V量程 return (raw * fsr) / 32768.0f; }4.4 负电压处理与温度计算
由于ADS1115输出的是二进制补码,需要先判断符号位:
int16_t raw = ADS1115_Read(); float voltage; if (raw & 0x8000) { voltage = (raw - 65536) * 0.256 / 32768; } else { voltage = raw * 0.256 / 32768; }根据电桥输出电压计算PT1000电阻值:
float R1 = 2000.0f; // 电桥电阻值 float Vref = 2.5f; // 参考电压 float Rt = (2 * Vref * R1) / (Vref - 2 * voltage) - R1;最后通过查表或公式将电阻值转换为温度。PT1000在0-100℃范围内近似线性,可以使用简化公式:
float temperature = (Rt - 1000.0f) / 3.85f;5. 调试技巧与常见问题
5.1 硬件调试
上电前务必检查:
- 电源电压是否正确
- 所有接地是否连通
- I2C上拉电阻是否安装
- 输入信号不超过量程
常见硬件问题及解决方法:
- 读数全为零:检查I2C地址是否正确,芯片是否正常工作
- 读数跳动大:检查电源滤波,缩短信号线长度
- 负电压读数错误:确认输入电压在允许范围内
5.2 软件调试
建议按以下步骤验证:
- 先确认能正确读写配置寄存器
- 测试固定电压输入(如分压电阻)
- 最后接入电桥电路
调试时可以打印原始数据和转换结果:
printf("Raw: %d, Voltage: %.4fV, Temp: %.2fC\n", raw, voltage, temperature);5.3 精度优化
要提高测量精度,可以考虑:
- 使用外部精密基准源
- 增加软件滤波(如移动平均)
- 定期自动校准零点
- 在稳定环境中进行多点校准
我在一个冷链监控项目中,通过三点校准(0℃、25℃、50℃)将系统精度提高到了±0.05℃。校准数据保存在EEPROM中,每次上电自动加载。
