Просмотр исходного кода

add: 提交Air8000的aircharge代码,同时删去扩展库中的exchg.lua

wangshihao 2 месяцев назад
Родитель
Сommit
4afd7ea52b

+ 215 - 0
module/Air8000/demo/aircharge/aircharge.lua

@@ -0,0 +1,215 @@
+-- 
+
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.11.25
+@author  王世豪
+@usage
+本demo为Air8000/8000G/8000XB/8000GB 的电池充电管理示例,演示的核心功能为:
+使用exchg库管理Air8000系列内置的YHM2712充电IC,包括配置电池参数,注册事件回调,处理充电状态变化。
+
+历史背景:
+本demo原本是专为内置充电IC的Air8000/8000G/8000XB/8000GB所设计,但是Air8000系列内置充电IC会存在以下问题,故含有充电管理的型号已不再推荐:
+1,内置的充电管理芯片,不仅只负责充电,也负责供电路径管理、供电短路保护等;
+2,当大家使用的不是电池,而是由诸如充电器等类似电源供电时,如电路连接不当,非常容易造成给DCDC充电的效果,进而形成VBAT供电的混乱;
+3,同时,如果快速的下电和上电,内置的充电管理芯片会根据电压的快速跌落而判断电源短路,继而把VBAT供电电路断开,造成的后果就是不能开机、无法下载、电脑无法识别USB等,本质都是充电管理芯片的主动保护造成的;
+4,出现充电管理芯片的短路保护之后,一般要过一段时间等板子上电容的余电放光后,也就是充电管理芯片的保护功能失效后再上电开机,或者通过插入充电器(充电器接模组VCHG管脚的前提之下)来退出短路保护;
+5,即便是电池供电,如果系统设计上增加了类似于拨动开关一类的上下电的复位设计,在含有充电管理的这些型号上,也需要在断电一段时间后(取决于板载电容的大小,电容越大,余电放电越慢,充电IC的保护作用就越长)再上电,
+    否则仍然会有长时间无法开机的风险(快速的下电和上电,根据实测,大家在2分钟左右会恢复正常开机);
+
+适用场景:
+本软件模块旨在对 Air8000 系列 已内置的 YHM2712 充电管理IC 进行功能管理与状态监控。
+主要应用场景为标准的 “电池供电 + 需要通过VCHG引脚进行充电” 的应用。在此场景下,本模块提供以下核心功能:
+1. 电池充电管理:用于管理Air8000系列内置的YHM2712充电IC,包括配置电池参数,注册事件回调,处理充电状态变化。
+2. 电池过放保护:当电池电压快速下降到1V以下时,充电IC会触发过放保护,切断VBAT到系统内部供电的电路,防止电池过放。
+3. 电池充电完成检测:充电IC会在电池充电完成后触发事件,用于检测充电是否完成。
+4. 电池电压测量:充电IC可以测量电池电压,用于实时监控电池状态。
+
+更详细的Air8000系列特别说明,请查看:https://docs.openluat.com/air8000/product/notice/
+更多说明参考本目录下的readme.md文件
+]]
+
+local exchg = require("exchg")
+
+-- 配置参数
+local BATTERY_VOLTAGE = 4200                -- 电池充电截止电压(mV): 4200或4350
+local BATTERY_CAPACITY = 400                -- 电池容量(mAh),根据实际电池容量设置
+local CHARGE_CURRENT_MODE = exchg.CCDEFAULT -- 充电电流模式: exchg.CCMIN/exchg.CCDEFAULT/exchg.CCMAX
+
+-- 上次充电状态,用于状态变化检测
+local last_charge_status = nil
+local last_battery_voltage = 0
+local last_charger_state = false
+
+-- 充电状态描述映射
+local charge_stage_map = {
+    [0] = "放电模式",
+    [1] = "预充电模式",
+    [2] = "涓流充电",
+    [3] = "恒流快速充电",
+    [4] = "预留状态",
+    [5] = "恒压快速充电",
+    [6] = "预留状态",
+    [7] = "充电完成",
+    [8] = "未知状态"
+}
+
+-- 事件回调函数
+local function exchg_event_callback(event)
+    if event == exchg.OVERHEAT then
+        log.info("充电管理", "警告: 设备温度过高!请暂停充电")
+    elseif event == exchg.CHARGER_IN then
+        log.info("充电管理", "充电器已插入")
+    elseif event == exchg.CHARGER_OUT then
+        log.info("充电管理", "充电器已拔出")
+    end
+end
+
+-- 格式化电池电压显示
+local function format_battery_voltage(voltage)
+    if voltage < 0 then
+        if voltage == -1 then return "当前阶段不需要测量" end
+        if voltage == -2 then return "电压测量失败" end
+        if voltage == -3 then return "仅充电器就绪(无电池)" end
+        return "未知错误"
+    end
+    return string.format("%.2fV", voltage / 1000)
+end
+
+-- 计算电池电量百分比(简单估算)
+local function calculate_battery_percentage(voltage)
+    if voltage < 0 then return 0 end
+
+    -- 简单的电压到百分比映射,实际应根据电池特性调整
+    local min_voltage = 3300            -- 3.3V,电池最低电压
+    local max_voltage = BATTERY_VOLTAGE -- 充电截止电压
+
+    if voltage <= min_voltage then
+        return 0
+    elseif voltage >= max_voltage then
+        return 100
+    end
+
+    -- 线性计算百分比(简单估算)
+    local percentage = (voltage - min_voltage) / (max_voltage - min_voltage) * 100
+    return math.floor(percentage)
+end
+
+-- 显示充电信息的函数
+local function display_charge_info(status)
+    if not status.result then
+        log.error("充电管理", "获取充电状态失败")
+        return
+    end
+
+    -- 计算电量百分比
+    local percentage = calculate_battery_percentage(status.vbat_voltage)
+
+    -- 格式化日志输出
+    log.info("充电管理", string.format("电池电压: %s (%d%%)",
+        format_battery_voltage(status.vbat_voltage), percentage))
+    log.info("充电管理", string.format("充电阶段: %s",
+        charge_stage_map[status.charge_stage] or "未知"))
+    log.info("充电管理", string.format("充电完成: %s",
+        status.charge_complete and "是" or "否"))
+    log.info("充电管理", string.format("电池在位: %s",
+        status.battery_present and "是" or "否"))
+    log.info("充电管理", string.format("充电器在位: %s",
+        status.charger_present and "是" or "否"))
+    log.info("充电管理", string.format("IC过热: %s",
+        status.ic_overheat and "是" or "否"))
+
+    -- 检测并记录状态变化
+    if last_charge_status ~= status.charge_stage then
+        log.info("充电管理", string.format("状态变化: %s -> %s",
+            charge_stage_map[last_charge_status] or "未知",
+            charge_stage_map[status.charge_stage] or "未知"))
+        last_charge_status = status.charge_stage
+    end
+
+    -- 检测电池电压变化超过100mV
+    if math.abs(status.vbat_voltage - last_battery_voltage) > 100 and status.vbat_voltage > 0 then
+        log.info("充电管理", string.format("电压变化显著: %.2fV", status.vbat_voltage / 1000))
+        last_battery_voltage = status.vbat_voltage
+    end
+
+    -- 检测充电器状态变化
+    if last_charger_state ~= status.charger_present then
+        last_charger_state = status.charger_present
+        log.info("充电管理", "充电器状态变化: " .. (status.charger_present and "连接" or "断开"))
+    end
+end
+
+-- 电池管理任务
+local function battery_management_task()
+    log.info("充电管理", "初始化电池管理...")
+
+    -- 注册事件回调
+    exchg.on(exchg_event_callback)
+
+    -- 设置电池参数
+    log.info("充电管理", string.format("设置电池参数: %.2fV, %dmAh, %s",
+        BATTERY_VOLTAGE / 1000, BATTERY_CAPACITY, CHARGE_CURRENT_MODE))
+
+    local setup_result = exchg.setup(BATTERY_VOLTAGE, BATTERY_CAPACITY, CHARGE_CURRENT_MODE)
+    if setup_result then
+        log.info("充电管理", "电池参数设置成功")
+    else
+        log.error("充电管理", "电池参数设置失败,检查芯片是否支持")
+        return
+    end
+
+    -- 启动充电(可选,根据exchg库说明,通常不需要手动调用)
+    -- 但为了演示完整流程,这里包含调用示例
+    log.info("充电管理", "尝试启动充电...")
+    local start_result = exchg.start()
+    if start_result then
+        log.info("充电管理", "充电启动成功")
+    else
+        log.warn("充电管理", "充电启动失败或已自动启动")
+    end
+
+    log.info("充电管理", "开始监控电池状态...")
+
+    -- 主循环,定期检查电池状态
+    while true do
+        -- 获取充电状态
+        local status = exchg.status()
+        if status then
+            -- 显示充电信息
+            display_charge_info(status)
+
+            -- 如果电池充满电,可以添加相应处理
+            if status.charge_complete and status.charger_present then
+                log.info("充电管理", "电池已充满!")
+            end
+
+            -- 如果充电IC过热,采取保护措施
+            if status.ic_overheat then
+                log.warn("充电管理", "充电IC过热,正在暂停充电...")
+                exchg.stop()
+                log.info("充电管理", "充电已暂停,请等待设备降温")
+                -- 等待一段时间后再次尝试
+                sys.wait(60000) -- 等待60秒
+                log.info("充电管理", "尝试恢复充电...")
+                exchg.start()
+            end
+        else
+            log.error("充电管理", "无法获取充电状态")
+        end
+
+        -- 根据状态调整检查频率
+        if last_charger_state then
+            -- 充电中,更频繁地检查
+            sys.wait(20000) -- 20秒
+        else
+            -- 未充电,降低检查频率
+            sys.wait(60000) -- 60秒
+        end
+    end
+end
+
+-- 系统初始化完成后执行
+sys.taskInit(battery_management_task)

+ 3 - 3
script/libs/exchg.lua → module/Air8000/demo/aircharge/exchg.lua

@@ -2,12 +2,12 @@
 @module exchg
 @summary exchg扩展库
 @version 1.0
-@date    2025.08.08
+@date    2025.11.25
 @author  王世豪
 @usage
 -- 应用场景
-本扩展库适用于Air8000/Air7000/Air6000等集成了内置电池充电方案的模组型号;
-Air8000/Air7000/Air6000内置的充电IC为YHM2712,exchg扩展库基于本充电IC进行设计;
+本扩展库适用于Air8000/8000G/8000XB/8000GB等集成了内置电池充电方案的模组型号;
+Air8000/8000G/8000XB/8000GB内置的充电IC为YHM2712,exchg扩展库基于本充电IC进行设计;
 
 -- 用法实例
 本扩展库对外提供了以下5个接口:

+ 86 - 0
module/Air8000/demo/aircharge/main.lua

@@ -0,0 +1,86 @@
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0.0
+@date    2025.11.25
+@author  王世豪
+@usage
+本demo演示的功能为:
+1. 初始化YHM2712充电IC
+2. 配置电池参数
+3. 注册事件回调
+4. 处理充电状态变化
+
+历史背景:
+本demo原本是专为内置充电IC的Air8000/8000G/8000XB/8000GB所设计,但是Air8000系列内置充电IC会存在以下问题,故含有充电管理的型号已不再推荐:
+1,内置的充电管理芯片,不仅只负责充电,也负责供电路径管理、供电短路保护等;
+2,当大家使用的不是电池,而是由诸如充电器等类似电源供电时,如电路连接不当,非常容易造成给DCDC充电的效果,进而形成VBAT供电的混乱;
+3,同时,如果快速的下电和上电,内置的充电管理芯片会根据电压的快速跌落而判断电源短路,继而把VBAT供电电路断开,造成的后果就是不能开机、无法下载、电脑无法识别USB等,本质都是充电管理芯片的主动保护造成的;
+4,出现充电管理芯片的短路保护之后,一般要过一段时间等板子上电容的余电放光后,也就是充电管理芯片的保护功能失效后再上电开机,或者通过插入充电器(充电器接模组VCHG管脚的前提之下)来退出短路保护;
+5,即便是电池供电,如果系统设计上增加了类似于拨动开关一类的上下电的复位设计,在含有充电管理的这些型号上,也需要在断电一段时间后(取决于板载电容的大小,电容越大,余电放电越慢,充电IC的保护作用就越长)再上电,
+    否则仍然会有长时间无法开机的风险(快速的下电和上电,根据实测,大家在2分钟左右会恢复正常开机);
+
+适用场景:
+本软件模块旨在对 Air8000 系列 已内置的 YHM2712 充电管理IC 进行功能管理与状态监控。
+主要应用场景为标准的 “电池供电 + 需要通过VCHG引脚进行充电” 的应用。在此场景下,本模块提供以下核心功能:
+1. 电池充电管理:用于管理Air8000系列内置的YHM2712充电IC,包括配置电池参数,注册事件回调,处理充电状态变化。
+2. 电池过放保护:当电池电压快速下降到1V以下时,充电IC会触发过放保护,切断VBAT到系统内部供电的电路,防止电池过放。
+3. 电池充电完成检测:充电IC会在电池充电完成后触发事件,用于检测充电是否完成。
+4. 电池电压测量:充电IC可以测量电池电压,用于实时监控电池状态。
+
+更详细的Air8000系列特别说明,请查看:https://docs.openluat.com/air8000/product/notice/
+]]
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+
+PROJECT = "aircharge"
+VERSION = "1.0.0"
+
+-- 在日志中打印项目名和项目版本号
+log.info("main", PROJECT, VERSION)
+
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
+if wdt then
+    wdt.init(9000) -- 初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000) -- 3s喂一次狗
+end
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+
+-- 加载aircharge模块
+require "aircharge"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 98 - 0
module/Air8000/demo/aircharge/readme.md

@@ -0,0 +1,98 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口,负责初始化系统环境;
+
+2、aircharge.lua:电池充电管理模块,演示内置充电ic的Air8000系列的电池充电管理功能;
+
+3、exchg.lua:exchg扩展库,提供电池充电管理功能的扩展接口;
+
+## 演示功能概述
+
+1、初始化YHM2712充电IC
+
+2、配置电池参数
+
+3、注册事件回调
+
+4、处理充电状态变化
+
+**历史背景:**
+
+本demo原本是专为内置充电IC的Air8000/8000G/8000XB/8000GB所设计,但是Air8000系列内置充电IC会存在以下问题,故含有充电管理的型号已不再推荐:
+
+1、内置的充电管理芯片,不仅只负责充电,也负责供电路径管理、供电短路保护等;
+
+2、当大家使用的不是电池,而是由诸如充电器等类似电源供电时,如电路连接不当,非常容易造成给DCDC充电的效果,进而形成VBAT供电的混乱;
+
+3、同时,如果快速的下电和上电,内置的充电管理芯片会根据电压的快速跌落而判断电源短路,继而把VBAT供电电路断开,造成的后果就是不能开机、无法下载、电脑无法识别USB等,本质都是充电管理芯片的主动保护造成的;
+
+4、出现充电管理芯片的短路保护之后,一般要过一段时间等板子上电容的余电放光后,也就是充电管理芯片的保护功能失效后再上电开机,或者通过插入充电器(充电器接模组VCHG管脚的前提之下)来退出短路保护;
+
+5、即便是电池供电,如果系统设计上增加了类似于拨动开关一类的上下电的复位设计,在含有充电管理的这些型号上,也需要在断电一段时间后(取决于板载电容的大小,电容越大,余电放电越慢,充电IC的保护作用就越长)再上电,否则仍然会有长时间无法开机的风险(快速的下电和上电,根据实测,大家在2分钟左右会恢复正常开机);
+
+**适用场景:**
+
+本软件模块旨在对 Air8000 系列 已内置的 YHM2712 充电管理IC 进行功能管理与状态监控。
+
+主要应用场景为标准的 “电池供电 + 需要通过VCHG引脚进行充电” 的应用。在此场景下,本模块提供以下核心功能:
+
+1、电池充电管理:用于管理Air8000系列内置的YHM2712充电IC,包括配置电池参数,注册事件回调,处理充电状态变化。
+
+2、电池过放保护:当电池电压快速下降到1V以下时,充电IC会触发过放保护,切断VBAT到系统内部供电的电路,防止电池过放。
+
+3、电池充电完成检测:充电IC会在电池充电完成后触发事件,用于检测充电是否完成。
+
+4、电池电压测量:充电IC可以测量电池电压,用于实时监控电池状态。
+
+更详细的Air8000系列特别说明,请查看:https://docs.openluat.com/air8000/product/notice/
+
+## 演示硬件环境
+
+![image](https://docs.openLuat.com/cdn/image/Air8000_锂电池.jpg)
+
+1、Air8000开发板一块 + 可充电锂电池一块:
+
+2、TYPE-C USB数据线一根,Air8000开发板和数据线的硬件接线方式为:
+
+- Air8000开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+
+- TYPE-C USB数据线直接插到开发板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8000 V2018版本固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、Luatools烧录内核固件和demo脚本代码
+
+3、烧录成功后,自动开机运行,通过luatools日志可以观察到以下信息:
+
+``` lua
+[2025-11-25 16:35:26.453][000000000.670] I/user.main aircharge 1.0.0
+[2025-11-25 16:35:26.457][000000000.696] I/user.充电管理 初始化电池管理...
+[2025-11-25 16:35:26.461][000000000.697] I/user.充电管理 设置电池参数: 4.20V, 400mAh, DEFAULT
+[2025-11-25 16:35:26.539][000000000.911] I/user.充电管理 电池参数设置成功
+[2025-11-25 16:35:26.542][000000000.911] I/user.充电管理 尝试启动充电...
+[2025-11-25 16:35:26.810][000000001.337] I/user.exchg.start 生效
+[2025-11-25 16:35:26.828][000000001.338] I/user.充电管理 充电启动成功
+[2025-11-25 16:35:26.843][000000001.338] I/user.充电管理 开始监控电池状态...
+[2025-11-25 16:35:32.599][000000007.128] luat_adc_open 670:adc gain 1658, offset 130
+[2025-11-25 16:35:32.602][000000007.128] luat_adc_open 694:adc4 param 1,15,0,32,8, max read:6664500mv
+[2025-11-25 16:35:32.709][000000007.242] I/user.充电管理 电池电压: 4.06V (84%)
+[2025-11-25 16:35:32.712][000000007.243] I/user.充电管理 充电阶段: 恒压快速充电
+[2025-11-25 16:35:32.715][000000007.243] I/user.充电管理 充电完成: 否
+[2025-11-25 16:35:32.717][000000007.243] I/user.充电管理 电池在位: 是
+[2025-11-25 16:35:32.719][000000007.243] I/user.充电管理 充电器在位: 是
+[2025-11-25 16:35:32.721][000000007.244] I/user.充电管理 IC过热: 否
+[2025-11-25 16:35:32.723][000000007.244] I/user.充电管理 状态变化: 未知 -> 恒压快速充电
+[2025-11-25 16:35:32.728][000000007.245] I/user.充电管理 电压变化显著: 4.06V
+[2025-11-25 16:35:32.730][000000007.245] I/user.充电管理 充电器状态变化: 连接
+
+
+```