STM32F103C8T6 ADC电阻分压测电池电压数值不更新问题求助
排查STM32F103C8T6 ADC分压测压读数不更新的问题
这种读数卡住不动的情况确实让人头大,咱们一步步拆解排查,先从最基础的硬件环节入手,再到软件配置和计算逻辑:
一、先盯紧硬件电路,这是重灾区
- 先测分压后的实际电压:找个万用表,直接测STM32 ADC引脚的输入电压——当电池从6.35V升到6.45V时,看看这个引脚的电压有没有变化。如果硬件输入电压没动,那问题肯定在分压电路或者电池连接上;如果电压动了但ADC读数不变,再往软件方向查。
- 检查分压电阻的精度和阻值:要是用了5%精度的碳膜电阻,阻值漂移很容易掩盖小电压变化,建议换成1%精度的金属膜电阻。同时用万用表实测两个分压电阻的实际阻值,确认分压比((R1+R2)/R2)和你计算时用的数值一致,别把R1和R2搞反了。
- 注意ADC的负载效应:STM32 ADC的输入阻抗有限,如果分压电阻总阻值超过10kΩ,采样时会拉低输入电压,导致读数不准或者响应变慢。建议把总阻值控制在1kΩ~10kΩ之间,保证采样稳定性。
- 排查引脚连接:有没有虚焊、接触不良?用万用表通断档测一下ADC引脚和分压电路输出端的连接,确保线路没问题。
二、检查ADC的软件配置细节
- 确认ADC分辨率和采样时间:STM32F103的ADC是12位的,要是你误配置成8位模式,精度会直接砍到1/16,小电压变化根本检测不出来。另外,采样时间别设太短,建议拉到最长(239.5个周期),让ADC有足够时间完成稳定采样。
- 别忘了ADC校准:每次系统启动时,一定要执行ADC校准!代码里要加上
ADC_ResetCalibration(ADC1);和ADC_StartCalibration(ADC1);,还要等待校准完成(比如用while(ADC_GetFlagStatus(ADC1, ADC_FLAG_CAL) == SET);)。很多时候读数飘或者不更新,就是没做校准的锅。 - 参考电压要靠谱:你用的是内部Vrefint还是外部参考源?如果用内部的,要确保它的稳定性(大概1.2V左右,别用错数值);如果用VDD当参考,那VDD的波动会直接影响读数。条件允许的话,最好用外部精准参考源,计算时也要用准确的参考电压值。
三、核对电压计算逻辑
- 先看原始ADC读数:别直接看计算后的电压值,先把ADC的原始采样值打印出来,看看当电池电压变化时,原始值有没有动。如果原始值动了,那就是计算逻辑的问题;如果原始值也不动,再回到硬件和配置排查。
- 检查分压比和计算式:电池电压的计算式应该是:
Vbat = (ADC_Value * Vref) / 4096 * (R1 + R2)/R2,这里的分压比、参考电压Vref有没有填错?比如把R1和R2搞反,或者Vref用了错误的数值(比如把内部1.2V当成了3.3V)。 - 别过度滤波:如果用了滑动平均之类的滤波,别把滤波窗口设得太大,不然小电压变化会被直接滤掉。可以先把滤波关掉,看看读数是否正常,再慢慢调整滤波参数。
四、其他容易忽略的小问题
- 确认ADC通道配置:有没有把采样引脚正确配置成ADC输入模式?别误设成GPIO输出或者其他功能了。
- 电源去耦:在STM32的VDD引脚加个100nF的陶瓷电容,增强电源稳定性,避免电源波动影响ADC采样。
按照这个顺序排查,应该能快速定位到问题所在。
内容的提问来源于stack exchange,提问作者Lành Trần




