雷竞技注册
项目

用Trinket M0和Python软件算法预测电池劣化

2019年12月09日经过亚伦•汉森

了解如何构建设置,帮助您使用Trinket M0和软件算法预测电池的性能。

在电池供电的设备中,让用户深入了解电池的状态非常重要。我们在手机,笔记本电脑和手电筒等设备中都看到了这一点的所有例子。它们提供了容量和/或剩余时间的预测在电池必须充电之前

另一个关于可能非常有用的电池状况的信息是年龄;预测电池可以使用更长时间在它必须更换之前。可以快速将电池更新到硬件设计中,目的内置芯片,如Maxim MAX17055。AAC Engineering Robert Keim罗伯特·吉姆概述了他2017年这一格言概述的方法为便携式设备设计的电源管理IC

本文探讨了我们可以使用的一些简单的软件算法来进行类似的预测。如果您的系统设计已经包括带有一些备用ADC端口的微处理器,则该方法可以避免附加部分的成本。我们将一般看算法,然后用锂电池看一些真正的结果。

什么是电池容量?

有用的电池具有可预测的行为;它可以在窄电压范围内提供可预测的时间量的恒定功率,可预测的时间。电池的“容量”或“C评级”可能是表达此问题的最有用参数。

能力描述了完全充电的电池可以提供多少总能量名义上的使用模式。对于便携式电子产品中的小型电池,它通常以毫安小时(mAh)为单位表示。雷竞技最新app本文的大部分内容将分析一个C级为1300mAh的锂电池。

但请注意,毫安工作时间不是能量单位。能量是电压,电流和时间的乘积;毫安时间仅代表当前和时间。推断,测量相对于恒定电压;这义务电池电压。标称使用模式将允许电池提供完整的C评级。

这种模式的一个非常重要的部分是排放率(在安培中)。不同的电池化学物质对此有不同的限制。首先开始的简单合理的假设是您将在锂电池中获得额定的能量,如果您在大约放电C评级的1/2, 或更少。因此,例如,随着我们在1300mAh的锂电池额定电池,我们只能预计如果我们平均将电流低于650毫安的电流,我们只能从电池中汲取大量的能量。如果遵循此指南,则需要两个小时以上才能完全放电电池。

作为放电率限制的另一个例子,考虑NiMH AA细胞。许多制造商指定了NiMH细胞的标称放电率是C评级的1/5

有高性能的电池可以超过这些典型限制;尽可能检查制造商的规格。

估算电池时代和容量

它常常描述当前能力与原始(新)容量的电池时代,这就是我们将在这里做的。我们将不断监控电压当前的在使用和放电时,我们的电池的高侧。这是我们将应用软件算法的原始数据。

首先,我们将估计电池的当前容量。我们可以在一个相当长的放电事件的时间范围内完成这一点。它不需要是一个完整的放电事件(稍后更多)。

最后,目前的容量估计可以简单地与制造商的指定的“新”容量进行比较,使用户成为百分比降级。

设计测试线束

下面是电路原理图,我们将与:

BT1是我们的锂电池组。我们将使用小型Atmel微处理器,ATSAMD21,作为我们的监测和分析系统。它有我们需要的模数转口,并由Adafruit与CircuitPython准备好运行的模拟包装,在饰品m0.开发板有一个板的ADC端口直接连接到电池的高侧,我们将有电池电压监控我们需要。

我们的设备负载由一个精确的功率电阻(R1)表示。这意味着我们的电池瞬时电流可以从我们的电池电压计算;我们不需要单独感知它。如果你决定组装这个电路,密切关注这一部分的功耗。在我们给予的最大电源密集的例子中,这部分的耗散将是3瓦。因此,我们使用额定最多5瓦的部分。它仍然很热。

在真正的产品设计中,监控负载电流更复杂。它可以通过霍尔效应传感器,或与电池串联的精密分流电阻完成。这两种方法都将提供表示流出电池的电流的电压信号。该信号将由微控制器上的其他ADC端口之一感测。

电路的剩余方面是:

  1. 一种旁路电容器(C1)用于功率稳定性
  2. 当电池放电循环完成时,蜂鸣器(BZ1)将提醒我们
  3. 电阻分压器(R2 / R3),以适应微处理器的有限ADC输入范围

以下是系统在实验室工作台上的样子:

这种情况下的负载电阻为20欧姆;由两个10欧姆电阻串联实现。这些电阻器被评定为1瓦的功耗。

您还可以看到微处理器突破板有USB连接。此连接有两个重要功能。我们使用它:

  1. 将脚本传输到处理器以进行执行
  2. 要访问串行端口,处理器将发送输出。

有关这些机制的完整描述可供选择adafruit.

以下是Linux shell中的一个快速示例,以演示交互:

cp monitor.py /媒体/亚伦/ CIRCUITPY / main.py

这个shell命令将脚本复制到饰品处理器以执行。处理器在Linux系统中作为一个可移动的文件系统出现,命名为CIRCUITPY。必须将脚本传输到顶级目录,并重命名main.py为了执行。

./log | TEE CLOCED_OVER_TIME.DAT

这个命令启动一个名为日志在Linux系统上运行。它将连接到由饰品提供的串行端口。在Trinket上运行的脚本生成的输出将打印到Linux控制台。通过添加管道和TEE命令,我们将输出复制并将其保存到文件中。你可以看到日志脚本在这里

描述电池

我们要做的第一件事是看看电池在操作范围内的放电模式。我们用四种不同的负载将电池完全放电。我们每隔5秒或10秒监测电池电压,用这个脚本在饰品上奔跑。

这是我们所看到的:

计算现有产能

电池的容量与上方电压线下的区域密切相关,从时刻= 0,电池电压降至低于有用或“截止”级别的时间。如果要将您的容量估计进行比较到制造商提供的额定容量,则需要使用相同的截止值。对于标称电压为3.7的锂电池组,典型的指定截止值为3伏。

我们用于确定当前能力的方法可以是简单地等待发生的完全放电循环,并集成该范围内的所有电流测量。但这不是很有帮助;典型的使用模式可能永远不会包括完全放电。

相反,我们将监控从放电周期开始(t=0)到任意时间t的电流和电压j。我们可以从测量数据中计算出当时的已用容量。

我们可以在我们的特征数据中观察,虽然电池输送的电源是恒定的,但电池电压以恒定的速率下降。因此,可以近似与总容量的使用量与相同间隔相同的电压变化的比率近似:

C测量/ C预料到的=(V.0.- V.j) / (V0.- V.隔断

这个可以用C来解决预料到的,唯一的未知。

图形方式,策略看起来有点像这样:

通过与实测数据的对比可以看出,在小电流放电周期中,真实数据与模型存在差异。在实际数据中,电压变化率在接近周期结束时呈非线性变化。我们的单线模型会导致高估容量。我们可以通过选择不同的截止电压作为平均值的函数来减小这个误差

电流在我们的测量间隔期间。我们将从我们的测量数据中选择四个点并将其适合一行,作为当前的函数:

标称电流(mA) 线性逼近调整截止(V)
740. 3.
370. 3.1
247. 3.3
185. 3.2

这里是这些点的最小二乘线性近似:v隔断= -0.449 * I义务+ 3.23

这是python脚本用于查找这些线参数,以及相关的图:

有了这些额外的参数在手,我们终于准备好编码一个过程,将估计目前的容量,从局部放电。演示过程脚本是在这里。使用它来监控上面测试的相同电池,这就是在将电池放电一小时后报告的内容:

分钟61.00,电压= 3.849监控结束;新的充电周期开始。61.00分钟后的容量估计:平均电流= 263.11 mA使用容量= 267.50 mAh电压监视器开始= 4.06伏特电压监视器结束= 3.85伏特调整电压截止= 3.20伏特预测总容量= 1076.08 mAh

这个预测与我们在描述电池时收集的数据相比很好:如果我们将15欧姆负载的完全放电电流测量集成起来,我们得到的纯测量容量为1073毫安时。

所以最后我们可以估计电池的使用时间!与额定容量1300mAh相比,我们可以得出这样的结论:该电池的容量约为原始容量的82%。

结论

可以在运行系统中估算电池的可用容量。结果存在不确定性,但它仍然是一个有用的用于规划电池更换的信息。

对脚本中未包含的估计有许多限制,但可能是生产系统:

  1. 我们在设计中选择的截止电压对电池的可用容量有很大的影响。如果我们选择的截止点不是制造商指定的相同截止点,我们不能使用制造商指定的容量来估算我们的年龄。相反,我们应该自己测量“新”的容量,使用完全放电,从完全充电的电压到我们设计的截止电压。
  2. 我们应该为有效的容量估计定义需要收集的最小数据点数量。这个最小值与采样硬件的总体精度和误差容忍度有关。如果监测阶段没有产生这个最小数据集,就不应该进行估计。
  3. 我们应该检查“全卸”条件。在我们的监控阶段结束时,测量的电压可能是下面我们调整后的截止目标。我们不能从这里做任何有用的推断。到此为止所测量的能量消耗应考虑到满的电池容量。换句话说,我们预计电池随时会耗尽。

参考