[第五課] 休眠設定與鋰電池低效偵測 (ADC)

『走得多慢都無所謂,只要你不停下腳步。』It does not matter how slowly you go so long as you do not stop. ~Andy Warhol
嵌入式系統的設計,如果考慮也可以使用鋰電池來供電,就必須解決充電的問題;要判斷何時該充電了,就必須要知道何時電池電量已所剩不多。由於現在普遍使用雙電源供電切換;除電池迴路之外,也提供USB電源(DC +5V)作為充電與程式編譯之用。所以這樣的供電迴路,還需要加上一組變壓與穩壓器(LDO),提供一路主要的3.3V電源。又因考慮採用鋰電池電源,在充飽後的電壓是4.12V~3.7V,如果切換至電池供電時,通常還會有一路升壓器迴路,提供5V的電源。

在NFC ACCP內部各個組件中,除了 NFC ReWriter 模組使用5V之外,其餘都可以使用3.3V的電源;而為了避免喇叭出現電源轉換時的嗡嗡聲,MP3的播放模組則直接由電池來供電。也正因為這樣的考量,如果沒有先開啟電源開關,就先直接插上USB電源,很有可能會造成MP3的播放模組沒有正常工作;在系統開機測試時,造成無法正確連接的錯誤。

通常會插上USB連接線,一則是為了電池充電;再則是要對主控進行編譯上傳程式。不論是何者,請記得,務必先將電源開關先開啟到ON,然後再接上USB連接線。

由於系統的主控是使用3.3V的電源,對電池電壓的量測,如果不做處理時,當電池掉至3.4V以下時,對系統的3.3V LDO就會開始有電源轉換不穩定的問題;可是此時主控卻還以為電池『滿滿』。所以必須加上一個330K/1.2M Ohm的分壓電路輸入至  A0  進行 ADC 監控,讓電池的量測範圍可以落在0~3.3V之間;意即量測到3.3V就相當電池的電壓在4.12V以上,就表示充飽了。

float voltage = (sensorValue * (4.3 / 1023.0)) * 0.969543;
battLife = (voltage - 3.4) * 100 / (4.12-3.4);

以上是得到電池電壓偵測取樣數值,換算回實際的電壓值的算式。而其中 0.969543 是為了校正取樣誤差加上去的。剛才說過以電池電量可穩定供電的區間是 4.12-3.4V ,所以將其電量的百分比以 battLife 來定義:在 lowPowerHandler() 中,分兩階段來作為電池低效的通知,分別是 LOW_VOLTAGE_THRESHOLD1 30 與 LOW_VOLTAGE_THRESHOLD2 10 ,意即當電量小於30%時,會開始啟動提醒的聲響,同時減緩NFC感應掃描的週期、並將電池檢查的時間從原先20秒縮短為5秒;而當電量小於10%時,會啟動第二階段保護措施,即將讓ACCP立即進入休眠狀態(SLEEP)。

if (battLife <= LOW_VOLTAGE_THRESHOLD2) {
        alarmBeep(BUZZER,1000);
        delay(1000);
        ss = "STOP! BATT is LOW!";
        draw(LLB, 0xFF);
        delay(5000);
        sleepTimer = 99;
        return;
} else if (battLife <= LOW_VOLTAGE_THRESHOLD1) {
        alarmBeep(BUZZER,500);
        delay(500);
        ss = "Recharge! BATT<30%";
        draw(LLB, 0xFF);
        delay(2000);
        sysDelay = 20000;
        BATT_CHK_TIME = 5000;
        return;
}
BATT_CHK_TIME = 20000;

如果你細心的觀察,會發現每20秒一次的電池電量偵測,螢幕上顯示出來的電量百分比,可能會有上下跳動的狀況,而不是合理的持續遞減;這是因為MP3播放模組是ACCP裡最吃電的模組,會因為音樂播放時的動態、音量的大小而起伏不定;又因為是由電池直接供電,電池內部也有其電壓恢復時間的延遲,所以你看到電量百分比才會跳動。

而先前所提到節電的休眠措施,在作法上是讓所有的模組都能進入SLEEP狀態,但可惜不是每個模組都會有提供自身的休眠指令,能夠達到真正的零耗電;而且目前的電源開關是機械式的,當系統要進入SLEEP狀態時,並無法真正能將其切換到OFF的位置,除非你手動介入!

也就是說,這裡提到的休眠措施是指:

  • 停止NFC感應與掃描,並設定進入 standby/powerdown
  • 切斷與USB連線;
  • 關閉螢幕顯示(黑畫面);
  • 停止MP3播放,並設定進入 .sleep();
  • 主控進入SLEEP狀態,不再工作。

case SLEEP: { //enter sleep state
      st = "SLEEP NOW";
      ss = "after 2 sec..";
      draw(TIME, 0xFF);
      delay(2000);
      rwdIdle();
      rfOff();
      RE31_SPI.writeReg(CONTROL_REG, 0x3f);
      USBDevice.detach();
      st = ""; ss = "";
      draw(SLEEP, 0xF0);
      digitalWrite(LED_R, HIGH);
      digitalWrite(LED_G, HIGH);
      digitalWrite(LED_B, HIGH);
      delay(100);
      myDFPlayer.pause();
      myDFPlayer.sleep();
      delay(1000);
      //digitalWrite(SYS_EN, LOW);
      // Enter standby mode
      LowPower.standby();
      break;  
    }

 進入休眠狀態後,你會發現XIAO主控綠燈亮起;因為電源開關還是在ON的位置,仍有一些『夜未眠』的模組:包括LDO、升壓、MP3播放器裡的功放等 (至多還有5mA的耗電,應該足夠放8小時等你睡醒時,來關上電源或充電吧!?)。

最後,要提一下 NFC ACCP CONFIG 的休眠設定,如下圖。請複習一下 [第四課] 的設定方式。當你想要ACCP來伴眠或者是當作工作時的背景音樂時,啟動休眠計時設定,不失為一個貼心的裝置。



留言

熱門文章