十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

自制电池监测器:基于ESP32与INA226的电压电流采样与SOC估算

自制电池监测器:基于ESP32与INA226的电压电流采样与SOC估算 自己动手做一个电池监测器这事儿我琢磨了快两年才真正落地。以前总觉得直接买一个BMS或者电量计模块就行但用多了就发现市面上能买到的Battery Monitor要么是封闭协议改不了参数要么是精度虚标要么是只能测电压不能看电流根本没法满足我对实时、准确、可控这三个词的要求。后来索性从零开始自己焊了一套基于电压采样加电流积分的监测系统把主控、采样电路、算法和显示全部打通。这篇博文就是把我这两年的设计思路、踩坑记录和最终方案完整写出来给同样想自己搞电池监测的朋友一个可抄作业的参考。1. 项目整体设计与思路拆解1.1 核心需求解析开始画电路之前我花了整整两周时间想清楚一件事这个Battery Monitor到底要解决什么问题。不是哦我要监测电池电压这么简单而是要明确监测对象、精度要求、实时性要求和使用场景。拿我自己来说当时手头有三类电池要用一组48V的电动自行车锂电池一组12V的磷酸铁锂储能电池还有几节18650电芯要拿来测试。这三类电池的电压范围、容量、放电倍率差别很大如果只做一个固定量程的监测器换电池组就得重新焊板子太不划算了。所以我给自己定的第一个核心需求是宽电压输入范围至少覆盖5V到60V。第二个需求是不仅能看电压还能看电流和功率因为很多电池问题在电压曲线上不明显但电流一测就露馅了。第三个需求是具备历史数据记录能力不能只显示当前数值还得能推测剩余电量和健康状态。精度方面我给自己定的标准是电压误差控制在±10mV以内电流误差控制在±1%以内。这个标准看起来不高但如果用ADC直接采电压参考电压不准、分压电阻温漂、接触电阻变化随便哪一项都能把误差拉到几百毫伏所以后面做了很多传感器选型和电路设计上的考量。这些细节对你们自己复制很有参考价值后面我会展开讲。1.2 方案选型成品模块、专用芯片还是全自研确定了需求接下来就面临一个老生常谈的问题是买现成的模块还是用专用电池监测芯片还是自己用分立元器件搭一套先说说市场成品的坑。市面上确实有一堆串口屏电量计、库仑计模块价格从几十到几百不等。但用过的朋友应该有同感很多模块的电流采样范围是固定的比如最大只能测10A我电动自行车启动瞬间电流能到30A直接削顶失真还有些模块的SOC算法就是拿电压查个表根本不考虑放电倍率和温度补偿充满电显示100%一加油门掉到80%这种数据看了还不如不看。专用芯片方案是我犹豫最久的。像TI的BQ76940、BQ34Z100ADI的LTC2946这些都是正经的电池监测方案功能齐全精度也高。BQ76940支持6到15串锂电池监测内置均衡功能确实是实验级的BQ34Z100支持宽电压范围可以通过I2C读出精密的剩余电量数据。但我最终没有用它们的核心原因是这些芯片很多需要官方IT或EV工具烧录配置配置过程繁琐且如果要用在非推荐的电芯类型、非推荐的串数上初始化逻辑就要绕很多弯。我手头有48V、12V、单节18650三种不同规格的电池组用同一块板子来切换轮询其实不方便。所以我选择了全自研路线用MCU自带的ADC做电压采样用独立的电流采样芯片INA226做电流电压双监测SOC估算在软件里用开路电压法加库仑计融合实现。这样做的好处是主控选型灵活不管想用什么MCU都可以量程靠电阻分压比和采样电阻值来适配校准逻辑和算法完全是自己的想加温度补偿就加温度补偿想输出给屏幕还是给手机APP都行。1.3 主控芯片选型ESP32、STM32还是Arduino主控我试过三个Arduino Uno、STM32F103、ESP32。最后实际量产用的ESP32-D1 Mini原因有三。第一ESP32自带WiFi和蓝牙。如果只是做个本地显示的监测器Arduino就够了但一旦想把数据发到手机APP或者做远程告警ESP32就比其他两者少加一块通信模块硬件复杂度直接降低。第二ESP32的ADC通道比较多而且支持衰减设置可以测到3.3V以上的电压配合外部电阻分压。我同时采集电池总电压、电芯均衡检测电压、以及一块温度NTC的电平三分支ADC同时轮询本身不需要外挂ADC芯片。第三开发效率高。ESP32的Arduino生态和ESP-IDF框架都成熟尤其是用PlatformIO开发第三方库管理方便INA226、WiFi、Modbus、MQTT的库都是一行依赖装好。省下的时间都花在了调电路和写算法上。STM32F103我也用过一段时间稳定性和ADC精度其实比ESP32好一点点但这块板子没有无线能力后来外挂ESP8266做传输又引入了串口通信的稳定性问题。既然我不是做量产设备而是在自家工作台和电动车上来回换着用ESP32的一体化方案最适合我。你们如果只做固定场景监测而且对功耗敏感用STM32L系列低功耗芯片也不错如果就是要短平快Arduino Uno也完全能顶只是显示和通信功能要弱不少。2. 核心细节解析与实操要点2.1 电压采样分压电阻的坑与精密测量技巧电压采样是Battery Monitor最基础的功能也是最容易翻车的地方。很多人直接拿两个电阻分压把电池电压降到ADC口能承受的范围内读一下ADC值然后乘以比例系数就完事。实际做起来误差来源多到难以想象。先看基础电路。假设要测量最大60V电压ADC参考电压为3.3V那分压比至少要22倍左右。我常用的做法是高端用200kΩ低端用10kΩ中间取电压点。计算一下如果电池满电电压是58.4V分压点电压为 58.4 * 10 / (200 10) ≈ 2.78V在3.3V以内安全如果电池过压到65V分压点是 65 * 10 / 210 ≈ 3.09V还是留有余量的。但这个电路有两个大坑。第一个坑是ADC输入阻抗问题。ESP32的ADC输入结构不是理想的无穷大阻抗采样瞬间会从外部电阻分压网络吸取一点电荷如果分压电阻阻值太高采样值就会被拉低形成系统性误差。解决办法有两种一是在ADC引脚对地并联一个0.1μF电容相当于一个电荷池采样的瞬间由电容供电等到采样结束后再慢慢补充二是把分压电阻阻值整体降低但还是那句话太低了漏电大、静态功耗高不适合电池供电的场景。我最终选择了200k/10k组合并在ADC引脚对地加了个100nF电容和1kΩ串联电阻组成了一个低通滤波器不仅解决了电荷汲取问题还过滤了高频干扰。第二个坑是分压电阻的温漂。普通贴片电阻的温度系数是±100ppm/℃意味着温度每变化一度电阻值变0.01%。如果工作温度从25℃变到55℃30℃的变化就带来0.3%的误差在58V量程上就是170mV这已经远超我定的±10mV目标了。所以我选用了金属膜精密电阻温漂典型值±25ppm/℃误差缩小到原来的四分之一。成本上每颗只贵几毛钱非常值得。另外我特意选了两个独立电阻而不是用排阻因为排阻虽然阻值匹配好但散热不均匀时温漂一致性反而更差独立电阻可以让热源距离远一些互相影响小。2.2 电流采样采样电阻与INA226的选型电压好测电流才是真正考验硬功夫的地方。常用的电流检测方案有两种低端采样电阻运放和霍尔传感器。低端采样用毫欧级电阻串在负载回路里通过检测电阻两端压降来推算电流。霍尔传感器则是非接触式利用电流产生的磁场来测量。我做过对比霍尔传感器比如ACS712的好处是隔离不会对负载回路引入额外压降坏处是量程范围内分辨率不够。ACS712-20A的分辨率只有约100mA/bit而且零点漂移很明显温度一变、VCC一变零点就偏了经常要重新校准更麻烦的是频率响应特性如果负载有快速脉动电流霍尔输出的反应是滞后的。所以我选了INA226电流检测芯片。这芯片是TI的算是一个经典的高级分流检测器通过I2C总线输出电流、电压和功率数据内部集成了16位ADC。关键参数是它的满量程差动输入±81.92mV配合一个分流采样电阻能覆盖足够宽的电流范围。我选的是0.5mΩ的合金采样电阻额定功率3W连续电流50A短时峰值100A。根据欧姆定律50A电流在这个电阻上产生 50*0.000525mV 压降在INA226的量程内留了很大余量100A时就是50mV也安全。INA226的精度让我比较满意它能做连续采样和触发采样I2C可以设置16个地址位。最重要的是它内部做了温度补偿和电源抑制在实际测试中用电子负载从1A加到20A读出来的偏差基本都在±0.3%以内远好于我对±1%的要求。要注意的是采样电阻的选择不是越小越好。阻值太小小电流时的压降就小接近ADC和INA226的分辨率极限测不准阻值太大大电流时发热严重电阻自身阻值漂移反而带来额外误差。0.5mΩ适合我要监测的20A-50A电流范围如果你的电流范围是5A以内用5mΩ或10mΩ更合适。另外采样电阻一定买四线开尔文结构的不是两线的普通电阻四线能避开焊盘和引脚处的接触电阻让压降信号更干净。2.3 温度监测NTC热敏电阻的标定方法电池监测如果不测温度等于少了一只眼睛。锂离子电池在低温下充电容易析锂高温下放电容量衰减快、还有热失控风险。所以我给系统加了一个温度通道。最简单实用的方案是NTC热敏电阻阻值随温度变化而变化。我选用的是10kΩ NTC25℃时阻值为10kΩB值3950这是最常见、最便宜的规格淘宝几毛钱一颗。接法是NTC与10kΩ精密电阻串联两端接3.3V中间点接ADC引脚这样把电阻变化转化成电压变化。标定方法很有讲究。NTC的阻值与温度关系能用Steinhart-Hart方程来精确描述但我自己写工程代码图省事直接用查表法在0℃、10℃、25℃、40℃、60℃这几个温度点测出ADC读数然后线性插值。这个误差在标定点附近能控制在±2℃以内对电池监测来说完全够用。如果你有恒温槽或者冰水混合物可以做得更精确没有的话也建议至少用两个点来校准比如0℃的冰水混合物和100℃的沸水但沸水温度受海拔影响必须用水银温度计实测不能想当然按100℃算。把校准后的温度值和实际温度对比如果偏差超过±3℃很可能是分压电阻阻值不对或者ADC用了不合适的衰减系数。3. 实操过程与核心环节实现3.1 硬件清单与模块化接线做Battery Monitor不需要很高的焊接技术但需要用模块化思路来搭方便后期调试和换零件。我先列一个完整的硬件清单这些都是实际用过的大家可以直接照抄。类型型号/规格数量备注主控ESP32-D1 Mini1带WiFi方便数据上报电流采样INA226模块 0.5mΩ四线采样电阻1I2C接口16位ADC电压分压200kΩ精密电阻 10kΩ精密电阻1组配合ADC衰减量程60V温度测量10kΩ NTC热敏电阻 10kΩ精密电阻1组贴片到电池表面显示屏0.96寸OLED SSD13061I2C接口供电DC-DC降压模块型号MP15841输入12-60V输出5V给主控开关自锁开关1总电源控制保护防反接二极管、TVS管若干保护后级电路接线逻辑分三个回路。第一个是电池到负载的主功率回路采样电阻串联在电池负极和负载负极之间INA226的差分输入IN和IN-分别接到采样电阻两端注意极性不要接反。第二个是电池正极到分压网络分压中点接ESP32的ADC引脚比如GPIO34。第三个是I2C总线ESP32的GPIO21SDA和GPIO22SCL接INA226和OLED注意I2C设备地址不能冲突INA226默认地址是0x40SSD1306是0x3C不冲突可以挂同一条总线上。这里有个关键建议供电不要直接拿电池电压给ESP32供电。电池电压范围很宽直接接会烧板子。我用了一个MP1584降压模块把电压稳定在5V再经过板载LDO变成3.3V给ESP32供电。别小看这一步降压模块本身的效率也会影响整个系统的静态功耗我实测休眠模式下整体电流不到50mA这个量级长期挂电瓶上问题不大。3.2 INA226配置与数据读取代码INA226的配置看起来不难但有几个寄存器设置能直接影响精度。我直接把核心配置代码贴出来加上注释说明每个参数的意思。#include Wire.h #define INA226_ADDR 0x40 // 寄存器地址 #define REG_CONFIG 0x00 #define REG_SHUNT 0x01 #define REG_BUS 0x02 void setupINA226() { Wire.beginTransmission(INA226_ADDR); Wire.write(REG_CONFIG); Wire.write(0x47); // 配置寄存器高字节AVG111(平均1024次), VBUSCT110(1.1ms), VSHCT110(1.1ms), MODE111(连续触发) Wire.write(0x27); // 配置寄存器低字节MODE111(分流和总线连续测量) Wire.endTransmission(); }配置寄存器的0x4727这个值的含义需要拆开看。高字节中ADC平均次数设置为1024次这是提高信噪比最有效的办法。虽然采样速度变慢了每次转换大约1.1ms1024次平均要一秒多才更新一次但对我这种监测场景来说完全够用换来的是更平滑稳定的数据。如果你需要高刷新率来捕捉瞬态电流可以把平均次数调到64次甚至4次但要注意数据显示会跳跃得比较厉害。读取数据就简单多了int16_t rawShunt readRegister(REG_SHUNT); int16_t rawBus readRegister(REG_BUS); float shuntVoltage_mV rawShunt * 0.0025f; // 每个LSB对应2.5μV float busVoltage_V rawBus * 0.00125f; // 每个LSB对应1.25mV float current_A shuntVoltage_mV / 0.5f; // 采样电阻0.5mΩ即0.0005Ω最后一个除法要注意单位。shuntVoltage_mV是采样电阻两端的压降单位mV要转换成A需要这样算电流(A) 压降(V) / 电阻(Ω) (shuntVoltage_mV / 1000) / (0.0005) shuntVoltage_mV / 0.5。这就是为什么代码里的除法因子是0.5而不是0.0005因为单位换算已经吸收进去了。这个转换逻辑我起初写错过数据大了整整1000倍排查了半天才发现是单位搞混。功率的计算方式是 busVoltage_V * current_A注意这里用的是总线电压不是电池总电压因为电压采样路径不同会有微小差异。如果要精确到10mV级别建议功率用同一个数据源计算不要一个用INA226的电压另一个用ESP32 ADC的电压否则出来的功率可能在低电流时出现奇怪的抖动。3.3 电压标定与采样通道校正所有硬件接好之后标定是必不可少的一步。就算电阻精度标称±1%就算INA226的校准寄存器写对了实际电路中仍然存在走线电阻、参考电压偏差等看不见的误差源。我的标定流程分两步。第一步是电压标定。用一台高精度台式万用表比如Fluke 15B精度0.5%作为基准输出几个已知电压0V、12V、24V、36V、48V、60V分别读取ESP32 ADC换算后的电压值记录对应关系。然后用线性回归方法算出增益误差和偏移误差存到EEPROM里。举个例子如果输入48.0V时我的系统读出来是47.82V说明增益误差约0.37%那后面所有ADC读数都要乘以 1/(1-0.0037) ≈ 1.0037。这个校准系数在初始上电时从EEPROM读取并应用。第二步是电流零点校准。电流等于零时INA226的分流电压读数理论上应该是0但实际上因为运放失调、采样电阻上的热电势等原因会有一个很小的偏移量。我的做法是开机后等待10秒让电路温度稳定然后连续读100次电流值求平均把这个平均值作为零点偏移存下来后续所有电流读数都减去这个偏移。这个步骤特别重要因为即使在没有任何负载的情况下一个50mA的偏移在小电流应用比如监测待机电流中就会被误判为有电流流动影响SOC和功率计算。我还在标定过程中发现一个细节刚上电的瞬间INA226的配置寄存器会回零导致第一次读取返回异常数据。解决方法是启动后延时500ms再初始化配置寄存器然后做一次伪读取抛弃结果第二次读取才是有效数据。这个不只是INA226的问题很多I2C传感器都有类似的上电时序要求我在代码里统一加了上电稳定延时省了很多麻烦。3.4 显示与数据上报OLED本地展示和Web远程访问数据采集到了还得想办法展示。我做了两条路径本地OLED实时显示和WiFi远程访问。OLED显示用U8g2库支持中文显示非常方便。我分配的显示内容有六行当前电压、电流、功率、剩余电量百分比、温度、以及一个简单的充放电状态图标文字里我用CHG和DIS表示。刷新频率1秒一次因为OLED刷新太快会闪烁而且实际需要关注的是趋势而不是瞬时值。远程访问是我当初选择ESP32的核心原因之一。我实现了两种方式一种是ESP32开一个HTTP服务手机浏览器直接访问IP地址能看到一个简单的表格页面显示实时数据另一种是通过MQTT把数据发到Home Assistant这样在各种仪表盘里就能看到历史趋势曲线了。MQTT的实现很成熟不过需要家里有MQTT broker可以用Mosquitto也可以直接用Home Assistant自带的服务。这里有一个实际经验ESP32的WiFi连接在电池供电环境下偶尔会掉线特别是当负载电流突然增大时电池电压瞬间跌落DC-DC输出可能毛刺变大导致WiFi模块重启。我加了两个处理一是DC-DC输出端加一个大电容比如470μF缓冲突发电流导致的电压跌落二是软件里加了WiFi自动重连逻辑如果长时间连不上就重启整个系统。这两招配合下来稳定运行几个月不再掉线。4. 剩余电量估算与测试校验4.1 开路电压法与库仑计法各自的缺陷Battery Monitor的核心不只是显示实时电压电流真正令人上头的是怎么准确估算剩余电量百分比SOC。我把常见的方法逐一试过这里说说感受。最原始的方法是开路电压法OCV。原理是电池在静置状态下至少1小时没有电流其端电压和SOC之间存在相对稳定的对应关系查一下OCV-SOC曲线就能得到SOC。这个方法的优点是实现简单不用额外传感器缺点也很明显只要电池在带载或者刚刚充放电完极化效应会让端电压严重偏离真实OCV这时候查表算出来的SOC能差20%以上。我实测过同一块48V锂电池刚充满静置一小时电压约54V对应SOC约100%但如果刚以10A电流放电完再断开负载实测电压可能在49V查表只有55%实际电量却是65%。误差巨大。第二种经典思路是库仑计法电流积分。原理简单粗暴不断积分电流对时间的累加减去消耗的容量除以总容量得到SOC。这个方法的优点是在静置和动态变化场景下都能持续工作不会像OCV那样一放电就漂。缺点也相当致命电流传感器的零点偏移、采样时刻之间的电流变化、初始SOC设定的误差都会随时间累积最后形成一个不断增大的积分漂移。举个例子如果零点偏移导致平均0.1A的误计数一个月下来就积累了72Ah的误差这是多少电芯容量都打不住的。4.2 融合估计算法OCV修正与库仑计的组合策略真正靠谱的SOC估算必然是OCV和库仑计的融合。我做了一个比较典型的策略不算复杂但非常有效。简单说就是库仑计做短时动态估算OCV做长时周期性修正。具体操作分三步。第一步在系统启动时先静置2分钟用OCV查表给出初始SOC值。这样就能避免只有库仑计但初始值不对的尴尬。第二步运行过程中用库仑计每秒积分一次实时更新SOC。每次积分前都减去零点偏移能有效降低积分漂移。第三步当检测到电池静置超过30分钟且电流绝对值小于0.3A时自动切换到OCV查表模式用当前电压对应的SOC值来校正库仑计积分值与真实SOC之间的偏差。校正不是一下子跳变过去而是按一个小比例比如10%缓慢逼近防止SOC数值突然跳动吓人。这个策略在实测中表现很不错。我拿一块标称容量10Ah的锂电池组反复做了充放电循环测试从充满到放空再到充满测了30天最终的SOC误差基本控制在5%以内。相比纯OCV法的20%误差和纯库仑计法日趋累积的误差明显提升了实用性。补充一点最终版我还加了温度修正当电池温度低于10℃时在OCV查表结果上减去2%因为低温下锂离子活性降低可用容量本来就少高于45℃时加上1%因为高温下容量释放得更充分。这个修正值是经验性的可以根据自己的电池特性去调。4.3 实测数据与误差评估我记录了一组实测数据方便大家有个直观概念。测试条件48V 10Ah锂电池组负载为电子负载恒流8A放电环境温度25℃。时间分钟万用表电压V系统电压V电子负载电流A系统电流A系统SOC%053.253.218.008.031001050.850.818.008.01873049.349.298.007.98615047.947.918.008.02347046.546.488.007.998从表格可以看出系统电压读数和万用表之间的偏差稳定在0.01-0.02V这个精度完全达到我一开始定的±10mV级别电流偏差约0.01-0.03A换算成百分比不到0.5%也大大优于±1%的目标。SOC数值在放电前期下降平缓后期下降变快符合锂离子电池的放电特性直观上比较可信。这个结果不是一蹴而就的中间经历了多次校准和代码调整。我特别想提醒的是不用迷信某一次的校准因为电池特性会随循环次数老化、随温度变化漂移最好每隔两三个月做一次完整校准满充满放一次更新容量参数。这个习惯对维持监测系统的准确度至关重要。5. 常见问题与排查技巧实录5.1 掉线、跳变、零显示典型异常现象汇总自己做的监测器各种古怪毛病我基本都见过这里整理成一个速查表你们遇到类似问题可以对照着看。现象可能原因排查方法解决方案上电无显示电源没接好DC-DC无输出万用表测ESP32供电电压检查降压模块输入输出确保5V正常电压显示为0或极小分压网络断路ADC引脚悬空万用表测分压点电压检查分压电阻焊点确保接触良好电压读数偏大/偏小分压电阻阻值不匹配校准系数不对用万用表对比中点和总电压重新标定修正增益系数电流读数固定不变INA226地址配置错误I2C不通扫描I2C设备地址检查A0/A1引脚接法确保地址正确电流读数剧烈跳动负载中有电机等感性元件用示波器观察电流波形增加滤波电容增大INA226平均次数OLED花屏I2C总线电平不匹配检查SDA/SCL上拉电阻加上拉电阻4.7kΩ到3.3VWiFi频繁掉线电池电压突变导致供电毛刺观察掉线时电压波形增加DC-DC输出电容做自动重连这个表不是完整的排错手册但覆盖了我遇到过的90%的异常。最典型的是I2C通信问题几乎每个人都踩过原因无非是地址不对、上拉电阻缺失、接线松散这几种先把这些检查完问题基本能解决。5.2 上电瞬间电压冲击如何处理有一个问题我起初忽略了直到有一次整套系统连着电池上电瞬间OLED直接花屏电流读数乱跳才意识到恶性冲击问题。原因在于当电池接入时输入端有大的浪涌电流给DC-DC输入端的滤波电容充电瞬间的反向电动势可能顺着供电线串扰到I2C数据线和ADC采样线上。解决措施有两个层面。硬件上在电池正极接入端串联一个慢熔断保险丝比如10A再并联一个TVS瞬态抑制二极管选Vrwm60V或根据最大电池电压确定到地把瞬态高压钳位到安全范围。软件上主控上电后先延时500ms再初始化OLED和INA226让各模块的电源轨稳定下来避免在毛刺期间进行I2C通信。另外防反接保护不能省。锂电池组一旦正负极接反整个系统瞬间烧毁。我用一个P-channel MOS管做了理想二极管防反接电路压降比普通肖特基二极管小很多几乎不影响监测数据。如果嫌麻烦至少串联一个大电流二极管也能保命但要注意二极管的压降会导致测得的电池电压偏高0.3-0.5V需要在软件里减去这个压降才能保证精度。5.3 采样电阻发热与长期运行可靠性采样电阻在持续大电流下的发热是我在长时间运行测试中真切感受到的痛点。0.5mΩ的电阻在20A电流下功耗是 20² * 0.0005 0.2W看起来不高但如果负载是持续大电流电阻表面温度能到60℃以上这时阻值会因温度系数上升一点测量误差会跟着增大。解决方案有几个。一是选更大额定功率的采样电阻3W额定功率的电阻在0.2W功耗下温度很低二是把采样电阻焊在PCB上远离其他元件的位置留出通风空间三是在软件里做温度补偿——如果系统同时测了环境温度可以根据采样电阻的温度系数推算阻值变化再修正电流计算结果。这个修正对0.5mΩ级别的采样电阻效果不算明显但在更大阻值5mΩ、10mΩ的方案里就很重要了。我自己的做法比较保守在电动车应用场景里连续10A以上的大电流一般不会持续超过半小时电阻发热在可接受范围内在储能箱场景里我已经改成双采样电阻并联每个电阻分担一半电流发热进一步下降。如果你们有持续80A以上的应用需求建议考虑用开口式霍尔电流互感器来替代采样电阻方案虽然分辨率低一点但没有发热问题。5.4 一个容易忽略的问题零点漂移的一天变化最后分享一个我踩过的隐蔽的坑。我在调试电流零点时发现上午校准好的零点偏移到了下午电流读数总是偏正但真的没有接任何负载。排查了半天终于发现问题出在环境温度变化对INA226内部运放失调电压的影响。INA226的失调电压温漂指标大约是0.1μV/℃看起来很小但如果采样电阻只有0.5mΩ1μV的失调就能换算成2mA的电流误差。白天太阳晒着工作台温度升了十几度零点就漂了一截。解决方法是我把零点校准过程从只校准一次改成了每隔5分钟自动重新校准一次但校准的前提条件是没有电流流过——怎么判断有没有电流呢我的办法是用INA226本身的数据当电流绝对值低于20mA持续超过10秒就认为处于零电流状态然后把这时的读数记为新的零点偏移。这个逻辑听起来有点循环论证但在实际应用中效果很好因为绝大多数监测场景都会有空闲时间窗口比如电动车停车、储能箱静置总有足够的时间完成自动校准。6. 写在最后的一些经验体会如果你照着这套方案做下来会发现一个很有意思的事情真正有价值的不是那块OLED上显示的几个数字而是你通过自建Battery Monitor对电池行为建立起来的直觉。比如你第一次看到电池在低温下的电压跌落幅度第一次看到大电流放电结束时电压回弹曲线的形状第一次意识到所谓剩余电量30%在不同负载下实际能跑的里程差异非常大——这些经验是买成品Battery Monitor永远学不来的。我的建议是先把最基础的电压监测跑通再加电流再研究SOC算法一步步来。这中间每一个环节的坑我在文章里都尽量写清楚了。最后再分享一个我用了很久的小技巧给这个系统单独做一组记录本类似实验日志记录每次校准的时间、校准后的参数、以及对应电池的循环次数。时间长了这些数据就是判断电池健康度最可靠的参考比任何算法都准。电池监测这条路很有意思祝你做出自己满意的Battery Monitor。
返回列表