本篇文章講述的是核心功能demo示例,以常用的低功耗4G模組Air201為例,特分享本教程給大家。
在實際應用中,通過實時監測電池狀態和智能控制電源操作,不僅能夠延長設備的使用時間,還能確保設備在關鍵時刻的穩定性與可靠性,對于以移動設備和嵌入式系統為主的應用場景尤其重要。
Air201快速入門——電源管理核心功能示例
Air201選用了一款高度集成的單電池鋰離子電池充電器——該充電器具有系統電源路徑管理,可供空間有限的便攜式應用使用,具有涓流充電、恒流充電、恒壓充電、充電終止和自動充電功能,而且可以自動調節充電電流與充電電壓,或者進入其他模式。
本文將展示電源管理系統的核心功能模塊,手把手教你如何通過不同的技術手段實現有效的電源管理。
這些功能旨在提升設備的性能和用戶體驗,以下是主要演示功能的概述:
▼ 電源管理核心功能 ▼
電量監測:
本系統通過ADC(模數轉換器)實時讀取電池電壓,并定期更新電量狀態。通過精確監測電池電壓,可以讓用戶清晰掌握當前電池剩余電量,避免意外關機帶來的困擾。
充電檢測:
系統利用GPIO中斷技術,能夠快速檢測電池的充電狀態。當設備連接到電源時,將自動判斷電池是否在充電狀態,并相應地調整電源管理策略,以優化充電效率和電池壽命。
自動關機:
根據監測到的電量百分比,該系統能夠在電量過低時自動關機,以防止電池過度放電。這種智能管理能夠保護電池,延長其使用壽命,確保設備在低電量時不會意外關機。
用戶接口:
系統提供了便捷的用戶交互接口,用戶可以通過長按電源鍵實現關機操作。提升用戶體驗的同時,確保用戶可以方便地控制設備的電源狀態。
通過這些功能的實現,用戶不僅可以延長設備的使用時間,還能夠保證設備在關鍵時刻的穩定性和可靠性。在實際應用中,這些功能可有效地提升設備性能,滿足用戶對電源管理的需求。
接下來,我們講解相關示例的具體使用。
1. 搭建環境
新同學建議先看前期的基礎知識相關教程,更有助于理解和操作。
可以在LuaTools項目管理中新建一個項目,重新選擇底層CORE和腳本;或者在原有項目的基礎上,不更換CORE,將原來的腳本刪除,添加為demo/pm的腳本。
1.1 硬件準備:
Air201套件
SIM卡
帶有數據通信功能的數據線
Win10及以上PC
1.2 軟件準備:
LuaTools調試工具:
https://docs.openluat.com/Luatools
最新固件:
https://gitee.com/openLuat/LuatOS-Air201/tree/master/core
最新腳本:
https://gitee.com/openLuat/LuatOS-Air201/tree/master/demo/pm
1.3 燒錄操作:
由于Air201單板子沒有復位鍵和BOOT鍵,所以數據線與Air201開發板之間還需要接一個USB_BOOT板(Air201套件里已包含,無需單獨購買)。
將Air201通過USB_BOOT小板連接電腦,如下圖所示:
1.3.1 根據下方操作進行燒錄
此時就需要大家先點擊Luatools工具上的【下載腳本】或【下載底層和腳本】,再執行下方操作了。
新同學請先學習LuaTools使用和燒錄教程:
https://docs.openluat.com/Luatools/
開發板處于未開機狀態:
此時先按住下載模式按鍵(BOOT鍵)不放,再長按開機鍵(POW鍵)開機。若不出意外開發板將會進入下載模式,LuaTools工具下載進度條會開始跑,這時便可以松開BOOT鍵和POW鍵,等到工具提示下載完成即可。
開發板已經處于開機狀態:
此時可以先按住BOOT鍵不放,再短按復位鍵(RST鍵)后開發板會重啟并進入下載模式。
1.3.2 不同模式下的端口顯示
正常開機模式:
下載模式:
2. 示例代碼
該文件中的代碼是一個用Lua編寫的腳本,主要用于與充電 IC(集成電路)進行交互,進行狀態監測和控制。
2.1.1 代碼解析
1)注釋部分:
這段注釋用于指出代碼的主要功能,即處理充電IC相關的邏輯。
2)電池上限電壓表:
此部分定義了電池上限電壓的不同設置值。Vreg表包含多個十六進制數,每個數對應不同的電池上限電壓。在V_CTRL寄存器中,前四位用來設置電池上限電壓,其余位可以用作其他設置。默認情況下,其他位為 0。
3)快速充電電流表:
這部分定義了快速充電電流的設置值。Ichg 表中列出的十六進制數對應于不同充電電流的設置。
在 I_CTRL寄存器中,前三位是設置快速充電電流的,其余位是其他設置,默認為0;該電流值是通過電阻Rsns計算得出的。
Air201的Rsns值為1KΩ,經過公式計算后得出:
Ireg=500mA
4)電池上限電壓表:
此部分定義了電池上限電壓的不同設置值。Vreg表包含多個十六進制數,每個數對應不同的電池上限電壓。在V_CTRL寄存器中,前四位用來設置電池上限電壓,其余位可以用作其他設置。默認情況下,其他位為 0。
5)任務初始化:
這部分是主任務的初始化。首先等待1000毫秒,然后通過 sensor.yhm27xx 函數與傳感器進行通信,以獲取設備信息。后面再進行傳感器設備中各寄存器參數配置。
6)傳感器數據讀取:
通過sensor.yhm27xx函數調用來讀取傳感器的數據。
參數說明:
gpio_pin是傳感器對應引腳;
0x04 是傳感器設備ID;
0x08 是設備信息寄存器的地址。
等待200毫秒等待數據返回。
7)設備存在檢查:
當檢測到傳感器存在時,會進行進一步的設置。此時根據不同寄存器的地址設置不同功能。
8)電壓跟隨與快速充電電流設置:
讀取 I_CTRL 寄存器并設置電壓跟隨與快速充電電流。如果操作成功,將會再次讀取配置寄存器并確認設置結果,記錄相關的日志信息。
參數說明:
gpio_pin 是傳感器對應引腳;
0x04 是芯片設備ID號;
0x01 是 I_CTRL寄存器地址;
0x02 是設置電壓跟隨與快速充電電流為0.5×Ireg。
特別說明:
若需要在同一寄存器中設置多個參數,則需要將參數值進行或運算。
例如:
要設置電壓跟隨和快速充電電流為0.5×Ireg,則參數值為 0x02+0x00=0x02 。
快速充電電流表可參考下方表格:
I_CTRL寄存器地址前三位是設置快速充電電流,其余位是其他設置,默認為0;Ireg是電阻Rsns配置的電流值,Air201的電阻Rsns值為1KΩ:
通過公式Ireg=500/Rsns,得出Ireg=500mA。
9)電池上限電壓設置:
讀取V_CTRL寄存器并設置電池上限電壓。如果操作成功,將會再次讀取配置寄存器并確認設置結果,記錄相關的日志信息。
參數說明:
gpio_pin 是傳感器對應引腳;
0x04 是芯片設備ID號;
0x00 是 V_CTRL寄存器地址;
0x00 是設置電池上限電壓為4.2V。
電池上限電壓設置可參考下方表格:
10)異常處理:
如果在讀取傳感器信息時返回結果為假,則說明傳感器不存在,記錄警告日志。
2.1.2 總結說明
這段代碼的主要功能是與充電IC進行交互以監控其狀態,配置其控制參數,并在不同情況下記錄相關的日志信息。
通過這種方式,系統能夠檢測充電IC的存在與狀態,并進行相應的初始化與配置,以確保充電過程的正常進行。全程使用異步任務管理,提升系統響應能力。
2.2 pcb.lua源碼文件
這段Lua代碼定義了一個名為pcb的模塊,其主要功能是管理和操作硬件的某些特性,特別是與PCB(印刷電路板)相關的設置和狀態。
2.2.1 代碼解析
1)模塊初始化和變量定義:
這里定義了一個表pcb,用于存放后續的函數。定義了存儲系統的OTP區域和硬件的默認版本號,以及出廠測試結果的初始值。
2)讀取OTP存儲區和解析硬件版本號的函數:
loadParam函數首先檢查OTP是否存在,然后讀取OTP存儲區中的數據,解碼JSON格式的數據以獲取硬件版本號和出廠測試結果。若解碼失敗或缺少數據,則根據設備型號進行版本號的設置。
3)GNSS電源控制功能:
此函數根據硬件版本控制GNSS模塊的電源狀態。通過GPIO接口進行電源的開啟或關閉。
4)ES8311電源引腳的獲取:
根據硬件版本返回ES8311控制器對應的電源引腳。
5)充電IC CMD引腳的獲取:
此函數根據硬件版本返回充電IC的命令引腳。
6)出廠測試結果獲取及版本號管理:
提供了獲取當前硬件版本號和出廠測試結果的方法,以及設置硬件版本號的功能。
2.2.2 總結說明
整段代碼的主要功能是提供對印刷電路板(PCB)相關硬件配置和狀態的管理。通過讀取OTP存儲區,程序能夠獲取設備的特定參數(如版本號和出廠測試結果)。
此外,它還實現對GNSS電源、ES8311音頻編解碼器以及充電IC的控制接口,根據不同的硬件版本提供不同的引腳控制方案。
2.3 batteryManage.lua源碼文件
這段代碼是一個電池管理模塊的實現,主要用于監控和管理電池狀態,包括電壓檢測、充電狀態判斷、電量計算和自動關機功能。
2.3.1 代碼解析
1)模塊定義:
創建一個名為M的模塊,定義模塊名稱為:
batteryManage
這段注釋用于指出代碼的主要功能,即處理充電IC相關的邏輯。
2)引入庫:
引入了sys和sysplus庫,這些庫提供了系統和附加功能的支持。
3)初始化狀態變量:
M.vbat:
當前電池電壓;
M.batteryPercent:
電池電量百分比,初始為50;
M.isCharge:
標識是否正在充電;
M.BATTERY_UPDATE_INTERVAL:
電池信息更新的時間間隔(秒);
M.noChargeDuration:
記錄未插入電源的時間;
M.CHARGE_THRESHOLD_TIME:
未充電持續時間的閾值(2 分鐘);
M.blueLed和M.redLed:
用于設置藍燈和紅燈的狀態,分別用GPIO接口進行控制。
4)電池放電曲線:
定義一個電池放電曲線數組,該數組存儲對應電量的電壓值,用于通過電壓推算電量百分比。
5)重置未充電時長:
重置未充電計時器的函數。
6)關機函數:
該函數用于發布關機信號,以請求系統關機。
7)充電狀態檢測:
使用GPIO中斷回調來檢測充電狀態,如果通過GPIO引腳檢測到充電狀態發生變化,將更新充電狀態并檢查電池狀態。
8)電量百分比計算:
根據當前電壓M.vbat計算電池百分比。如果電壓在放電曲線數組的范圍內,則返回相應的電量百分比。
9)定期檢查電池狀態:
定期更新電池電量,讀取電壓并計算電量。如果電量低于 30%,且沒有插入電源的時間超過2分鐘,則調用關機函數。
10)長按電源鍵關機:
實現了長按電源鍵的關機邏輯,按下電源鍵3秒后進行關機,松開時取消關機。
2.3.2 總結說明
整體而言,該模塊負責監控電池的電壓和充電狀態。它能夠定期更新電量百分比,并在必要時自動關機。此外,該模塊還允許用戶通過長按電源鍵來手動關機。其主要功能是確保設備在電量過低時保護系統不受損壞,同時提供充電狀態的實時反饋。
2.4 main.lua源碼文件
該文件中的代碼使用Lua語言編寫,主要用于管理和監控設備的電源和電池狀態。
2.4.1 代碼解析
1)項目和版本信息:
這部分定義了項目名稱和版本,并記錄日志信息,便于后續的調試和維護。
2)庫的引入:
在這里引入了多個必要的庫文件,包括系統管理庫sys、電路板庫pcb、充電邏輯庫和電池管理庫。通過這些庫,程序可以實現對系統的控制和管理。
特別說明:
主要功能代碼已經模塊化到batteryManage庫文件中。
3)開機防抖:
這部分代碼用于防止開機時的抖動,并點亮紅色指示燈,以表明設備正在啟動。
4)GPIO設置:
通過gpio.setup配置了兩個引腳:一個用于監測充電狀態,另一個用于電源鍵的回調。
5)關機處理:
這段代碼訂閱了系統關機事件,當設備接收到關機信號時,會調用pm.shutdown()函數進行安全關機。
6)啟動初始檢查:
在系統啟動時,首先進行一次電池充電狀態檢查,并設置一個定時器,每60秒更新一次電池電量信息。
7)日志輸出:
此段代碼設置了一個定時器,每隔5秒輸出一次當前電池狀態的日志信息,包括電壓、電池電量及充電狀態,便于監控和調試。
8)程序運行:
最后,sys.run()函數用于啟動系統的主循環,讓程序保持運行狀態。
2.4.2 總結說明
該代碼的主要功能是管理和監控嵌入式設備的電源與電池狀態,具備開機防抖、充電狀態檢測、定時更新電池電量和記錄日志等功能。
2.5 完整源碼文件
此處只展示main.lua,其余完整代碼請下載源碼查看。
最新源碼下載:
https://gitee.com/openLuat/LuatOS-Air201/tree/master/demo/pm
2.6 運行結果展示
可通過LuaTools工具查看運行結果,如下圖所示:
3. 常見問題
設備無法開啟或頻繁自動關機
檢查電池電量是否低于安全工作水平,確保設備充電。如果電量很低,請連接電源并充電一段時間再嘗試開機。
電池電量顯示不準確
確保電池電壓監測模塊正常工作,檢查ADC通道是否正確配置。如有必要,重新校準電池電量百分比計算的映射表。
充電狀態無法正確識別
檢查充電檢測的GPIO引腳連接是否正常,確認是否存在接觸不良或線路損壞的問題。此外,確保所用充電器和數據線與設備兼容。
系統在充電時無法正常運行
檢查是否有其他程序或任務占用過多資源,導致系統不穩定。可以考慮優化系統任務的優先級或關閉不必要的功能模塊。
長按電源鍵無反應
確認電源鍵的GPIO引腳連接正常,確保其可被正常識別。如果仍然無效,請檢查相關代碼對電源鍵的事件處理是否正確。
設備發熱嚴重
設備發熱可能是由于充電速率過高或設備運行負載過重引起的。建議降低負載、優化代碼,或調整充電策略。
無法更新固件或腳本
檢查USB連接是否正常,確保LuaTools工具正確識別設備。注意遵循燒錄步驟,并確保所用的固件版本與硬件兼容。
今天的分享就到這里
審核編輯 黃宇
-
嵌入式
+關注
關注
5082文章
19104瀏覽量
304799 -
電源管理
+關注
關注
115文章
6177瀏覽量
144443 -
源碼
+關注
關注
8文章
639瀏覽量
29185
發布評論請先 登錄
相關推薦
評論