1. 为什么ESP32锂电池电量检测总在“翻车”这几年用ESP32做便携式项目的人越来越多但凡涉及电池供电十有八九都要做电量检测。但你去各个社区转一圈会发现凡是问“为什么我测出来的电压不对”“为什么电池刚充满就显示没电”“为什么睡眠电流高得离谱”的帖子几乎都是贴着同一个标签锂电池电量检测。我也在这些坑里进进出出很多次所以这篇想把整个链路从头到尾捋一遍——从引脚选哪个、分压电阻怎么取到ADC读取、校准映射再到低功耗下怎么把待机电流压到几十微安级全部串起来讲清楚。先说结论ESP32做锂电池电量检测本身并不复杂绕来绕去就是三件事——分压电路的正确设计、ADC通道的正确选择、以及采样时机和功耗的权衡。三者缺一不可任何一个环节偷懒都会让最终电量显示变成“玄学”。这篇不只给解决方案还会把每个选择背后的原理讲明白方便你迁移到其他型号、其他电池上。我默认你用的是常见的ESP32开发板比如NodeMCU-32S、DevKitC这类外接18650或3.7V聚合物锂电池。硬件上需要两个电阻用来分压、一个电容滤波用、可选的一个N-MOS管用来在睡眠时彻底关断分压通路软件上则建议用Arduino IDE或ESP-IDF。接下来按“选引脚→配电路→写代码→校准→优化功耗”的顺序一步步拆解该给的数据我给全该避开的坑我也逐个列出。在正式动手之前先花两分钟想清楚一个问题为什么锂电池不能直接接到ESP32的ADC引脚上。原因不深奥就是量程不匹配。满电的锂电池端电压在4.2V左右放完电约3.0V“标准”3.7V只是标称电压。而ESP32的ADC输入范围仅0~3.3V部分开发板还能更低。直接把电池正极接到GPIO上轻则读数始终饱和在4095重则在充电或负载波动时直接击穿引脚内部的ESD保护二极管。所以必须通过电阻分压把电池电压按比例压到ADC可测的区间内这只是第一步后面还有更细的坑在等你。2. 引脚选择ADC1是主力ADC2在Wi-Fi面前只能“靠边站”2.1 两个ADC控制器到底差在哪ESP32芯片里集成了两个12位逐次逼近型ADC统称ADC1和ADC2属于SAR型模数转换器。12位意味着满量程输出0~4095对应参考电压下的0~满量程。两者的硬件指标基本一致但软件层面的差异非常大ADC2的所有通道只要Wi-Fi模块工作在Active状态就会被强制占用。这一点是ESP32最坑人的地方之一。它的Wi-Fi硬件和ADC2有不少信号通道复用的关系实际表现是当Wi-Fi收发数据时同一个核在处理ADC2的采样请求时会直接返回无效结果。我用旧版本Arduino核心测过在连接Wi-Fi期间连续读取ADC2通道会拿到大量为0或重复值的异常数据时间点完全随机。所以凡是需要“边联网边采样”的项目电量检测通道一律走ADC1的GPIO32~GPIO39这几个引脚。ADC2留给那些不需要常开Wi-Fi的场景或者只在Wi-Fi关闭后采集。这条经验最早我是在一次网关项目里踩出来的设备大致每5秒通过Wi-Fi上报一次当前电池电压我随手选了GPIO26ADC2通道结果后台报表里的电压曲线跟心电图一样后来换成GPIO34立竿见影。顺带提醒一句GPIO34到GPIO39这六个引脚是“纯输入”引脚没有内部上拉/下拉也不能输出PWM。它们在数字量输入场景里经常被忽略但在模拟采样场景里反而非常合适因为少了上下拉电阻对分压电路的干扰采样结果更“干净”。2.2 衰减档位怎么配直接决定能测多大电压ESP32的ADC是有衰减设置的简单说就是内部给模拟输入信号加了一级可配置的电压缩放网络。Arduino环境下对应的配置函数是analogSetPinAttenuation(pin, ADC_11db)ESP-IDF里则是adc1_config_channel_atten(chan, ADC_ATTEN_DB_11)。默认标称衰减范围如下0dB档理论量程约1.1V2.5dB档约1.5V6dB档约2.2V11dB档约3.9V左右。很多人第一次做锂电池检测时会想当然地认为“只要接了分压电阻衰减档随便配配就行”实测下来误差巨大。这是因为不同衰减档位下ADC的输入阻抗和线性区、饱和区都不一样。我们要测锂电池分压后最高点大约在2.1V左右4.2V对半开后面会细算。这个电压落在11dB档的可靠测量区内另外用6dB档其实也能测到2.2V的量程但11dB档在校准后的线性表现更可预测社区里一致推荐。注意官方的衰减表只是“参考”同一批次芯片的实测特性也会漂移真正靠谱的做法是选定衰减档位之后用万用表做一次性两点校准把偏移误差吃掉。如果你用的是Arduino开发环境有些旧版本核心对衰减档配置的默认值处理得不太好建议在setup()里显式配置不要依赖默认值。别把这件事当“写了等于没写”我就是吃过默认配置的亏读数偏差了差不多300mV才发现原因。2.3 别用ESP32模组自带的拉力关于引脚选择的最后一个细节是GPIO36/39在部分开发板上有外部上下拉电阻。比如某些自制底板为了防悬空在GPIO36上贴了10K上拉到3.3V在GPIO39上贴了10K下拉到地。这对数字量输入没影响但接到分压网络后分压比会被改变。严格来说这不算ADC1的锅而是“开发板引脚附加网络”的锅。我见过更离谱的情况是底板预留了锂电池检测电路上面焊了分压电阻用户却没有看到原理图又外接了一套分压电阻读到的电压永远比实际低三分之一。经验法则先把原理图拿到手确认GPIO上有没有板载分压电阻或上下拉再决定你外部电路怎么画。3. 分压电路设计与参数计算小电阻省事大电阻保命3.1 经典的分压结构先说最简单的电路电池正极串联一个上臂电阻R1分压点接GPIO再串一个下臂电阻R2到地。分压点的电压就等于Vbat * R2 / (R1 R2)这是初中物理内容但工程细节都在电阻阻值的选择上。为了让4.2V的满电电压出现在ADC量程的安全区分压比取1/2最直接R1和R2选一样的阻值。这样4.2V分压后是2.1V3.0V分压后是1.5V全程落在ESP32 ADC 11dB档的0~3.9V量程内余量充足且不需要外部钳位二极管。我用的推荐组合是R1R2100K并联一个0.1μF100nF的滤波电容到地。为什么选100K而不是10K或1K这是整篇里第一个关键权衡且听我往下拆。3.2 电阻阻值大到底图什么核心原因是漏电流。分压网络从电池正极到地会形成一条持续放电通路电流约为Vbat / (R1 R2)。用两个1K电阻时这条通路在4.2V下的耗流是2.1mA一天就是约50mAh一年就是18Ah——对一块18650来说相当于几天就放光了。而两个100K电阻的耗流只有21µA降到一天0.5mAh量级完全不同。不过在低功耗设计里21µA依然不可忽略。如果睡眠目标电流是20µA总量分压网络这21µA直接顶掉了整个预算。所以更严谨的方案是“分压网络受开关控制”平时不采样时用MOS管把下臂电阻接地的那端断开采样前MOS导通几百毫秒读完立刻断开。这个思路我在第5节专门展开。再说电容的作用。ADC内核采样时会有瞬态电荷注入如果你给ADC输入信号源的内阻过高对100K不低采样值就会因为电荷来不及补充而产生跌落。在分压点并联一个100nF电容相当于给ADC准备了一个小水库瞬间能补充电荷让信号趋势变稳。取值上的细节电容太小滤波效果差电容太大又会让电压变化响应迟钝电池电压本身变化慢所以0.1µF到1µF是比较合理的区间。3.3 用MOS管把“耗电大户”管起来如果想做真正的低功耗推荐在R2和地之间串联一个N-MOS管比如2N7002或AO3400栅极接ESP32的一个普通GPIO。采样时把GPIO拉高MOS导通分压网络正常工作采样结束立刻拉低MOS关断整条分压通路完全断开。这里有个细节要留意MOS管导通电阻Rds(on)是毫欧级相对100K电阻来说完全可以忽略不干扰分压比例但栅极不能悬空ESP32掉电或复位时引脚会短暂高阻为了避免MOS误开启导致电池持续漏电最好在栅极加一个100K下拉电阻。这个下拉电阻本身也会耗电但它的阻值远大于分压网络的等效电阻待机漏电大约几百纳安可以接受。如果你希望更简单也可以把MOS开关放在R1和电池正极之间效果一样只是要用P型MOS管走高端开关。我更推荐N-MOS放低端因为驱动逻辑简单引脚拉高就导通不必担心Vgs裕量不足。4. 软件实现ADC读取、滤波和Vbat换算4.1 配置一组稳妥的采样参数在Arduino环境中推荐在setup()开头做如下配置analogReadResolution(12); // 12位分辨率0~4095 analogSetPinAttenuation(34, ADC_11db);这个配置告诉ADCGPIO34的输入衰减为11dB量程约为0~3.9V。注意analogReadResolution(12)要放在analogSetPinAttenuation前面部分核心的默认分辨率可能被其他库改掉显式设置最稳。实测中ESP32 ADC对小信号和接近满量程的区域非线性都比较明显。比如输入0.5V以下时读数会“飘”在2.5V以上时又容易提早饱和。锂电池分压后的区间基本在1.5V~2.1V算是整个量程里线性度相对好的区域但仍然建议做软件校准不推荐“自信直读”。4.2 采样叠加滤波让读数不再“跳楼”单次ADC读取的抖动通常有±30~50mV等效值对电量显示来说不能接受。处理手段有两种可以配合使用第一连续采多次取平均。典型做法是200次延迟2ms的采样取均值或者用滑动窗口滤波维护一个长度为N的队列每来一个新值就丢掉最旧的取队列平均值。滑动窗口的优势是实时性更好我这里给一个常用的代码片段const int pinBat 34; const int samples 32; uint32_t raw_sum 0; for (int i 0; i samples; i) { raw_sum analogRead(pinBat); delay(2); } uint16_t analog raw_sum / samples;32次这个数量级基本能把随机噪声压到可接受范围如果你对实时性要求不高可以提到64或128次效果更好。但要小心在低功耗场景下采样期间MCU是醒着的采样次数越多唤醒时间越长电流消耗越大。第二在分压点并联滤波电容也就是硬件上那只100nF。软件滤波解决的是数字噪声硬件电容解决的是模拟噪声和ADC电荷注入二者不能互相替代。两条路一起走效果才理想。4.3 从ADC原始值到电量的完整公式链拿到经过滤波的ADC值之后需要经过四步换算原始值→引脚实际电压→电池实际电压→开路电压估算→剩余电量百分比。第一步原始值转引脚电压。float pinVoltage (float)adc_value / 4095.0f * 3.9f;3.9V是11dB档的满量程参考值这只是粗算值。想更准你得用已知电压源做一个两点校准把引脚接到0V记录ADC值应当接近0接到2.4V记录ADC值然后以这两点拟合成一条线性直线把4095和3.9的固定假设替换掉。第二步引脚电压反推电池电压。float vbat pinVoltage * (R1 R2) / R2;假设R1R2100K则系数为2.0。这个系数看似简单但给出一个工程细节实际电阻有1%甚至5%的误差系数需要用万用表实测R1和R2的实际阻值来算。100K标称值的电阻实测可能是98.3K和101.6K最终电量显示差异能有几十毫伏对精度要求高的项目来说不算小事。第三步考虑分压通路通断带来的电压跌落。如果分压网络一直连通Vbat就是刚才算出来的值如果用了MOS控制分压网络那么在MOS断开的“开路状态”下测不到电压必须在MOS导通后再采样。实测发现一个刚接上满载Wi-Fi发射的ESP32电池端电压瞬间跌落能到200mV以上这个“带载电压”直接换算成剩余电量会低估。稳妥做法是采样前关闭大功率外设或者做多次采样、取最高值当近似开路电压。我在做法上选的是取5次启动采样中的最大值实测误差能控制在合理范围内应对绝大多数场景足够。第四步电压映射到剩余电量百分比。锂电池放电曲线不是一条直线不同倍率下中间平台电压差异也很大。这里提供一个简化双点线性映射满电开路电压4.1V对应100%截止电压3.3V对应0%然后float soc (vbat - 3.3f) / (4.1f - 3.3f) * 100.0f; if (soc 100.0f) soc 100.0f; if (soc 0.0f) soc 0.0f;注意这只是一个非常粗的估算实际锂电池平台期在3.6V~3.9V之间变化平缓完全线性映射会出现“中间50%挂了很久两头瞬间掉电”的现象。如果要做成品建议换用查表法以0.01V为步长保存一张典型放电曲线表运行时用插值查表。你可以在网上找到带容量的SOC电压表或者用放电仪实测自己手头电池生成一条定制表。这一点在后面“常见问题”里我还想再提一次。5. 低功耗优化从毫安级压到微安级5.1 先算账电流都去哪了低功耗优化不是“少打几个delay”就完事先把电流账算清楚。ESP32在深度睡眠模式下RTC域和ULP协处理器继续运行的典型电流大约是10µA左右。分压网络如果一直挂着按100K100K算耗流约10µA到21µA。加上LED指示灯、稳压器静态电流、上拉电阻等杂项一个看似什么都没干的“深度睡眠”系统很容易就跑到80µA以上。我在一次巡检项目里遇到过一个很典型的失败设计设备用18650电池供电深度睡眠时整机电流高达1.2mA算下来电池几个月就亏空。后来逐个排查发现罪魁祸首就是“一直连通的分压电阻”和“常亮的电源指示灯”。把分压网络用MOS管控制、把电源指示灯改成仅开机闪一下甚至直接移除整机睡眠电流立竿见影地降到了18µA。5.2 采样一次的成本时间×电流低功耗场景下除了研究“睡眠时”还要研究“醒来采样时”。每次从深度睡眠唤醒、等待系统稳定、执行ADC采样、再睡回去整个过程都有额外电流消耗。假如唤醒后采样0.1秒、电流60mA然后睡回去单次唤醒的平均贡献大概是60mA * 0.1s / 3600s ≈ 1.67µAh。如果一天唤醒4次才不到7µAh可以忽略不计。但坏就坏在很多人习惯采样时开Wi-Fi上传数据。Wi-Fi连接需要的时间往往在1到3秒期间平均电流200mA以上单次就吃掉大约0.17mAh。一天传4次就是0.7mAh一年约250mAh对于一块2000mAh的电池来说会明显缩短续航。所以我的建议永远是测电压和发数据要当成两件事来设计。如果你只是要电量显示别在每次采样时都去连网。5.3 深度睡眠下怎么反复测量并醒得更聪明在ESP32上让系统周期性唤醒并不难用esp_sleep_enable_timer_wakeup()设置定时器然后esp_deep_sleep_start()即可。下面的示例展示了一个完整的“每1小时唤醒一次→测电压→回睡眠”的流程#include driver/adc.h #include esp_sleep.h #define BAT_PIN GPIO_NUM_34 #define MEAS_EN_PIN GPIO_NUM_4 void battery_measure_enable(bool en) { digitalWrite(MEAS_EN_PIN, en ? HIGH : LOW); } void setup() { pinMode(MEAS_EN_PIN, OUTPUT); digitalWrite(MEAS_EN_PIN, LOW); // 配置ADC analogReadResolution(12); analogSetPinAttenuation(34, ADC_11db); // 使能分压网络 battery_measure_enable(true); delay(50); // 等待电容电压稳定 // 多次采样取平均 uint32_t sum 0; const int N 24; for (int i 0; i N; i) { sum analogRead(BAT_PIN); delay(5); } float v_pin (sum / N) / 4095.0f * 3.9f; float vbat v_pin * 2.0f; // 关闭分压网络 battery_measure_enable(false); Serial.printf(vbat%.2fV , vbat); esp_sleep_enable_timer_wakeup(3600 * 1000000ULL); esp_deep_sleep_start(); } void loop() {}这段代码有几个细节值得说一delay(50)一定要给足否则分压电容还没充稳读出来的电压是上一轮的残留值或者中间值二MOS管控制引脚在睡眠期间会保持输出状态吗实际上如果这个GPIO不支持RTC域保持深度睡眠后引脚会回到浮空状态。所以要么用RTC域的GPIO比如GPIO4就是RTC_GPIO5要么在硬件上给MOS栅极加下拉电阻保证睡眠期间MOS关闭。这里我以GPIO4为例是因为它在多数开发板上有RTC功能睡眠时能维持预设电平。5.4 触摸唤醒和阈值报警扩展做物联网电池设备时你可能不想让它永远“睡了不醒”而是希望有人接近或有按键时立刻响应。ESP32的触摸传感器和EXT0外部唤醒都能实现这一需求。触摸唤醒原理是利用手指触摸改变引脚上的寄生电容从而触发中断唤醒这种功能适合做交互型设备几乎不额外耗电。比如我用过GPIO27接一块铜箔作为触摸区域睡眠电流增加不到1µA。另外如果你只想“电量低于阈值才唤醒上传”可以在RTC内存里保存最近一次的电压值每次定时唤醒后判断是否低于告警阈值达到阈值才算一次“有效唤醒”否则继续睡眠。错误做法是每次唤醒都直接去连网那会把电池寿命快速耗干。关于低功耗还有一个常见误解“把CPU主频降到80MHz是不是更省电”。对深度睡眠场景而言主频和睡眠电流没有直接关系真正起作用的是你睡多久、醒来后满负载运行多久。如果你必须高频短时地跑功能那80MHz可能反而不如240MHz“秒完秒睡”更省电。这个思路在做周期上报时尤其适用。6. 常见问题及排查技巧实录6.1 为什么充满电的4.2V测出来只有4.0V甚至更低这是问得最多的问题之一。分两种情况看假如示波器或万用表实测电池电压是4.2V但ESP32报告4.0V多半是分压电阻容差导致的。两个“100K”电阻可能是104K和96.2K分压比不是2.0而是2.11左右软件里固定乘2.0自然偏低。解决办法是拆下电阻用万用表实测然后修改代码里的分压比系数。如果你没条件拆电阻也可以用“一次校准法”先把电池充满万用表读出Vbat再对比ESP32当前读数把两者比值当作修正系数。另一种情况很隐蔽电池在充电器上显示4.2V但拿下来接上ESP32后端电压立刻就跌到4.0V。这通常不是分压问题而是电池本身内阻偏大或者ESP32瞬时电流比如Wi-Fi开启瞬间太大造成压降。判断方法很简单用万用表直接在电池端测量运行时的电压能复现这个跌落。解决方案是采样时避免开启Wi-Fi或者采样前等待电源稳定、连续采多组取最大值。6.2 ADC读数“满屏飘”滤波了还是不稳如果软件滤波做了、电容也加了读数还是抖大概率是参考电压或电源纹波的问题。部分ESP32开发板会用AMS1117把5V降到3.3V这种线性稳压器的输出噪声取决于输入质量和布局当电池电压低于某阈值后稳压器进入Dropout区输出波动明显增大ADC参考也跟着抖。这时候最有效的排除法是用USB供电跑一遍同样的代码看读数是否稳定。如果USB供电稳定、电池供电飘说明问题在电源路径上。这时候可以把分压网络的地线单独走线远离大电流地或者在锂电池和稳压器之间加一个低ESR的电解电容比如220µF来吸收瞬态波动。6.3 睡眠电流居高不下查完这四个地方再说话睡眠电流超标我每次调试都按这个顺序查第一分压网络是否还在耗电这是最大的隐形杀手用MOS控制它或者临时用刀割断PCB走线做测试。第二板载电源指示灯。很多开发板一上电就亮灯一个LED加限流电阻少说就是几个毫安这种开发板不适合直接做低功耗产品。第三串口芯片。DevKitC这类开发板板载CP2102或CH340只要接线方式允许它们是一直通电的。做低功耗设计时要选择“可以从板子电源上断开串口芯片”的版本或直接使用纯模组。第四引脚浮空漏电。GPIO在深度睡眠下如果外部没有明确上下拉它悬空状态会出现不确定的漏电路径。建议把所有未使用引脚显式配置为INPUT_PULLDOWN或OUTPUT_LOW。另外一点容易被忽略ESP32深度睡眠会保留RTC和ULP但如果你接了某些外设比如I2C传感器它的电源没有独立关断传感器自身静态电流就会一直耗电。最彻底的方案是给传感器同样串一个MOS管做电源开关。6.4 充电电压只能到4.0V就“满”了这个标题热词我也刷到过很多次属于锂电池充电电路问题。常见原因是充电管理芯片的截止电压检测到电池端电压提前达到预设阈值而电流还没降到截止电流。如果你用TP4056这类线性充电芯片检测电阻精度低、或者电池内阻过大都会造成提前截止。这个和ESP32本身关系不大但如果你在做一体化设计建议在充电芯片输出端和电池之间检查一下线路阻抗并选用带温度保护、精度更高的充电方案。再说句大实话很多便宜的USB充电模块标注4.2V实际误差在50mV以上表现出来就是只能充到4.1x V。6.5 电量百分比“虚电”平台期造成的错觉最后聊一个“软件层面无解”的问题锂电池在3.6V到3.9V这一段电压变化非常平缓荷电状态却从20%走到了80%。如果你用线性映射这一整段都会被算成“50%~60%”看起来电量就非常耐扛而一旦跨过平台区电压迅速跌落百分比又“唰”一下掉到个位数。这不叫故障而是线性SOC估算法的固有缺陷。解决思路是换用库存电压查表法或加上库仑计IC。库仑计通过采集电流积分精度确实高很多但它会把成本、PCB面积和I2C通信复杂度都拉高。做一个室内环境监测传感器我会继续用查表法如果做无人机电池、智能门锁这种对剩余续航敏感的场合上个库仑计才是正经方案。我在一个智能门锁项目里起初也坚持“分压查表”后来发现锁的电机启动瞬间压降让电量判断严重失真最终加了一颗低功耗库仑计才彻底解决。7. 完整电路图和物料清单7.1 原理图级描述用文字画图有些局限但核心连接关系很清晰锂电池正极 ———— [R1100K] ————┬———— GPIO34 (ADC1_CH6) │ — [C1100nF] ——— │ │ 锂电池负极 ———— [R2100K] ————┴——— [Q12N7002 D极] ——— GND (分压点) [Q1 G极] ———— GPIO4 [Q1 S极] ———— GND解释一下信号链电池正极经R1接到分压点分压点经R2接MOS管的漏极MOS管源极接地栅极由GPIO4控制。分压点上并联C1到地。采样时GPIO4输出高电平MOS导通分压通路形成采样结束后GPIO4拉低MOS关闭漏电流被切断。GPIO4在多数开发板上被丝印为“D4”或“GPIO4”它同时属于RTC域引脚RTC_GPIO5在深度睡眠里可以保持输出状态这是我选它的主要原因。如果你手上所有RTC域引脚都占用了可以换成其他RTC域GPIO或者靠栅极外部下拉电阻保证睡眠期间MOS关断。7.2 电阻电容选型的关键参数R1和R2建议用1%精度、0603封装的贴片电阻耐压和功率都绰绰有余。0603封装额定功率0.1W但在24V以上的输入场景下依然不建议直接用我们这个应用里最高4.2V功率损耗微不足道。C1使用X7R陶瓷电容或C0G更好。X7R在直流偏压下容量会衰减但100nF到1µF的用法下影响不大。注意电容耐压至少10V留足余量。Q1选择逻辑电平N-MOS导通阈值Vgs(th)最好小于1.5V这样3.3V的GPIO电平才可靠。2N7002的Vgs(th)典型在1V到2V区间大多数批次可用但最好实测。AO3400的导通阈值更低、导通电阻更小价格也不贵是我更常用的型号。7.3 采样端电阻会不会造成过大的加载误差还有一个容易被忽略的点ADC内部采样电容会从外部吸取电荷虽然量级很小但在高阻分压网络下若外部电容C1不够大采样期间ADC采样电容和外部电容之间会形成电荷重新分配导致读数偏低。这个现象在单次采样时尤其明显因此我推荐即便做了软件平均物理上的C1还是保留在电路里不要省掉。另外如果你同时把多个ADC通道接到同一个高阻信号源上切换通道时采样电容可能残留上一通道的电压所以ADC通道切换后“丢掉第一次采样结果”算是个标准操作。我在代码里每次读完之后习惯性多读一次、丢弃第一次值成本极低效果明显。8. 实操心得与后续扩展方向整个项目跑通之后我最大的体会是ESP32做锂电池电量检测硬件电路本身10分钟就能焊完代码也就几十行真正的功夫全在“校准”和“功耗取舍”上。别急于直接上库仑计先把分压电阻和校准点做扎实绝大多数场景都能得到一个可以量产级别的电量方案。最后再分享一个小技巧校准不做“单点”做“两点”。先用可调电源给电池端打一个2.8V记一次ADC读数再调到4.2V记一次读数。把这两点拟合出来的斜率和截距写进代码替换掉“满量程3.9V”的固定假设你会惊讶于精度提升的程度。这个技巧思路同样适用于其他任何带ADC的MCU。如果你后续把项目扩展成充电宝、室外传感器、仪表盘这类长时间待机设备还可以从这几个方向继续优化一是把“电池端电压采样”替换为“库仑计IC”彻底解决动态负载下的SOC漂移二是引入太阳能充电时把电量检测和充电管理联调注意充电电压纹波对ADC的影响三是如果做了多节锂电池串联分压要考虑各节均衡不能简单沿用本文的单节方案。先把这套单节方案吃透后面怎么改都有底气。
企业数字化 ERP 产品动态
相关推荐
微信小程序云开发实战:匿名薪资分享小程序从零到一 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:34:55
赖斯《数理统计和数据分析》全章节题解:R复现与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:34:55
UDS 36服务详解:从报文格式到刷写实战,一次讲清TransferData /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:34:55
res-downloader 5 步上手:把视频号视频下载、音乐与 m3u8 存到本地 res-downloader 5 步上手:把视频号视频下载、音乐与 m3u8 存到本地 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader … · 2026/9/25 2:16:20
treg 快速上手:用一份密钥库加技能注册表,让团队与 Agent 共享 API 能力而不泄露密钥 后端API网关MCP 服务dsh-plugin 【免费下载链接】treg OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn 项目地址: https://gitcode.com/GitHub_Trending/treg/treg 点击查看 免费下载 这篇指南带你快速上手 treg(too… · 2026/9/25 2:16:20
南京企业展厅一体化省心服务商合作案例盘点 苏州市墨堂展览设计有限公司,是扎根江浙沪、聚焦50-200万预算中型企业展厅的一体化服务商,核心为新能源、储能、智能制造、芯片半导体等技术型工业企业提供从前期策划到落地交付的全链条展厅服务。墨堂设计成立于2018年,团队配备展厅策划、空… · 2026/9/25 2:16:08
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37