zl程序教程

您现在的位置是:首页 >  其它

当前栏目

码农的自我修养 - BatteryManager设计

设计 自我 码农 修养
2023-09-11 14:22:09 时间

对于使用电池进行供电的电子产品,就需要一个电池管理模块,叫做BatteryManager。

将BatteryManager(BM)设计为一个类,用来管理电池操作,包括充电、LED显示、电量管理等。

这里涉及到的硬件,有电池(一般是可充电锂电池),充电IC(Charge IC),有可能还有Gauge IC(电量计),以及一些相关AD信号。

BM类的依赖

创建BM类时需要传入一些参数,根据一般的设计来进行举例,具体情况下可能有所差异。

第一个,需要依赖的是Hardware类。

这个类是当前产品的硬件管理类,包含了各种硬件功能和资源,以供BM使用。

第二个,事件管理器EventManager。

在系统运行中,各个模块都需要收发事件,由这个类完成。

第三个,其他一些信息,比如充电芯片使用的IIC的端口号。(一般charge IC都是IIC接口)

第四个,需要使用的其他的外部功能,比如可能依赖某个外部模块的功能,根据需求进行一些操作。

BM类的功能

1,一个init初始化函数。

2,可以进行事件接收处理的线程。

比如接收系统级的事件或其他模块的事件,需要BM进行处理。

3,一个polling函数,用来维持BM的必要功能。

这里并不需要使用一个线程资源,针对BM的情况,一个一般的周期函数即可满足需求。

此polling函数需要安放在产品的主loop循环中。

在polling函数中,作为此模块的主处理函数,可以使用状态机来进行管理。

4,获取各种信息的函数。

比如取得电池电压、电池类型、电池状态、电量百分比、温度等信息。

5,Charge IC / Gauge IC的操作。

通过IIC进行操作,读取/设置寄存器等。

6,状态机管理。

在状态机设计中,定义电池管理的状态,比如,未初始化、放电中、预充电、快速充电等状态。

还要定义要处理的相关事件,以及根据状态和事件所决定要执行的操作。

可以将这些操作定义为一系列的Action函数,方便管理。

7,判断当前模块是否满足休眠条件。

在系统进入休眠前,需要查询各个模块是否满足休眠条件。

如果要降低耦合,就是用事件模式,发送询问是否可休眠的事件,等待各个模块回应。

或者判断休眠的条件有限,只需几个模块的话,就直接调用相关模块接口即可。

还可以在将各个需要处理休眠判断条件的模块,将他们注册到系统状态管理模块里面。

函数定义

1,BMPolling

周期轮询函数。

2,BatteryManagerEvent

事件管理线程的函数。

电池状态定义

关于电池的状态,有未检测到电池、正常放电、充电三个主要状态。

而充电状态又分为预充电、快速充电、充满电、充电功能禁止、充电保护、充电错误等子状态。

这里我们只使用一级的状态机,所以将所有的充电子状态和未检测到电池、正常放电放到一起。

这些状态是互斥的,并一起组成了电池的整个生命周期管理。

typedef enum {

/* Assign the values to make this status value can be shared with external device, 

    or as a external info to be used maybe by user.

    So please don't change the entry, just delete or add new ones.

 */

    BATTERY_STATUS_NOT_DETECTED = 0, /* battery not detected */

    BATTERY_STATUS_DISCHARGE = 1,  /* Battery is detected, and no power supply for charging. */

    /* forbidden due to authentication failed, maybe the battery info from gauge or EEPROM is wrong */

    BATTERY_STATUS_AUTHENTICATION_FAILED = 2,

    /* following the status are for charging. */

    BATTERY_STATUS_CHARGE_UPDATING = 3, /* charge status is in updating when start charge or change charge settings. */

    BATTERY_STATUS_CHARGE_PREPARE = 4,  /* charging when battery voltage is too low, so with very little charging current. */

    BATTERY_STATUS_CHARGE_FAST = 5,  /* Constant current charge -> Constant voltage charge. */

    /* Change IC indicate that the power supply for charge is shutdown, no charge current. */

    BATTERY_STATUS_CHARGE_DONE = 6,  

    BATTERY_STATUS_CHARGE_DISABLED = 7,  /* charge function disabled due to control settings. */

    BATTERY_STATUS_CHARGE_NOT_ALLOWED = 8, /* forbidden by low power supply, e.g 500mA USB cable, but charging current capacity is set 1.5A. */

    BATTERY_STATUS_CHARGE_PROTECTED = 9,  /* forbidden due to temperature out of range (cold or hot) */

} BatteryStatus_t;