STM32 HAL控制I2C/ADC时voltage通道始终返回0值求助
ADS112C04采集电压始终为0的排查与解决
硬件层面排查
- 确认ADS112C04供电正常:测量VDD引脚电压,确保符合芯片规格(3.3V或5V)
- 检查I2C总线接线:SDA/SCL引脚是否接对,上拉电阻(通常4.7kΩ)是否正确焊接
- 验证外部参考电压:若配置了外部参考(
ADS112C04_VREF_EXT_REF_PINS),需确认REFp和REFn之间接入了2.048V精准参考源;未外接则需修改代码为内部参考 - 检查AIN0输入:确认被测电压正确接入AIN0和AVSS,电压范围需匹配PGA增益后的输入上限(增益1时为0~Vref)
- DRDY引脚电平验证:用示波器查看转换过程中DRDY的电平变化,确认数据就绪时的电平状态
代码逻辑修正
1. DRDY等待条件反向问题
ADS112C04的DRDY引脚默认转换完成后拉低(数据就绪时为低电平),你的代码中错误等待引脚变高,导致超时后跳过数据读取,raw24保持初始0,最终电压为0。修改如下:
// 原错误代码 while (HAL_GPIO_ReadPin(DRDY_GPIO_Port, DRDY_Pin) == GPIO_PIN_RESET) { if ((HAL_GetTick() - start) > ADS112C04_CONVERSION_TIMEOUT) break; } // 修改为:等待DRDY低电平(数据就绪) while (HAL_GPIO_ReadPin(DRDY_GPIO_Port, DRDY_Pin) == GPIO_PIN_SET) { if ((HAL_GetTick() - start) > ADS112C04_CONVERSION_TIMEOUT) break; }
2. 确认设备初始化状态
检查ADS112C04_begin(&hi2c1, 0x40)的返回值,若返回false说明I2C地址错误或设备未响应:
- 匹配硬件ADDR引脚连接:ADDR接GND对应0x40,接VDD为0x41,接SDA为0x42,接SCL为0x43
- 添加调试代码打印
ads_present值,确认设备是否被正确识别
3. 转换数据读取验证
在ADS112C04_getConversionData(&raw24)后添加调试输出,查看raw24实际值:
- 若
raw24始终为0,说明未读到有效数据,需排查I2C通信或设备配置 - 若
raw24非零,再检查电压转换公式是否正确
4. 转换模式配置
ADS112C04默认是单次转换模式,每次ADS112C04_start()仅执行一次转换;若需要连续采集,需添加模式配置:
// 在ADS112C04_begin后添加 ADS112C04_setOperatingMode(ADS112C04_MODE_CONTINUOUS);
初始化配置检查
- 参考电压匹配:若未外接2.048V参考源,需修改参考配置为内部源:
ADS112C04_setVoltageReference(ADS112C04_VREF_INT_2V048);
同时确保ADS_VREF常量与配置一致
- PGA增益同步:确认
ADS_GAIN与实际配置的PGA增益匹配,若修改增益(如设为2),需同步更新该常量
调试建议
- 抓取I2C通信包:用逻辑分析仪或STM32CubeIDE的I2C调试功能,确认寄存器配置和数据读取命令是否正确
- 断点调试:在主循环中设置断点,查看
adc_ch0和voltage_ch0的实时值,确认代码是否进入数据读取分支
内容的提问来源于stack exchange,提问作者Brii
相关产品推荐
相关产品推荐

