从电桥测温到数据采集:ADS1115电路设计与程序调试全解析

📅 2026/7/8 11:15:03 👁️ 阅读次数 📝 编程学习
从电桥测温到数据采集: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 数据读取与转换

读取转换结果分为三步:

  1. 写入配置寄存器启动转换
  2. 等待转换完成(可轮询或使用中断)
  3. 读取转换寄存器(0x00)
int16_t ADS1115_Read() { uint8_t reg = 0x00; // 指向转换寄存器 uint8_t data[2]; I2C_Write(ADS1115_WRITE_ADDR, &reg, 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 软件调试

建议按以下步骤验证:

  1. 先确认能正确读写配置寄存器
  2. 测试固定电压输入(如分压电阻)
  3. 最后接入电桥电路

调试时可以打印原始数据和转换结果:

printf("Raw: %d, Voltage: %.4fV, Temp: %.2fC\n", raw, voltage, temperature);

5.3 精度优化

要提高测量精度,可以考虑:

  • 使用外部精密基准源
  • 增加软件滤波(如移动平均)
  • 定期自动校准零点
  • 在稳定环境中进行多点校准

我在一个冷链监控项目中,通过三点校准(0℃、25℃、50℃)将系统精度提高到了±0.05℃。校准数据保存在EEPROM中,每次上电自动加载。