恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

STM32F103外挂ADS1115 16位ADC驱动详解:从I2C配置到精度校准

  • 首页
  • 资讯中心
  • /
  • STM32F103外挂ADS1115 16位ADC驱动详解:从I2C配置到精度校准

相关资讯

Mac安装Homebrew避坑指南:M1/M2/M3与Intel双路径实操 2026/10/15 14:46:17
Smartbi报表设置文档实战:参数联动、单元格扩展与性能调优 2026/10/15 14:46:17
企业AI落地实战:RAG知识库、智能体与GEO增长闭环三阶协同 2026/10/15 14:46:17

最新资讯

S7-1200 ModbusTCP实战:组态、函数块与排错全解析
职场转型:从执行者到管理者的五大思维转变
Clang 16 下 C++20 Niebloid 编译问题排查:从 std::ranges::begin 报错说起
MATLAB三维极坐标绘图实战:从天线方向图数据到surf可视化
老式.doc批量转结构化数据:从批量转换到SQLite全文检索
MinGW-w64实战指南:从安装配置到编译调试与避坑

今日推荐

AI视频生成的时间一致性难题与时空建模演进
基于bbox的PDF文档解析:多栏重排与水印过滤实战
探矿数据进RAG前的清洗全攻略:TXT、Word、PDF、网页四类文档处理实践

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

STM32F103外挂ADS1115 16位ADC驱动详解:从I2C配置到精度校准

发布时间:2026/10/15 14:46:17
STM32F103外挂ADS1115 16位ADC驱动详解:从I2C配置到精度校准 简介面向STM32F103的ADS1115驱动代码包适合嵌入式开发者、STM32入门者以及需要高精度16位ADC采集的物联网、仪器仪表和电池供电类项目。驱动内包含SCL、SDA等引脚注释对照ADS1115芯片手册接线即可验证I2C通信配套工程基于STM32标准外设库覆盖I2C初始化、PGA增益配置、采样率设置、单次/连续转换及读取转换结果等关键环节。压缩包共189个文件以h/c源码、d/o编译中间文件、uvprojx工程文件、hex烧录文件、lst/map链接信息等为主整体约6.69MB同时集成I2C、ADC、定时器等标准外设驱动源码便于移植和二次开发。该驱动支持4路独立差分/单端输入、16位分辨率及可编程增益放大配合官方芯片手册可快速理解寄存器配置已有2845人浏览学习适合初学者作为ADC驱动样板也方便工程师快速集成ADS1115完成模拟量采集。1. ADS1115 对 STM32F103 意味着什么一颗 16 位 ADC 如何简化采集链路做单片机采集最烦的不是写驱动而是信号调理那一摊子事。ADS1115 是 TI 出的 16 位 ΔΣ ADC内置可编程增益放大器PGA、基准源、I2C 接口和比较器一个芯片把前端放大、采样、通信全包了。对 STM32F103 这类没有内部高精度 ADC 的 MCU 来说外挂 ADS1115 等于直接把采集链路从「运放 基准 采样」压缩成「一颗芯片 两根 I2C 线」。实际测试下来用默认 PGA ±6.144V 量程测 3.3V 电压有效分辨率能到 0.1mV 级别比 STM32F103 内置 12 位 ADC 强一个量级。这份驱动代码基于 STM32F103 标准外设库覆盖单次转换、连续转换、PGA 配置和数据速率切换适合做电池电压监测、工业传感器采集、精密仪表这类场景。新手按步骤接线就能跑起来熟手可以直接改宏定义适配自己的 PCB。2. 硬件连接与 I2C 通信机制先把地址、引脚和时序搞清楚2.1 引脚连接与电平匹配三个细节决定成败ADS1115 的电源范围是 2.0V 到 5.5VSTM32F103 常用的 3.3V 供电完全在范围内。SDA 和 SCL 是开漏输出必须接上拉电阻常见做法是接 4.7kΩ 到 VDD。这里有个容易忽略的点如果 STM32F103 是 5V 供电而 ADS1115 用 3.3V 供电I2C 引脚的电平匹配就得处理最简单的方案是给 ADS1115 单独供 3.3VSDA 和 SCL 用两个 MOS 管做电平转换或者干脆用支持 5V 容忍的 GPIO 引脚。ADDR 引脚决定 I2C 地址这是新手最容易踩的坑。ADDR 接 GND 时地址是 0x48接 VDD 时是 0x49接 SDA 时是 0x4A接 SCL 时是 0x4B。如果板上同时挂多颗 ADS1115每个芯片的 ADDR 必须接不同的位置否则地址冲突。实际项目里一般接 GND省事但要注意别跟板上其他 I2C 设备的地址撞了。ALERT/RDY 引脚是可选的中断输出。配置成比较器模式时转换结果超过阈值会拉低这个引脚可以直接接到 STM32F103 的外部中断引脚上做阈值告警。配置成转换完成模式时每一次转换结束都会拉低可以用来做数据就绪信号配合 DMA 或中断读取。2.2 Config 寄存器的 16 位布局增益、速率和模式都是靠 bit 拼出来的ADS1115 的寄存器操作不复杂总共就 4 个寄存器Conversion0x00只读、Config0x01读写、Lo_thresh0x02、Hi_thresh0x03。核心是 Config 寄存器的 16 位配置字每一位都有明确含义。Bit名称功能15OS单次转换启动位写 1 启动一次转换14-12MUX输入多路选择000 是 AIN0-AIN1 差分100 是 AIN0-GND11-9PGA增益设置000 是 ±6.144V001 是 ±4.096V010 是 ±2.048V8MODE0 连续转换1 单次转换默认7-5DR数据速率000 是 8 SPS100 是 1600 SPS4COMP_MODE比较器模式0 传统比较器3COMP_POL比较器极性0 低电平有效2COMP_LAT比较器锁存0 非锁存1-0COMP_QUE比较器触发次数11 禁用比较器PGA 位段是整个配置里最重要的部分因为它直接决定测量量程和分辨率。比如用 ±2.048V 量程时16 位 ADC 的 LSB 是 2.048V / 32768 ≈ 62.5μV这个量程适合测 0-2V 的传感器信号。如果信号可能超过 2V就得用 ±4.096V 或 ±6.144V 量程量程越大 LSB 越大精度越低。实际项目里应该先估算信号的最大幅值再选 PGA不要贪分辨率选小量程然后信号削顶。数据速率位段同样有讲究。8 SPS 时噪声最低但速度慢1600 SPS 时速度快但有效分辨率会下降。ADS1115 是 ΔΣ 型 ADC内部有数字滤波器数据速率越低滤波越强。我一般采集缓慢变化的电压电池、温度用 128 SPS采动态信号才用 475 SPS 以上这样能在速度和精度之间取个平衡。2.3 I2C 读写流程一次完整的单次转换要执行三个步骤ADS1115 的 I2C 通信遵循标准协议地址 7 位最后一位是读写标志。写操作是主机发送设备地址加写位然后发送寄存器指针字节再发送两个配置字节。读操作是主机先发送设备地址加写位和寄存器指针然后重启总线发送设备地址加读位读回两个字节。单次转换的完整流程分三步。第一步向 Config 寄存器写入配置字OS 位写 1 启动转换。第二步等待转换完成如果是单次模式Config 寄存器里的 OS 位会从 1 变成 0轮询这个位就能判断转换是否结束。第三步读 Conversion 寄存器得到 16 位转换结果。注意转换结果是有符号数用差分输入时可能出现负值必须做符号扩展处理。连续转换模式省去了反复启动的过程配置好之后 ADS1115 会按照设定的数据速率不断刷新 Conversion 寄存器。但连续模式有个特点读寄存器的时候可能正好赶上数据更新导致读出高低字节不是同一时刻的。解决方法是先读低字节再读高字节因为 ADS1115 的数据寄存器在低字节被读取时会被锁定直到高字节读完才解锁这个机制叫「字节锁定」。3. 驱动代码实现从软件 I2C 到单次与连续转换的完整流程3.1 软件模拟 I2C 还是硬件 I2CSTM32F103 场景下的选择STM32F103 有硬件 I2C 外设但历史上这个外设的口碑不太好主要问题是时序不稳定、总线锁死时不好恢复。实际开发中很多做 STM32F103 的工程师宁愿用 GPIO 模拟 I2C也不碰硬件外设原因很简单软件模拟 I2C 代码可控、时序透明、出问题好排查而且 ADS1115 的数据速率最高 1600 SPS模拟 I2C 的速率完全够用。这份驱动代码用的就是软件模拟 I2C核心是四个函数起始信号、停止信号、发送字节、接收字节。模拟 I2C 的时钟频率由延时函数控制主频 72MHz 时用几个空循环就能把 SCL 频率压在 100kHz 到 400kHz 之间。代码结构上分两层底层是 I2C 位操作上层是 ADS1115 的寄存器读写和配置。3.2 初始化与单次读取先跑通数据链路以下是驱动代码中初始化与单次读取的核心部分先看 I2C 底层和读取函数#define ADS1115_I2C_ADDR 0x48 // ADDR 接 GND void I2C_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_OD; // 开漏输出 GPIO_Init(GPIOB, GPIO_InitStructure); GPIO_SetBits(GPIOB, GPIO_Pin_6 | GPIO_Pin_7); }GPIO 配成开漏输出这样外部上拉电阻才能把电平拉高。初始化完成后 SDA 和 SCL 默认都是高电平符合 I2C 空闲状态的要求。开漏模式是模拟 I2C 的关键如果用推挽输出多设备通信时会出问题。uint16_t ADS1115_ReadSingleShot(void) { // 配置字OS1 启动转换MUXAIN0-GNDPGA±4.096V128 SPS uint8_t config_high 0x80 | (0x01 4) | (0x01 1); // 1000 0010: OS1, MUX100(AIN0-GND), PGA001(±4.096V) uint8_t config_low (0x01 5) | (0x01 3); // 0010 1000: MODE1 单次, DR100(128SPS), COMP_QUE11 禁用比较器 I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); // 写入操作 I2C_SendByte(0x01); // 指向 Config 寄存器 I2C_SendByte(config_high); I2C_SendByte(config_low); I2C_Stop(); // 等待转换完成轮询 Config 寄存器 OS 位 uint8_t os_flag 0; while (!os_flag) { I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); I2C_SendByte(0x01); I2C_Stop(); I2C_Start(); I2C_SendByte((ADS1115_I2C_ADDR 1) | 0x01); // 读取操作 os_flag I2C_ReadByte(0) 0x80; // 读 Config 高字节 I2C_Stop(); delay_ms(1); // 避免忙等过热 } // 读取 Conversion 寄存器 I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); I2C_SendByte(0x00); I2C_Stop(); I2C_Start(); I2C_SendByte((ADS1115_I2C_ADDR 1) | 0x01); uint8_t hi I2C_ReadByte(1); uint8_t lo I2C_ReadByte(0); I2C_Stop(); return (hi 8) | lo; }逻辑说明这个函数做了两件事先往 Config 寄存器写配置字启动单次转换然后轮询 OS 位等待转换结束最后读回 16 位结果。配置字的位段编排严格按数据手册来OS 位置 1 是启动信号MUX 选 AIN0 对 GND 的单端输入PGA 设成 ±4.096VMODEL 位置 1 表示单次模式。注意配置完寄存器后 I2C 发送指针还停在 Config 寄存器位置不需要重新写指针轮询的时候直接读就好。参数说明ADS1115_I2C_ADDR 这个宏定义在 ADDR 引脚接 GND 时是 0x48如果硬件上 ADDR 接 VDD要改成 0x49。config_high 里的 PGA 位段bit11-9对应代码里的 (0x01 4)因为 MUX 占了 bit14-12 三位PGA 从 bit11 开始所以左移 4 位正好落到 PGA 位段。config_low 里 (0x01 5) 是 DR 位段设成 128 SPS(0x01 3) 是 COMP_QUE 设成 11 禁用比较器。轮询 OS 位的时候如果一直等不到多半是 I2C 通信有问题后面第 4 章专门讲。3.3 连续采集与阈值告警扩展驱动覆盖更多场景连续采集模式适合需要周期性读取数据的场景比如电池电压实时监测。配置一次后ADC 会按设定的数据速率持续刷新结果寄存器不需要反复启动转换。void ADS1115_InitContinuous(void) { uint8_t config_high 0x00 | (0x01 4) | (0x01 1); // OS0 忽略MUXAIN0-GNDPGA±4.096V uint8_t config_low (0x00 5) | (0x01 3); // MODE0 连续转换模式DR128SPSCOMP_QUE11 禁用比较器 I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); I2C_SendByte(0x01); I2C_SendByte(config_high); I2C_SendByte(config_low); I2C_Stop(); } uint16_t ADS1115_ReadContinuous(void) { uint8_t hi, lo; I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); I2C_SendByte(0x00); I2C_Stop(); I2C_Start(); I2C_SendByte((ADS1115_I2C_ADDR 1) | 0x01); hi I2C_ReadByte(1); lo I2C_ReadByte(0); // 读低字节时数据寄存器被锁定 I2C_Stop(); return (hi 8) | lo; }连续模式和单次模式的区别就一个 bitMODE 位段写 0。连续模式下 OS 位不需要动转换结果会自动更新。读连续数据时有个细节如果数据更新发生在读取过程中ADS1115 会锁定数据寄存器直到两个字节都被读走。所以读取顺序一定是先高后低不能反否则可能读到新旧混合的 16 位值。阈值告警是 ADS1115 内置比较器的一个实用功能。配置 Hi_thresh 和 Lo_thresh 之后转换结果超过阈值会触发 ALERT/RDY 引脚变化外部中断就能唤醒 MCU 处理不用一直轮询。阈值寄存器的数值格式跟转换结果一样16 位有符号数配置的时候要按对应的 PGA 量程换算。启用比较器时 COMP_QUE 位段不能设成 11否则比较器被禁用ALERT 引脚不会动作。4. 避坑与常见问题采集值漂移、总线锁死和时序玄学4.1 采集值一直在跳罪魁祸首是 PGA 量程和电源噪声现象同样的输入电压连续读十次结果最低值和最高值差了几十个 LSB换算成电压是几十毫伏的波动。原因最常见的有两个。一个是 PGA 量程选太大±6.144V 量程下 LSB 是 187.5μV输入信号只有 1V量化噪声占了很大比重。另一个是电源纹波直接耦合到模拟输入ADS1115 的 VDD 和参考源是共用的如果供电纹波大转换结果会跟着抖。解决先根据实际信号幅值收缩 PGA 量程。信号最大 2.5V 就用 ±4.096V最大 1.5V 就用 ±2.048V把 LSB 降下来。其次在 VDD 引脚就近加 0.1μF 陶瓷电容和 10μF 钽电容模拟输入走线尽量短而粗避开高频数字信号线。如果还是跳降低数据速率到 32 SPS 或 16 SPS数字滤波器会压制高频噪声。4.2 I2C 总线锁死SDA 被拉低恢复时序比你想的复杂现象程序跑着跑着 I2C 通信突然卡死用示波器看 SDA 一直是低电平SCL 正常翻转MCU 复位也没用。原因模拟 I2C 最怕的就是总线锁死。常见触发条件是通信过程中发生复位或掉电从设备处于半通信状态SDA 被从设备拉住不放。这时候单纯发停止信号没用因为总线已经不在主机控制下。解决我一般会写一个总线恢复函数在初始化 I2C 之前先调用。做法是拉高 SCL然后手动翻转 SDA 最多 9 个时钟周期每次翻转后释放 SDA直到 SDA 变高最后发一个停止信号。这个操作相当于给从设备一个完整的时钟序列让它结束当前的通信状态。代码实现就是几个 GPIO 操作加循环判断放在 I2C 初始化最前面每次上电都强制执行。4.3 I2C 地址配错了读回全 0xFFADDR 引脚的接法决定一切现象写配置寄存器没反应读回来的数据全是 0xFFI2C 通信看起来正常但数据完全是乱的。原因ADS1115 的地址依赖 ADDR 引脚的接法实际项目里 ADDR 没固定好或者飞线接触不良导致地址漂移。还有一种情况是 ADDR 接 SDA 或 SCL 的配置被忽略因为这两个接法依赖引脚状态上电时序不对会识别错误。解决排查时先用逻辑分析仪抓 I2C 波形看发送的地址是不是 0x48。然后检查 ADDR 引脚的焊接和连接确认它被固定到 GND 或 VDD不要悬空。如果是多颗 ADS1115 共用总线每颗的 ADDR 必须接不同位置上电后先扫描总线上所有可能的地址0x48 到 0x4B确认每颗芯片都能被寻址到。4.4 轮询 OS 位永远等不到问题出在配置字本身现象写寄存器后轮询 Config 寄存器的 OS 位一直读不到 0程序卡死在 while 循环里。原因OS 位只有在单次转换模式下才会从 1 变成 0如果配置字里 MODE 位段写成了连续模式OS 位根本不会改变。另外如果 COMP_QUE 位段设成非 11比较器被启用某些配置组合下状态机的行为跟预期不同。解决仔细检查 config_low 里 MODE 位段的设置。单次模式必须写 1也就是 (0x01 8)。另外把 COMP_QUE 设成 11 禁用比较器排除干扰。用逻辑分析仪确认写入的字节跟代码里的宏定义一致防止类型转换问题导致位段错位。4.5 读取结果一直为正数差分输入变成单端MUX 位段设错了现象用差分输入AIN0-AIN1接传感器负向信号读出来是 0没有出现预期的负数结果。原因MUX 位段没设对默认配置选了 AIN0-GND 而不是 AIN0-AIN1。差分模式下信号为负时转换结果是有符号数最高位是符号位如果读回的数字没做符号扩展负数会被当成大正数。解决代码里 MUX 位段在 config_high 的 bit14-12差分 AIN0-AIN1 对应 000单端 AIN0-GND 对应 100。如果用的是差分输入把 MUX 位段改成 000。读回结果后做符号扩展代码是int16_t value (int16_t)raw;C 语言里这个转换会自动做符号扩展不需要手动处理。另外如果信号可能为负PGA 量程也要留足负向余量不能只在正半轴考虑。5. 提升精度的校准方法偏移消除与增益误差修正5.1 偏移校准短路输入测零点把系统误差抠出来ADS1115 出厂有偏移误差虽然出厂校准过但在小增益和小量程下残余偏移仍然可见。实际测试 ±4.096V 量程下短路输入时读数可能偏高或偏低十几到几十个 LSB。校准方法很简单把 ADC 输入对地短路采集 N 次取平均得到偏移量记作 offset之后每次读值都减去这个 offset。int16_t ads1115_offset 0; void ADS1115_CalibrateOffset(uint8_t samples) { int32_t sum 0; for (uint8_t i 0; i samples; i) { sum (int16_t)ADS1115_ReadSingleShot(); delay_ms(10); } ads1115_offset (int16_t)(sum / samples); } int16_t ADS1115_ReadCalibrated(void) { int16_t raw (int16_t)ADS1115_ReadSingleShot(); return raw - ads1115_offset; }逻辑说明校准函数把输入短路后连续采样多次取平均比单次采样更能抑制噪声。实际项目中短路输入要放在靠近芯片的引脚端如果从板端短路走线上的压降也会被算进偏移里。校准完成后每次读取都执行一次减法这个操作不额外占用 I2C 总线时间。参数说明samples 取值建议 8 到 16太少平均效果不明显太多浪费时间10ms 的间隔保证每次采样都是独立的。注意 sum 用 int32_t防止 16 个采样值累加时溢出。测得的偏移量可能是正也可能是负取决于芯片的个体差异。5.2 增益校准用基准源测实际斜率修正比例误差增益误差主要是片内基准源的精度限制导致的一般在 ±0.5% 以内但对高精度测量来说不可忽略。校准方法是用一个已知精度的基准电压比如外部 2.048V 基准源作为输入采集实际读数然后计算修正系数。float ads1115_gain 1.0f; void ADS1115_CalibrateGain(float reference_voltage, uint8_t samples) { float sum 0.0f; for (uint8_t i 0; i samples; i) { int16_t raw ADS1115_ReadCalibrated(); float voltage (float)raw * (4.096f / 32768.0f); sum voltage; } float measured_avg sum / samples; ads1115_gain reference_voltage / measured_avg; } float ADS1115_ReadVoltage(void) { int16_t raw ADS1115_ReadCalibrated(); float voltage (float)raw * (4.096f / 32768.0f); return voltage * ads1115_gain; }逻辑说明增益校准的原理是测量实际比例用已知基准电压除以实测电压得到修正系数。这个系数对所有量程都有效因为增益误差主要是基准源的偏移基准不准会导致所有量程的读数都按同一个比例偏差。校准后测量的电压乘上这个系数就修正回来了。参数说明reference_voltage 必须以实际输出为准不要相信标称值。比如用 2.048V 基准源先用万用表实测是 2.050V 就用 2.050 参与计算。量程常数 4.096f 对应 PGA 设为 ±4.096V 的情况如果换量程要同步改。增益校准和偏移校准按顺序执行先做偏移再做增益增益系数计算时使用的读数必须是偏移修正后的值。5.3 数据平滑滑动平均滤波压制工频干扰ADS1115 的 ΔΣ 调制器对工频干扰有一定抑制能力但数据速率设置在 128 SPS 以上时50Hz 工频的衰减有限。实际采集交流供电环境的传感器信号读数里能明显看到 50Hz 的纹波。简单有效的手段是滑动平均滤波窗口取 16 或 32 个样本能显著压制周期性干扰。#define FILTER_WINDOW 16 float filter_buf[FILTER_WINDOW]; uint8_t filter_index 0; float filter_sum 0.0f; float ADS1115_ReadFiltered(void) { filter_sum - filter_buf[filter_index]; filter_buf[filter_index] ADS1115_ReadVoltage(); filter_sum filter_buf[filter_index]; filter_index (filter_index 1) % FILTER_WINDOW; return filter_sum / FILTER_WINDOW; }逻辑说明滑动平均滤波器的本质是维护一个固定长度的窗口每来一个新样本就丢弃最旧的样本窗口内所有值的均值就是输出。这个实现用了环形缓冲区不需要每次重新求和计算量很小在 STM32F103 上完全不是负担。参数说明窗口长度 16 对应 128 SPS 数据速率时约 125ms 的时间常数能平滑大部分工频纹波。窗口太长会导致响应变慢采集快速变化的信号时反而失真。实际项目中如果信号本身就稳定窗口可以设大一点如果是动态信号建议别超过 8。另外滤波后的数据用于闭环控制时要考虑相位延迟必要时做个一阶补偿。6. 验证驱动的三个手段示波器抓时序、寄存器回读和电压对比测试6.1 用逻辑分析仪抓 I2C 时序确认地址和寄存器字节驱动写完先别急着接传感器直接用逻辑分析仪抓波形是最快的验证方式。重点看三处起始信号后的设备地址是不是 0x48 加写位Config 寄存器的两个字节是否跟预期配置字一致读操作时的设备地址是不是 0x49 加读位。只要这三处对上了I2C 通信链路就是通的。逻辑分析仪的采样率设 1MHz 以上触发条件设成下降沿触发 SDA一次就能抓到完整通信帧。6.2 寄存器回读自检写什么读什么才算初始化成功一个零依赖的验证方法是回读 Config 寄存器把写入的配置原封不动读回来对比。如果读回来的字节跟写入的不一致说明通信链路有数据错位或者地址设错了。代码实现上就是在初始化函数里加一个校验uint8_t ADS1115_VerifyConfig(void) { I2C_Start(); I2C_SendByte(ADS1115_I2C_ADDR 1); I2C_SendByte(0x01); I2C_Stop(); I2C_Start(); I2C_SendByte((ADS1115_I2C_ADDR 1) | 0x01); uint8_t hi I2C_ReadByte(1); uint8_t lo I2C_ReadByte(0); I2C_Stop(); if (hi config_high lo config_low) { return 1; // 配置成功 } return 0; }逻辑说明这个函数把 Config 寄存器的内容读回来跟预期的配置字做逐字节对比。因为 Config 寄存器是只读位段和读写位段的混合体读回唯一能验证的就是写入的值是否被正确接收。如果返回 0重点检查 I2C 地址和设备是否在线。6.3 电压对比测试万用表读数和 ADC 读数要能对上最后一步是实测对比。给 ADC 输入一个已知电压用四位半万用表量实际值然后看 ADC 换算出来的电压。偏差在 ±0.5% 以内说明驱动和硬件都正常如果偏差超过 1%优先检查 PGA 量程设置是否正确再看电源纹波是否过大。从那次做某跨平台系统的采集模块开始我每次写完 ADS1115 驱动都会强制跑一遍这个三步验证流程逻辑分析仪确认时序、寄存器回读确认配置、万用表对比确认精度三个都过了才敢往下做应用层。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号