大多数手持设备使用碱性电池或可充电电池供电,因此测量电池容量是这类设计的一个关键特征。但是,在大多数情况下,对预算紧张的项目而言,使用电池电量监控IC可能是一种奢望。本文提供了一种更简单、更便宜的选择。 如今,即使是最便宜的MCU也常常包括内部模数转换器(ADC)模块,但是由于其分辨率(相对)较低,噪声水平较高,因此这一模块并非总是得到使用。然而,那些未使用的内部ADC通道之一,足以用于执行测试,从而确定电池是否仍然可用。 本文所述检测电池健康状况的方法称为电化学动态响应(EDR)。该方法已由Cadex Electronics申请专利,美国专利号为7,622,929。 EDR通过施加负载脉冲,评估电池对攻击和恢复的响应时间,来对电池在负载下的状况与所存储的与电池性能相关的参数进行比较。如图1所示,好的电池具有很强的恢复特性,而几乎耗尽的电池则具有较大的放电斜率和较差的恢复能力。造成耗尽的电池出现这些差异的原因有多种,例如内部电阻增加。 图1:对比各种充电状态下电池对临时负载脉冲的响应,可以发现它们在EDR方面的差异。 利用EDR理论,对电池电压进行采样,找到在特定时间下(例如最大功耗发生时)的最小电池电量,即可获得有关电池健康状况的信息。系统的初始开机时间(也称为“打招呼”时间)是衡量电池健康状况的一个特别好的时机。在系统完全启动之前,电池电量似乎处于安全工作水平,但是,如果电池快要用尽了,则当系统达到满负荷时,电池电量可能会立即降至安全水平以下。该设备会在不执行EDR测试的情况下以正常模式启动,但是却会在第一次重载时不受控制地关闭(即电压下降到如图1所示的关键电池电量水平)。 图2显示了实现EDR测试的简化硬件版本。此处选用负载电阻来代表整个系统负载,因此其值可以根据系统的不同进行改变。系统要生成此处所示的数据,需要一个10Ω的值。电阻R1和R2用作分压器,实现对电池电压(Vcc)的测量,而升压电路则用于确保即使在测试期间电池电压下降时,ADC的基准也保持恒定。电阻R3是开关晶体管的下拉电阻。 图2:以上简化原理图显示了EDR测试实现的总体设计。 测试系统在设定的时间段(约200ms)内对电池电压进行采样。在固件控制下,MOSFET仅在测量周期的一半时间内导通,然后关闭。这样,系统就可以测量满载情况下的电压,以及最小负载时的电池恢复响应。(可以在固件中更改时间段,但我发现200ms足以充分评估电池容量。)测量完成后,可以通过UART链路读出结果。 在为演示EDR所搭建的示例系统中,我使用了两节AA碱性电池,因此Vcc的最大值为3.2V。升压电压Vdd设置为恒定的3.6V。系统在正常情况下消耗55mA,但在满载时消耗127mA。使用“好”电池(图3a)和“坏”电池(即耗尽的电池,图3b)对系统进行测试时所获得的示波器迹线,表明了欠载电压的差异有多大。 图3:电池电压的负载测试结果显示,充满电的电池(a)和几乎耗尽的电池(b),它们的响应之间存在显著差异。 我在某些项目中使用的示例设计基于STM32F303 MCU,其固件使用KEIL IDE用C语言编写。可以在此GitHub页面上找到这个固件。 测试代码的流程图如图4所示。一旦UART收到“S”字符,就会执行测试。ADC采样频率设置为250Hz,如前所述,测试周期约为200ms。 图4:EDR测试代码将负载接通,以一半的测试时间采样,然后断开负载,完成采样周期。 这个代码仅用于进行测试和收集数据。处理数据有很多方案。在最简单的情况下,可以查看数据的最小值,然后将其与系统的安全工作电压水平(也称为临界水平)进行比较。如果在测试过程中电池电压接近临界水平,则可以警告系统用户该更换电池了。 可以编写更全面的算法来精确确定电池健康状况,例如用作电池电量指示器。然而,为了在显示器或电池指示器上向用户更新、显示适当的数据,还应对所采集的数据进行过滤。若原始数据未经过适当过滤,那么负载变化将导致其完全无用。缓慢的无限脉冲响应(IIR)滤波器可以对信号进行正常平滑。 总之,借助MCU当中非常基本的ADC,采用EDR方法,可以对电池健康状况实现廉价的检测。将初始上电期间的读电池时间设为约200ms,足以对几乎所有系统实现基本的电池健康状况测试。 |