||
在物聯網應用場景中,設備續航能力直接影響其部署成本與運維效率。Air8201作為新一代低功耗物聯網通信模塊,其硬件架構已內置多種電源管理單元(PMU),但僅依靠硬件優化難以滿足復雜場景的動態功耗需求。
電源管理是電子設備中非常重要的一部分,尤其是在移動設備和嵌入式系統中。它直接關系到設備的能效、續航時間和整體性能。以下是關于電源管理的一些基本知識和常見概念的介紹。
1.1 電源管理的定義電源管理指的是在電子設備內部合理利用和調節電源,以保證各個組件在最佳運行條件下工作,同時延長設備的使用時間和確保能量的有效利用。
延長電池壽命:通過有效的充放電管理,使電池在使用過程中更長久地保持能量。
優化能耗:監測各個部件的能耗,減少不必要的能量消耗。
提供穩定的電力供給:確保設備在不同的負載和環境條件下都能穩定工作。
Vbat(電池電壓):指設備中電池當前的電壓值,通常用于評估電池的狀態。
電池電量百分比:代表電池當前剩余能量的百分比,通常用于用戶界面顯示。
充電狀態:指設備是否正在充電,影響電池電量的監測和管理策略。
電池放電曲線:描述不同電壓下電池剩余電量的關系,幫助計算電量百分比。
電池調節電壓:電池在充放電過程中,可以通過一定控制策略或電路設計,維持電池電壓在一定范圍內的穩定。Air8201 的電池電壓上限值默認為 4.2V,可在代碼中自行更改電池電壓閾值。
快速充電:快速充電是一種技術,它允許電池在較短時間內充入更多電量?焖俪潆娂夹g包括恒流充電與恒壓充電。在快速充電的恒流階段,充電器會以一個固定的電流給電池充電,直到電池電壓達到一個預設的電壓值(Air8201 默認為 4.2V),隨后切換至恒壓模式,此時電流逐漸減小,直到電池充滿后停止充電。
電量監測:通過 ADC(模數轉換)讀取電池電壓,定期更新電量狀態。
充電檢測:利用 GPIO 中斷檢測充電狀態,判斷電池是否處于充電狀態。
自動關機:根據電量百分比自動關閉設備,以防止電池過度放電。
過壓保護:當充電到達電池電壓閾值時會自動停止充電,待剩余電量與滿電量相差超過 120mA 時恢復充電。
用戶接口:通過長按電源鍵執行關機命令,提升用戶體驗。
路徑管理:當插入 USB 既可以給鋰電池充電,同時也可以給主板供電
在實際應用中,電源管理代碼通常涉及多個功能模塊,包括初始化電源,實時監測電量,響應用戶操作和維護設備狀態。一個良好的電源管理系統能夠顯著提高設備的性能和用戶滿意度。
通過合理的電源管理策略,用戶不僅可以延長設備的使用時間,還可以確保設備在關鍵時刻的穩定性和可靠性。在編寫電源管理程序時,應充分考慮設備的使用場景和用戶的需求。
二、演示功能概述
在本演示中,我們將展示電源管理系統的核心功能模塊,以及如何通過不同的技術手段實現有效的電源管理。這些功能旨在提升設備的性能和用戶體驗,以下是主要演示功能的概述:
1. 電量監測:本系統通過 ADC(模數轉換器)實時讀取電池電壓,并定期更新電量狀態。通過精確監測電池電壓,可以讓用戶清晰掌握當前電池剩余電量,避免意外關機帶來的困擾。
2. 充電檢測:系統利用 GPIO 中斷技術,能夠快速檢測電池的充電狀態。當設備連接到電源時,將自動判斷電池是否在充電狀態,并相應地調整電源管理策略,以優化充電效率和電池壽命。
3. 自動關機:根據監測到的電量百分比,該系統能夠在電量過低時自動關機,以防止電池過度放電。這種智能管理能夠保護電池,延長其使用壽命,確保設備在低電量時不會意外關機。
4. 用戶接口:系統提供了便捷的用戶交互接口,用戶可以通過長按電源鍵實現關機操作。提升用戶體驗的同時,確保用戶可以方便地控制設備的電源狀態。
通過這些功能的實現,用戶不僅可以延長設備的使用時間,還能夠保證設備在關鍵時刻的穩定性和可靠性。在實際應用中,這些功能能夠有效地提升設備性能,滿足用戶對電源管理的需求。
三、演示硬件環境3.1 開發板
本文以 Air8201 開發板 為例
此開發套件的詳細使用說明參考:Air8201 產品手冊 中的 Air8201 硬件手冊 和 Air8201 的 LuatOS 快速入門。
(Air8201 產品手冊 :https://docs.openluat.com/air8201/product/)
在中國大陸環境下,使用移動,電信,聯通的物聯網卡或者手機卡都可以。
3.3 PC 電腦PC 電腦推薦使用 Windows10 及以上版本。
3.4 數據通信線1. USB 轉 Type-C 數據線它的一端是 USB 接口,另一端是 Type-C 接口。
Luatools 工具支持最新固件獲取、固件打包、trace 打印及單機燒錄等功能。
工具使用說明參考:
(Luatools 下載和詳細使用:https://docs.openluat.com/Luatools/)
4.2 獲取固件及源碼1. 底層 core 下載地址:https://docs.openluat.com/air8201/luatos/firmware/
本文使用的固件版本為 LuatOS-SoC_V2002_Air8201.soc 。
2. demo 位置
本 demo 的主要功能是對電池管理系統的控制和監測
demo 位置參考:https://gitee.com/openLuat/LuatOS-Air8201/tree/master/demo/pm
五、軟硬件資料
注意注意,鋰電池與鋰離子電池不是同一種電池。鋰電池是一個統稱,而鋰離子電池是鋰電池的其中一種類型。
Air8201 選用了一款高度集成的單電池鋰離子電池充電器,該充電器具有系統電源路徑管理,可供空間有限的便攜式應用使用。功能具有涓流充電、恒流充電、恒壓充電、充電終止和自動充電。而且可以自動調節充電電流與充電電壓,或者進入其他模式。
5.1.1 鋰電池充電過程鋰離子電池的充電過程可概括為四個階段:涓流充電、恒流充電、恒壓充電以及充電終止。以下為這四個階段的詳細介紹。
涓流充電用于先對完全放電的電池單元進行預充,也叫恢復性充電。在電池電壓低于 3V 左右時,先采用最大 0.1C 的恒定電流對電池進行充電。(C 是充放電倍率,表示電池在單位時間內充放電電流與電池額定容量的比值。例如,一個電池的額定容量是 1000mAh,1C 就表示以 1000mA 的電流在單位時間內進行充放電,也表示電池在一小時內完全充放電。)
2. 恒流充電:在涓流充電之后,當電池電壓上升到涓流充電閾值以上時,此時提高充電電流從而進行恒流充電。這個階段的電流通常在 0.2C~1.0C 之間,電池電壓隨著恒流充電過程在逐步升高。恒流充電時的電流并不要求十分精確,準恒定電流也可以。
當在線性充電器設計中,電流經常會隨著電池電壓的上升而上升,應盡量減輕傳輸晶體管上的散熱問題。選擇大于 1.0C 的恒流充電并不會縮短整個充電充電周期時間,這種做法是不可取的。
當以更高電流進行充電時,由于電極反應的過壓以及電池內部阻抗上的電壓上升,電池電壓會更快速地上升。恒流充電階段就會變短,同時下面恒壓充電階段的時間會相應增加,因此總的充電周期時間并不會縮短。
3. 恒壓充電:當電池電壓上升到 4.2V(默認值)時,恒流充電結束,開始恒壓充電階段。在此階段,電流會根據電芯的飽和程度逐漸減少,直到達到一個很小的值,可稱為判滿電流值時,充電終止。
4. 充電終止:與鎳電池不同,此時不建議對鋰離子電池進行連續涓流充電。連續涓流充電會導致金屬鋰出現極板電鍍效應。從而使電池不穩定,并且極大可能導致突然的自動快速解體。
這個階段有兩種典型的充電終止方法:一種是采用最小充電電流判斷,當恒壓充電階段的充電電流減小到判滿電流值時終止充電;另一種是從恒壓充電階段開始計時,持續充電兩個小時后終止充電過程。Air8201 選擇的電池充電器充電終止方法為第一種。
5. 充電恢復說明:充電終止后,當電池放電后剩余電量與滿電量相差超過 120mV 時會恢復充電,轉為恒壓充電階段。
5.1.2 鋰電池放電說明
由于鋰電池內部結構所致,在放電時鋰電池不能全部移向正極,必須要保留一部分鋰離子在負極,從而保證在下次充電時鋰離子能夠暢通地嵌入通道。否則,電池壽命將會大大縮短。
1. 放電電壓平臺:鋰電池在放電過程中,電壓會保持在一個相對穩定的范圍內,這個范圍被稱為放電電壓平臺。對于大多數鋰電池來說,這個平臺大約在 3.7V 到 3.0V 之間。
2. 放電電流:放電電流是指電池在放電過程中的電流強度。放電電流的大小會直接影響到電池的放電時間和壽命。大電流放電時會導致電池溫度升高,也可能會縮短電池壽命。(鋰電池放電電流不應超過電池容量的 3 倍,例如 1000mAH 電池,放電電流應嚴格控制在 3A 以內,否則會導致電池損壞。)
3. 放電截止電壓:為了保證鋰電池放電后石墨層中仍留有部分鋰離子,就需要嚴格限制最低放電截止電壓,也就是要避免過放電。當電池電壓降到這個值時,電池應停止放電。對于大多數鋰電池,這個截止電壓大約是 2.5V 到 3.0V。
Air8201 在代碼中已經設置當電池電量低于 30% 且兩分鐘內沒有充電時自動關機。
4. 放電效率:放電效率是指電池放電過程中電能轉換的效率。鋰電池放電效率可達到 90% 以上。
5. 放電深度:放電深度是指電池放電時放電量與電池總容量的比率。即放電深度=(放電量/電池總容量)*100% 。(例如,如果一個電池的總容量是 1000mAh,放電到 500mAh,那么放電深度就是 50%。)
6. 放電速率:放電速率是指電池單位時間內放電時放電量與電池額定容量的比值,用充放電倍率 C 表示。(例如,一個電池的額定容量為 1000mAh,如果用 200mA 的電流進行放電,其放電倍率為 0.2C,因為 200mA/1000mAh=0.2。)
7. 溫度影響:鋰電池的放電性能受溫度影響較大。在低溫下,電池的放電性能會下降,而在高溫下,電池的壽命可能會縮短。
8. 循環壽命:鋰電池的循環壽命是指電池可以經歷的充放電次數。一般來說,鋰電池的循環壽命可以達到幾百到幾千次,具體還要取決于電池的類型、使用條件和放電深度。
9. 自放電:鋰電池即使在不使用的情況下也會進行自動放電,這種現象稱為自放電。鋰電池的自放電率相對較低,通常每月 1% 到 2%。
5.2 sensor 庫介紹
sensor 庫是一個傳感器操作庫,用于在 LuatOS 環境中處理各種傳感器的數據交互。它支持多個傳感器的操作,包括 DS18B20 溫度傳感器、DHT11/DHT12 溫濕度傳感器、HX711 稱重傳感器、CS1237 傳感器、WS2812B RGB LED 燈帶以及 SC12A 觸摸傳感器等。
此為 sensor 庫 API 接口介紹 ,大家可自行參考測試。
5.3 Air8201 開發板燒錄說明5.3.1 選擇固件和腳本
1. 打開 Luatools_v3 工具
2. 點擊 項目管理測試
3. 根據圖示操作
注意,大家只需要跟著做到第四步即可,第五步跟著后面的操作再做。
1. 將 Air8201 開發板通過 USB 數據線連接至電腦,如下圖所示:
由于 Air8201 單板子沒有復位鍵和 BOOT 鍵,所以數據線與 Air8201 開發板之間還需要接一個 USB_BOOT 板,不過大家放心,Air8201 套件里已經包括了 USB_BOOT 板,不需要單獨購買。 而且特別注意,USB_BOOT 板在接 Air8201 開發板時不用區分正反。
2. 根據下方操作進行燒錄
此時就需要大家先點擊 Luatools 工具上的 下載腳本 或 下載底層和腳本,再執行下方操作了。
開發板處于未開機狀態:此時先按住下載模式按鍵(BOOT 鍵)不放,再長按開機鍵(POW 鍵)開機,若不出意外開發板將會進入下載模式,Luatools 工具下載進度條會開始跑,這時便可以松開 BOOT 鍵和 POW 鍵,等到工具提示下載完成即可。
開發板已經處于開機狀態:此時可以先按住 BOOT 鍵不放,再短按復位鍵(RST 鍵)后開發板會重啟并進入下載模式。
5.3.3 不同模式下的端口顯示
1. 正常開機模式
該文件中的代碼無需修改,大家直接調用這個文件就行。
6.1.1 代碼說明該文件中的代碼是一個用 Lua 編寫的腳本,主要用于與充電 IC(集成電路)進行交互,進行狀態監測和控制。
6.1.2 代碼逐步解析1. 注釋部分:這段注釋用于指出代碼的主要功能,即處理充電 IC 相關的邏輯。
2. 電池上限電壓表:
此部分定義了電池上限電壓的不同設置值。Vreg 表包含多個十六進制數,每個數對應不同的電池上限電壓。在 V_CTRL 寄存器中,前四位用來設置電池上限電壓,其余位可以用作其他設置。默認情況下,其他位為 0。
這部分定義了快速充電電流的設置值。Ichg 表中列出的十六進制數對應于不同充電電流的設置。在 I_CTRL 寄存器中,前三位是設置快速充電電流的,其余位是其他設置,默認為 0; 該電流值是通過電阻 Rsns 計算得出的,Air8201 的 Rsns 值為 1KΩ,經過公式計算后得出 Ireg=500mA。
獲取一個 GPIO 引腳并對其進行設置。pcb.chargeCmdPin() 用于獲取充電命令引腳,gpio.setup 將引腳 GPIO1 設置為輸出模式,且初始化電平為高,同時啟用內部上拉。
這部分是主任務的初始化。首先等待 1000 毫秒,然后通過 sensor.yhm27xx 函數與傳感器進行通信,以獲取設備信息。后面再進行傳感器設備中各寄存器參數配置。
通過 sensor.yhm27xx 函數調用來讀取傳感器的數據。 參數說明:gpi``o_pin 是傳感器對應引腳,0x04 是傳感器設備 ID,0x08 是設備信息寄存器的地址。等待 200 毫秒等待數據返回。
當檢測到傳感器存在時,會進行進一步的設置。此時根據不同寄存器的地址設置不同功能。
讀取 I_CTRL 寄存器并設置電壓跟隨與快速充電電流。如果操作成功,將會再次讀取配置寄存器并確認設置結果,記錄相關的日志信息。 參數說明:gpio_pin 是傳感器對應引腳,0x04 是芯片設備 ID 號,0x01 是 I_CTRL 寄存器地址,0x02 是設置電壓跟隨與快速充電電流為 0.5×Ireg。 特別說明:若需要在同一寄存器中設置多個參數,則需要將參數值進行或運算。(例如,要設置電壓跟隨和快速充電電流為 0.5×Ireg,則參數值為 0x02+0x00=0x02 ?焖俪潆婋娏鞅砜蓞⒖枷路奖砀瘢
I_CTRL 寄存器地址前三位是設置快速充電電流,其余位是其他設置,默認為 0; Ireg 是電阻 Rsns 配置的電流值,Air8201 的電阻 Rsns 值為 1KΩ,通過公式 Ireg=500/Rsns,得出 Ireg=500mA。
讀取 V_CTRL 寄存器并設置電池上限電壓。如果操作成功,將會再次讀取配置寄存器并確認設置結果,記錄相關的日志信息。 參數說明:gpio_pin 是傳感器對應引腳,0x04 是芯片設備 ID 號,0x00 是 V_CTRL 寄存器地址,0x00 是設置電池上限電壓為 4.2V,可參考下方表格。
如果在讀取傳感器信息時返回結果為假,則說明傳感器不存在,記錄警告日志。
這段代碼的主要功能是與充電 IC 進行交互以監控其狀態,配置其控制參數,并在不同情況下記錄相關的日志信息。通過這種方式,系統能夠檢測充電 IC 的存在與狀態,并進行相應的初始化與配置,以確保充電過程的正常進行。全程使用異步任務管理,提升系統響應能力。
6.2 pcb.lua 中代碼介紹
該文件中的代碼無需修改,大家直接調用這個文件就行。
6.2.1 代碼說明這段 Lua 代碼定義了一個名為 pcb 的模塊,其主要功能是管理和操作硬件的某些特性,特別是與 PCB(印刷電路板)相關的設置和狀態。
6.2.2 代碼逐步解析1. 模塊初始化和變量定義:這里定義了一個表 pcb,用于存放后續的函數。定義了存儲系統的 OTP 區域和硬件的默認版本號以及出廠測試結果的初始值。
loadParam 函數首先檢查 OTP 是否存在,然后讀取 OTP 存儲區中的數據,解碼 JSON 格式的數據以獲取硬件版本號和出廠測試結果。若解碼失敗或缺少數據,則根據設備型號進行版本號的設置。
此函數根據硬件版本控制 GNSS 模塊的電源狀態。通過 GPIO 接口進行電源的開啟或關閉。
根據硬件版本返回 ES8311 控制器對應的電源引腳。
此函數根據硬件版本返回充電 IC 的命令引腳。
提供了獲取當前硬件版本號和出廠測試結果的方法,以及設置硬件版本號的功能。
整段代碼的主要功能是提供對印刷電路板(PCB)相關硬件配置和狀態的管理。通過讀取 OTP 存儲區,程序能夠獲取設備的特定參數(如版本號和出廠測試結果)。此外,它還實現對 GNSS 電源、ES8311 音頻編解碼器以及充電 IC 的控制接口,根據不同的硬件版本提供不同的引腳控制方案。
6.3 batteryManage.lua 中代碼介紹6.3.1 代碼說明
這段代碼是一個電池管理模塊的實現,主要用于監控和管理電池狀態,包括電壓檢測、充電狀態判斷、電量計算和自動關機功能。
6.3.2 代碼逐步解析1. 模塊定義創建一個名為 M 的模塊,定義模塊名稱為“batteryManage”。
引入了 sys 和 sysplus 庫,這些庫提供了系統和附加功能的支持。
M.vbat: 當前電池電壓。
M.batteryPercent: 電池電量百分比,初始為 50。
M.isCharge: 標識是否正在充電。
M.BATTERY_UPDATE_INTERVAL: 電池信息更新的時間間隔(秒)。
M.noChargeDuration: 記錄未插入電源的時間。
M.CHARGE_THRESHOLD_TIME: 未充電持續時間的閾值(2 分鐘)。
M.blueLed 和 M.redLed: 用于設置藍燈和紅燈的狀態,分別用 GPIO 接口進行控制。
定義一個電池放電曲線數組,該數組存儲對應電量的電壓值,用于通過電壓推算電量百分比。
重置未充電計時器的函數。
該函數用于發布關機信號,以請求系統關機。
使用 GPIO 中斷回調來檢測充電狀態,如果通過 GPIO 引腳檢測到充電狀態發生變化,將更新充電狀態并檢查電池狀態。
根據當前電壓 M.vbat 計算電池百分比。如果電壓在放電曲線數組的范圍內,則返回相應的電量百分比。
定期更新電池電量,讀取電壓并計算電量。如果電量低于 30%,且沒有插入電源的時間超過 2 分鐘,則調用關機函數。
實現了長按電源鍵的關機邏輯,按下電源鍵 3 秒后進行關機,松開時取消關機。
整體而言,該模塊負責監控電池的電壓和充電狀態。它能夠定期更新電量百分比,并在必要時自動關機。此外,該模塊還允許用戶通過長按電源鍵來手動關機。其主要功能是確保設備在電量過低時保護系統不受損壞,同時提供充電狀態的實時反饋。
6.3 main.lua 中代碼介紹6.3.1 代碼說明
該文件中的代碼使用 Lua 語言編寫,主要用于管理和監控設備的電源和電池狀態。
6.3.2 代碼逐步解析1. 項目和版本信息這部分定義了項目名稱和版本,并記錄日志信息,便于后續的調試和維護。
在這里,引入了多個必要的庫文件,包括系統管理庫 sys、電路板庫 pcb、充電邏輯庫和電池管理庫。通過這些庫,程序可以實現對系統的控制和管理。 特別說明:主要功能代碼已經模塊化到 batteryManage 庫文件中。
這部分代碼用于防止開機時的抖動,并點亮紅色指示燈,以表明設備正在啟動。
通過 gpio.setup 配置了兩個引腳:一個用于監測充電狀態,另一個用于電源鍵的回調。
這段代碼訂閱了系統關機事件,當設備接收到關機信號時,會調用 pm.shutdown() 函數進行安全關機。
在系統啟動時,首先進行一次電池充電狀態檢查,并設置一個定時器,每 60 秒更新一次電池電量信息。
此段代碼設置了一個定時器,每隔 5 秒輸出一次當前電池狀態的日志信息,包括電壓、電池電量及充電狀態,便于監控和調試。
最后,sys.run() 函數用于啟動系統的主循環,讓程序保持運行狀態。
該代碼的主要功能是管理和監控嵌入式設備的電源與電池狀態,具備開機防抖、充電狀態檢測、定時更新電池電量和記錄日志等功能。
6.4 完整代碼展示
此處只展示 batteryManage.lua 和 main.lua。其余完整代碼請下載源碼查看。
batteryManage.lua
main.lua
通過 Luatoos 工具查看
本文介紹了電源管理系統的基本概念、目標以及在實際應用中的實現方式。通過深入分析電源管理的各個功能模塊,我們了解了電量監測、充電檢測、自動關機和用戶接口等關鍵功能。這些功能共同構成了一個高效且智能的電源管理系統,能夠顯著提升設備的性能和用戶滿意度。
在電源管理實踐中,合理的策略和有效的代碼實施是成功的關鍵。通過實時監測電池狀態和智能控制電源操作,不僅能夠延長設備的使用時間,還能確保設備在關鍵時刻的穩定性與可靠性。這對于以移動設備和嵌入式系統為主的應用場景尤其重要。
未來,我們可以繼續探索更為先進的電源管理技術,比如基于人工智能的預測分析和優化算法,以便進一步提高電源管理的智能化水平。這將為設備的使用者帶來更佳的體驗,使電源管理成為每一款電子設備中不可或缺的一部分。
八、常見問題1. 設備無法開啟或頻繁自動關機
檢查電池電量是否低于安全工作水平,確保設備充電。如果電量很低,請連接電源并充電一段時間再嘗試開機。
2. 電池電量顯示不準確確保電池電壓監測模塊正常工作,檢查 ADC 通道是否正確配置。如有必要,重新校準電池電量百分比計算的映射表。
3. 充電狀態無法正確識別檢查充電檢測的 GPIO 引腳連接是否正常,確認是否存在接觸不良或線路損壞的問題。此外,確保所用充電器和數據線與設備兼容。
4. 系統在充電時無法正常運行檢查是否有其他程序或任務占用過多資源,導致系統不穩定。可以考慮優化系統任務的優先級或關閉不必要的功能模塊。
5. 長按電源鍵無反應確認電源鍵的 GPIO 引腳連接正常,確保其可被正常識別。如果仍然無效,請檢查相關代碼對電源鍵的事件處理是否正確。
6. 設備發熱嚴重設備發熱可能是由于充電速率過高或設備運行負載過重引起的。建議降低負載、優化代碼,或調整充電策略。
7. 無法更新固件或腳本檢查 USB 連接是否正常,確保 Luatools 工具正確識別設備。注意遵循燒錄步驟,并確保所用的固件版本與硬件兼容。