1. 程式人生 > >S3C44B0血流檢測儀的動態電源管理模組設計

S3C44B0血流檢測儀的動態電源管理模組設計

關鍵詞:嵌入式系統 動態電源管理 S3C44B0X

引 言

  與其他行動式電子產品一樣,血流引數檢測儀要做到小巧纖薄,堅固耐用,效能可靠,而且待機時間長。因此,系統設計要面對降低功耗及延長電池壽命的艱鉅挑戰。電源管理模組是系統非常重要的組成部分,它包括電池充電管理、電池電量檢測、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。實驗表明,利用動態電源管理,可對行動式醫療儀器實現有效電源管理。