引 言 與其他便攜式電子產(chǎn)品一樣,血流參數檢測儀要做到小巧纖薄,堅固耐用,性能可靠,而且待機時(shí)間長(cháng)。因此,系統設計要面對降低功耗及延長(cháng)電池壽命的艱巨挑戰。電源管理模塊是系統非常重要的組成部分,它包括電池充電管理、電池電量檢測、CPU狀態(tài)轉換、LCD和鍵盤(pán)背光控制。本文將從硬件電路和軟件設計兩個(gè)角度實(shí)現這幾方面功能。 大量實(shí)踐證明,系統處于空閑的時(shí)間占整個(gè)運行時(shí)間的一大部分。電源管理就是為了減少系統在空閑時(shí)間的能量消耗,使嵌入式系統的有效能量供給率最大化,從而延長(cháng)電池的供電時(shí)間。為了延長(cháng)電池的使用時(shí)間,在硬件領(lǐng)域,低功耗硬件電路的設計方法得到了廣泛應用。然而僅僅利用低功耗硬件電路仍然不夠,在系統設計中,提出采用“動(dòng)態(tài)電源管理”概念,即把系統中不在使用的組件關(guān)閉或者進(jìn)入低功耗模式(待機模式)。另外一種更加有效的方法就是動(dòng)態(tài)可變電壓DVS和動(dòng)態(tài)可變頻率DFS,即在運行時(shí)動(dòng)態(tài)地調節CPU頻率或者電壓。這樣可以在滿(mǎn)足瞬時(shí)性能的前提下,使得有效能量供給率最大化。 1 系統設計 整個(gè)儀器設計采用S3C44B0芯片和uClinux操作系統。S3C44B0芯片是業(yè)界應用較多、功耗較低、成本低的中檔產(chǎn)品。它提供五種工作狀態(tài):NORMAL、SLOW、IDLE、STOP和SL_IDLE。系統正常工作在NORMAL狀態(tài),當用戶(hù)無(wú)操作時(shí)段大于某一閾值時(shí),則進(jìn)入IDLE狀態(tài),用戶(hù)按假關(guān)機鍵進(jìn)入STOP狀態(tài),這時(shí)系統功耗很低。為了便于管理,應用層對電源管理狀態(tài)進(jìn)行了細劃,引入電源管理的六個(gè)狀態(tài):數據采集狀態(tài)、正常工作狀態(tài)、準備狀態(tài)、休息狀態(tài)、IDLE狀態(tài)和STOP狀態(tài)。其中,IDLE狀態(tài)和STOP狀態(tài)與芯片提供的內容相同,由應用程序負責狀態(tài)的遷移。整個(gè)儀器功耗最大的組件是背光(EL背光和鍵盤(pán)LED)、LCD和傳感器驅動(dòng),其次才是CPU,電源管理狀態(tài)遷移如圖1所示。 圖1 系統的電源管理狀態(tài)遷移 1.1 電源管理模型 圖2是電源管理的原理框圖,其中包含6個(gè)模塊: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為L(cháng)CD模塊供電,供電電壓為3.3V和200VCA。 電池充電的電路原理為:當CPU檢測到有外接電源時(shí),CPU使用ADC檢測電池二端的電壓,并判斷是否需要充電;當電池兩端電壓低于設定值時(shí),打開(kāi)Charge電路給電池充電,并檢測充電電流,以保證電池安全有效的充電,充電至設定值時(shí)停止充電;當無(wú)外接電源時(shí),電池為整個(gè)系統供電,CPU檢測電池電壓,當低于某一設定電壓時(shí),決定報警還是關(guān)機,以保護電池。 Vcore和Vio分別為系統的內核和I/O口供電,同時(shí)Vio也為存儲器供電。Backup電池為系統的備份電池。 Vdriver為傳感器提供±5 V的電壓,并保證電流為25±1 mA。 Vlcd為L(cháng)CD模塊提供二組電壓,其中3.3 V為L(cháng)CD顯示提供電壓,200VAC為L(cháng)CD的背光提供電壓。 圖2 系統的電源管理框圖 1.2 驅動(dòng)程序設計 1.2.1 驅動(dòng)提供接口 系統硬件電源管理模塊為系統電源管理功能的實(shí)現提供必要的硬件基礎,并為驅動(dòng)程序提供如下編程接口: ◆ 系統供電方式接口,通過(guò)此接口驅動(dòng)和應用程序,可知道系統此時(shí)是由電池供電還是由外接電源供電; ◆ 電池電量檢測接口,通過(guò)此接口驅動(dòng)程序可檢測到系統的電量,應用程序由此可實(shí)現系統電池電量的顯示及電池電量報警等功能; ◆ 電池充電狀態(tài),當系統使用外接電源供電時(shí),可對系統中的電池充電,通過(guò)此接口驅動(dòng)可獲取電池的充電狀態(tài)(正在充電或電池已充滿(mǎn)); ◆ 電池溫度檢測接口,通過(guò)此接口驅動(dòng)程序可檢測到電池的溫度,電池溫度和電池電量相結合可用來(lái)計算電池的使用時(shí)間,同時(shí)在電池過(guò)熱(電池有問(wèn)題)時(shí)向用戶(hù)報警,提醒用戶(hù)關(guān)機或更換電池。 電源管理驅動(dòng)部分主要給上層提供如下接口。 1) 取得電池電量及系統用電情況 通過(guò)端口A(yíng)DC1讀取電池電壓。上限電壓為4.2 V,下限電壓為3.6 V ,報警電壓為3.6 V,強行關(guān)機電壓為3.4 V。數據電壓關(guān)系:1024-5 V ;0-0 V。 電池充電管理由硬件實(shí)現,但在電池充電到4.2 V時(shí),延時(shí)30 min關(guān)閉充電功能(應用層完成)。 控制端口為GPC1,1為外部電源供電,0為電池供電。在系統接有外接電源時(shí),系統由外部電源供電。 2) 電池充電控制控制端口為GPA9,0為充電,1為關(guān)閉充電,當電池電源低于3.8 V時(shí),GPA9設為0,開(kāi)始充電(應用層完成)。 5 V電源只用于數據采集,非數據采集狀態(tài)下關(guān)閉5 V電源(在A(yíng)DC中實(shí)現)?刂贫丝谑荊PC2,0為打開(kāi),1為關(guān)閉。 3) 假關(guān)機 關(guān)機狀態(tài)下,只關(guān)閉鍵盤(pán)燈和液晶屏,但系統仍處于正常運行狀態(tài)。關(guān)閉鍵盤(pán)燈、液晶屏以及其他外設的工作由上層軟件實(shí)現。 1.2.2 程序流程 uClinux啟動(dòng)時(shí)調用module_init(power_44b0_init)函數,進(jìn)而power_44b0_init被調用,進(jìn)行相關(guān)的初始化: ◆ power0_44b0_reg_init()初始化硬件寄存器; ◆ power_44b0_device_register()注冊power_44b0_fops以及中斷處理函數power_key_44b0_interrupt(),并且初始化定時(shí)器power_down_timer; ◆ 用戶(hù)程 序通過(guò)power_44b0_open()函數打開(kāi)/dev/power設備,通過(guò)power_44b0_release()函數釋放/dev/power設備,通過(guò)power_44b0_ioctl()函數實(shí)現對設備的各種操作; ◆ 關(guān)機進(jìn)入stop模式,通過(guò)中斷處理函數power_key_44b0_interrupt()處理關(guān)機鍵對應的中斷,按下關(guān)機鍵后用power_down_timer計時(shí),當3 s后,power_down_timer對應的動(dòng)作power_down_timer_call()發(fā)生,從而進(jìn)入stop模式。 1.2.3 接口設計與接口函數實(shí)現 1)數據結構說(shuō)明 電源和設備狀態(tài)由power_status_t的結果表示。 typedef struct { unsigned long battery_quantity;//電池電量 //目前只提供電池電壓 unsigned long device_status;//系統中各設備的運行狀態(tài) //Bit0:系統供電方式,0:電池;1:外接電源 //Bit1:LCD狀態(tài),0:正常運行;1:關(guān)閉 //Bit2:LCD背光狀態(tài),0:打開(kāi);2:關(guān)閉 unsigned char system_status; //系統運行狀態(tài):0為正常模 //式,1為STOP模式 } power_status_t 2)file_operations的值 電源管理模塊驅動(dòng)的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的實(shí)現 NULL,//test_mmap power_44b0_open, //open,打開(kāi)設備 NULL,//flush power_44b0_release,//release,關(guān)閉設備 }; 3)power_44b0_ioctl()函數設計 函數原形:static int power_44b0_ioctl (struct inode *inode, struct file *filp,unsigned int cmd, unsigned int arg)。 功能說(shuō)明:設備ioctl的操作函數。 參數說(shuō)明:inode,文件指針,執行操作類(lèi)型,根據操作類(lèi)型指定不同參數。 返回值:0表示成功,否則返回ENOTTY。 判斷cmd的值,根據cmd的不同值進(jìn)行不同的操作,電源設備的ioctl主要實(shí)現以下14種操作: GET_POWER_STATUS,獲得由power_status_t結構表示的電源與設備狀態(tài); SET_BATTARY_CHARGE_OFF,通過(guò)寫(xiě)GPA9寄存器來(lái)停止充電; SET_BATTARY_CHARGE_ON,寫(xiě)GPA9寄存器來(lái)開(kāi)始充電; GET_SYS_STAT,獲得當前系統狀態(tài); START_VOLTAGE_CONVERSION,通道ADC1開(kāi)始轉換電源電壓; STOP_VOLTAGE_CONVERSION,通道ADC1停止轉換電源電壓; GET_CHARGE_STATUS,取得當前可否充電的狀態(tài); SYS_ENTER_STOP_MODE,用戶(hù)程序使系統進(jìn)入stop模式接口,調用power_down_timer_call()函數來(lái)實(shí)現; SYS_ENTER_IDLE_MODE,用戶(hù)程序使系統進(jìn)入idle模式的接口,調用enter_IDLE_mode()函數實(shí)現; SYS_ENTER_SL_IDLE_MODE,用戶(hù)程序使系統進(jìn)入sl_idle模式的接口,調用enter_SL_IDLE_mode()函數實(shí)現; ENABLE_LCD,調用enable_lcd()使LCD工作; DISABLE_LCD,調用disable_lcd()使LCD停止工作; ENANLE_LED,鍵盤(pán)燈有效工作; DISABLE_LED,停止鍵盤(pán)燈工作。 4)power_key_4 4b0_interrupt 函數原形:static void power_key_44b0_interrupt(int irq, void *dev_id, struct pt_regs *regs) 。 功能說(shuō)明:響應關(guān)機鍵,進(jìn)入stop模式。 參數說(shuō)明:中斷號,設備id,寄存器結構。 下面介紹函數的算法描述。 在正常狀態(tài)下: if (按下開(kāi)關(guān)機鍵) { 設置開(kāi)關(guān)機鍵狀態(tài)為按下; 關(guān)機計時(shí)器開(kāi)始計時(shí),計時(shí)結束時(shí)進(jìn)入stop模式; 設置開(kāi)關(guān)機鍵產(chǎn)生中斷方式為上升沿觸發(fā)中斷; } else//開(kāi)關(guān)機鍵抬起 { 設置開(kāi)關(guān)機鍵狀態(tài)為抬起; 使關(guān)機定時(shí)器失效; 設置開(kāi)關(guān)機鍵產(chǎn)生中斷方式為下降沿觸發(fā)中斷; } 在關(guān)機狀態(tài)下: if (按下開(kāi)關(guān)機鍵) { 設置開(kāi)關(guān)機鍵狀態(tài)為按下; 開(kāi)機計時(shí)器開(kāi)始計時(shí),計時(shí)結束時(shí)進(jìn)入stop模式; 設置開(kāi)關(guān)機鍵產(chǎn)生中斷方式為上升沿觸發(fā)中斷; } else//開(kāi)關(guān)機鍵抬起 { 設置開(kāi)關(guān)機鍵狀態(tài)為抬起; 使開(kāi)機定時(shí)器失效; 設置開(kāi)關(guān)機鍵產(chǎn)生中斷方式為下降沿觸發(fā)中斷。 } 2 總結 儀器配置2200 mAh的鎳氫電池,經(jīng)過(guò)測試,電源管理模塊使整個(gè)系統的功耗降低了60%。系統在數據采集狀態(tài)下,由電池的輸出電流為220mA左右;如果處于IDLE狀態(tài),則電流總消耗為80mA;在STOP狀態(tài)(關(guān)閉ARM和所有設備,維持一個(gè)32 768 Hz的時(shí)鐘),電流可降到10mA。實(shí)驗表明,利用動(dòng)態(tài)電源管理,可對便攜式醫療儀器實(shí)現有效電源管理。 |