本篇文章讲述的是核心功能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工具正确识别设备。注意遵循烧录步骤,并确保所用的固件版本与硬件兼容。
今天的分享就到这里
审核编辑 黄宇
-
嵌入式
+关注
关注
5081文章
19073浏览量
304298 -
电源管理
+关注
关注
115文章
6169浏览量
144356 -
源码
+关注
关注
8文章
637浏览量
29180
发布评论请先 登录
相关推荐
评论