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