Skip to main content
< All Topics
Print

【感測】電壓監控 | Power

簡介


電壓監控功能就像是機器人的「體力條」或手機上的「電池百分比」。在現實生活中,不論是電動車、筆記型電腦還是無人機,隨時掌握剩餘電量對於安全運作至關重要。透過這項功能,機器人能主動察覺自己是否「體力不足」,並透過燈號顏色即時發出警報。這不僅能防止機器人在任務中途突然斷電,更重要的是能保護昂貴的鋰電池免於因「過度放電」而永久損壞,確保機器人的使用壽命。

在移動機器人開發中,穩定的電源供應是所有硬體運作的前提。dual2s 函式庫內建了 Power 類別,專門用於偵測控制板輸入端的實時電壓。本範例展示了如何利用 ESP32 的類比讀取功能獲取電池數值,並結合視覺化的 stateLED(狀態燈),建立一套直覺的電壓預警系統。

硬體機制與原理

  • 偵測對象:針對 2S(兩串聯)鋰電池組進行電壓量測。
  • 腳位配置:使用 DUAL2S_HW::BATTERY 硬體預設腳位。
  • 分壓電路:控制器內部已配置分壓電路,將高電壓轉為 ESP32 可安全讀取的範圍,類比讀取後再由類別內部演算法還原為實際電壓值(V)。

核心功能說明

  1. 實時讀取 read()
    • 回傳值:回傳一個 float 類型的浮點數(例如 7.85),代表目前的總電壓。
    • 精準度:經過函式庫校正,可提供精確的電壓參考。
  2. 安全閾值管理 (Safety Thresholds): 範例程式定義了基於 2S 鋰電池特性的三段式警報邏輯:
    • 健康狀態 (>= 7.4V):顯示綠燈,代表電池充裕,可正常進行高負載動作(如前進、推擠)。
    • 警告狀態 (< 7.4V):顯示黃燈,提示電壓已接近中位值,建議準備充電。
    • 危險狀態 (< 6.4V):顯示紅燈,此時電壓極低,持續運作可能導致鋰電池永久性損壞,應立即停止馬達轉動並關閉電源。

開發重點建議

  • 非阻斷監控:範例採用 millis() 計時器(每秒更新一次),這能避免在讀取電壓時阻塞主程式的感測器讀取或馬達控制。
  • 電壓波動預防:馬達在大電流啟動瞬間(例如突然加速)會導致電壓瞬間驟降(Sag)。在撰寫更複雜的判斷邏輯時,建議可以透過多次取樣平均或增加短暫延時判定,來避免頻繁的燈號閃爍。

dual2s控制器與環境


AI學伴


互動(1):基於函數庫 – dual2s

互動(2):基於範例程式

👉 你也可以在dual2s函數庫(./example/basic)中找到此範例程式。

/*=====================================================================================
yesio.net / 2026.03.12 / by nick
# Filename:07_powerMonitoring.ino
# Function:dual2s電壓之使用範例, 
  Examples of dual2S's application for voltage detection.
# Toolchain & Libs:ESP32 Arduino Core v3.3.5 (ESP-IDF v5.1), dual2s
======================================================================================*/
#include "dual2s.h"

#define NUM_LEDS 2 // 定義硬體腳位與 LED 數量

Power pwr(DUAL2S_HW::BATTERY);    // 建立物件 - dual2s控制器電壓偵測
stateLED myLED(DUAL2S_HW::WSLED, NUM_LEDS); // 參數1:控制腳位, 參數2:燈數

unsigned long lastUpdate = 0;

void setup() {
  Serial.begin(115200);
  myLED.begin();
  
  Serial.println("=== 電壓監控測試開始 ===");
}

void loop() {
  unsigned long currentMillis = millis();

  // 實驗因素, 是以每秒讀取一次電壓
  if (currentMillis - lastUpdate >= 1000) {
     lastUpdate = currentMillis;

     float v = pwr.read();
     
     // 根據 2S 鋰電池特性微調的安全閾值
     if (v < 6.4) {  
       myLED.fillColor(stateLED::RED);    // 危險低電量 (< 6.4V):顯示紅色 (建議立即斷電)
     } 
     else if (v < 7.4) { 
       myLED.fillColor(stateLED::YELLOW); // 電量偏低 (< 7.4V):顯示黃色 (建議準備充電)
     } 
     else {
       myLED.fillColor(stateLED::GREEN);  // 電量健康 (>= 7.4V):顯示綠色
     }

     Serial.printf("Battery Voltage: %.2fV\n", v);
  }
}
Table of Contents