码农的自我修养 - BatteryManager设计
对于使用电池进行供电的电子产品,就需要一个电池管理模块,叫做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;