- UID
- 864567
|
引 言
与其他便携式电子产品一样,血流参数检测仪要做到小巧纤薄,坚固耐用,性能可靠,而且待机时间长。因此,系统设计要面对降低功耗及延长电池寿命的艰巨挑战。电源管理模块是系统非常重要的组成部分,它包括电池充电管理、电池电量检测、CPU状态转换、LCD和键盘背光控制。本文将从硬件电路和软件设计两个角度实现这几方面功能。
大量实践证明,系统处于空闲的时间占整个运行时间的一大部分。电源管理就是为了减少系统在空闲时间的能量消耗,使嵌入式系统的有效能量供给率最大化,从而延长电池的供电时间。为了延长电池的使用时间,在硬件领域,低功耗硬件电路的设计方法得到了广泛应用。然而仅仅利用低功耗硬件电路仍然不够,在系统设计中,提出采用“动态电源管理”概念,即把系统中不在使用的组件关闭或者进入低功耗模式(待机模式)。另外一种更加有效的方法就是动态可变电压DVS和动态可变频率DFS,即在运行时动态地调节CPU频率或者电压。这样可以在满足瞬时性能的前提下,使得有效能量供给率最大化。
1 系统设计
整个仪器设计采用S3C44B0芯片和uClinux操作系统。S3C44B0芯片是业界应用较多、功耗较低、成本低的中档产品。它提供五种工作状态:NORMAL、SLOW、IDLE、STOP和SL_IDLE[1]。系统正常工作在NORMAL状态,当用户无操作时段大于某一阈值时,则进入IDLE状态,用户按假关机键进入STOP状态,这时系统功耗很低。为了便于管理,应用层对电源管理状态进行了细划,引入电源管理的六个状态:数据采集状态、正常工作状态、准备状态、休息状态、IDLE状态和STOP状态。其中,IDLE状态和STOP状态与芯片提供的内容相同,由应用程序负责状态的迁移。整个仪器功耗最大的组件是背光(EL背光和键盘LED)、LCD和传感器驱动,其次才是CPU,电源管理状态迁移如图1所示。
图1 系统的电源管理状态迁移
1.1 电源管理模型
图2是电源管理的原理框图,其中包含6个模块:Vcore,Vio,Backup,Charge,Vdriver和Vlcd,它们分别为系统各部分供电。
Vcore为系统内核供电,供电电压为1.8 V;Vio为系统的I/O口供电,供电电压为3.3 V;Backup为系统备份电池供电,电池电压为3 V;Charge为充电电路,电池电压为3.6 V的充电电池;Vdriver为传感器供电电路,电压为±5 V;Vlcd为LCD模块供电,供电电压为3.3V和200VCA。
电池充电的电路原理为:当CPU检测到有外接电源时,CPU使用ADC检测电池二端的电压,并判断是否需要充电;当电池两端电压低于设定值时,打开Charge电路给电池充电,并检测充电电流,以保证电池安全有效的充电,充电至设定值时停止充电;当无外接电源时,电池为整个系统供电,CPU检测电池电压,当低于某一设定电压时,决定报警还是关机,以保护电池。
Vcore和Vio分别为系统的内核和I/O口供电,同时Vio也为存储器供电。Backup电池为系统的备份电池。
Vdriver为传感器提供±5 V的电压,并保证电流为25±1 mA。
Vlcd为LCD模块提供二组电压,其中3.3 V为LCD显示提供电压,200VAC为LCD的背光提供电压。
图2 系统的电源管理框图
1.2 驱动程序设计
1.2.1 驱动提供接口
系统硬件电源管理模块为系统电源管理功能的实现提供必要的硬件基础,并为驱动程序提供如下编程接口:
◆ 系统供电方式接口,通过此接口驱动和应用程序,可知道系统此时是由电池供电还是由外接电源供电;
◆ 电池电量检测接口,通过此接口驱动程序可检测到系统的电量,应用程序由此可实现系统电池电量的显示及电池电量报警等功能;
◆ 电池充电状态,当系统使用外接电源供电时,可对系统中的电池充电,通过此接口驱动可获取电池的充电状态(正在充电或电池已充满);
◆ 电池温度检测接口,通过此接口驱动程序可检测到电池的温度,电池温度和电池电量相结合可用来计算电池的使用时间,同时在电池过热(电池有问题)时向用户报警,提醒用户关机或更换电池。
电源管理驱动部分主要给上层提供如下接口。
(1) 取得电池电量及系统用电情况
通过端口ADC1读取电池电压。上限电压为4.2 V,下限电压为3.6 V ,报警电压为3.6 V,强行关机电压为3.4 V。数据电压关系:1024-5 V ;0-0 V。
电池充电管理由硬件实现,但在电池充电到4.2 V时,延时30 min关闭充电功能(应用层完成)。
控制端口为GPC1,1为外部电源供电,0为电池供电。在系统接有外接电源时,系统由外部电源供电。
(2) 电池充电控制
控制端口为GPA9,0为充电,1为关闭充电,当电池电源低于3.8 V时,GPA9设为0,开始充电(应用层完成)。
5 V电源只用于数据采集,非数据采集状态下关闭5 V电源(在ADC中实现)。控制端口是GPC2,0为打开,1为关闭。
(3) 假关机
关机状态下,只关闭键盘灯和液晶屏,但系统仍处于正常运行状态。关闭键盘灯、液晶屏以及其他外设的工作由上层软件实现。
1.2.2 程序流程
uClinux启动时调用module_init(power_44b0_init)函数,进而power_44b0_init被调用,进行相关的初始化:
◆ power0_44b0_reg_init()初始化硬件寄存器;
◆ power_44b0_device_register()注册power_44b0_fops以及中断处理函数power_key_44b0_interrupt(),并且初始化定时器power_down_timer;
◆ 用户程序通过power_44b0_open()函数打开/dev/power设备,通过power_44b0_release()函数释放/dev/power设备,通过power_44b0_ioctl()函数实现对设备的各种操作;
◆ 关机进入stop模式,通过中断处理函数power_key_44b0_interrupt()处理关机键对应的中断,按下关机键后用power_down_timer计时,当3 s后,power_down_timer对应的动作power_down_timer_call()发生,从而进入stop模式。
1.2.3 接口设计与接口函数实现
(1)数据结构说明
电源和设备状态由power_status_t的结果表示。
typedef struct {
unsigned long battery_quantity;//电池电量
//目前只提供电池电压
unsigned long device_status;//系统中各设备的运行状态
//Bit0:系统供电方式,0:电池;1:外接电源
//Bit1:LCD状态,0:正常运行;1:关闭
//Bit2:LCD背光状态,0:打开;2:关闭
unsigned char system_status; //系统运行状态:0为正常模
//式,1为STOP模式
} power_status_t
(2)file_operations的值
电源管理模块驱动的file_operations具体值为:
struct file_operations power_44b0_fops={
NULL, //struct module *owner;
NULL, //llseek
NULL, //read
NULL, //write
NULL, //readdir
NULL, //poll
power_44b0_ioctl,//ioctl,对上层调用ioctl的实现
NULL, //test_mmap
power_44b0_open, //open,打开设备
NULL, //flush
power_44b0_release,//release,关闭设备
};
(3)power_44b0_ioctl()函数设计
函数原形:static int power_44b0_ioctl (struct inode *inode, struct file *filp,unsigned int cmd, unsigned int arg)。
功能说明:设备ioctl的操作函数。
参数说明:inode,文件指针,执行操作类型,根据操作类型指定不同参数。
返回值:0表示成功,否则返回ENOTTY。
判断cmd的值,根据cmd的不同值进行不同的操作,电源设备的ioctl主要实现以下14种操作:
GET_POWER_STATUS,获得由power_status_t结构表示的电源与设备状态;
SET_BATTARY_CHARGE_OFF,通过写GPA9寄存器来停止充电;
SET_BATTARY_CHARGE_ON,写GPA9寄存器来开始充电;
GET_SYS_STAT,获得当前系统状态;
START_VOLTAGE_CONVERSION,通道ADC1开始转换电源电压;
STOP_VOLTAGE_CONVERSION,通道ADC1停止转换电源电压;
GET_CHARGE_STATUS,取得当前可否充电的状态;
SYS_ENTER_STOP_MODE,用户程序使系统进入stop模式接口,调用power_down_timer_call()函数来实现;
SYS_ENTER_IDLE_MODE,用户程序使系统进入idle模式的接口,调用enter_IDLE_mode()函数实现;
SYS_ENTER_SL_IDLE_MODE,用户程序使系统进入sl_idle模式的接口,调用enter_SL_IDLE_mode()函数实现;
ENABLE_LCD,调用enable_lcd()使LCD工作;
DISABLE_LCD,调用disable_lcd()使LCD停止工作;
ENANLE_LED,键盘灯有效工作;
DISABLE_LED,停止键盘灯工作。
(4)power_key_44b0_interrupt
函数原形:static void power_key_44b0_interrupt(int irq, void *dev_id, struct pt_regs *regs) 。
功能说明:响应关机键,进入stop模式。
参数说明:中断号,设备id,寄存器结构。
下面介绍函数的算法描述。
在正常状态下:
if (按下开关机键)
{ 设置开关机键状态为按下;
关机计时器开始计时,计时结束时进入stop模式;
设置开关机键产生中断方式为上升沿触发中断;
}
else//开关机键抬起
{ 设置开关机键状态为抬起;
使关机定时器失效;
设置开关机键产生中断方式为下降沿触发中断;
}
在关机状态下:
if (按下开关机键)
{ 设置开关机键状态为按下;
开机计时器开始计时,计时结束时进入stop模式;
设置开关机键产生中断方式为上升沿触发中断;
}
else//开关机键抬起
{ 设置开关机键状态为抬起;
使开机定时器失效;
设置开关机键产生中断方式为下降沿触发中断。
}
2 总结
仪器配置2200 mAh的镍氢电池,经过测试,电源管理模块使整个系统的功耗降低了60%。系统在数据采集状态下,由电池的输出电流为220mA左右;如果处于IDLE状态,则电流总消耗为80mA;在STOP状态(关闭ARM和所有设备,维持一个32 768 Hz的时钟),电流可降到10mA。实验表明,利用动态电源管理,可对便携式医疗仪器实现有效电源管理。 |
|