aircharge.lua 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. --
  2. --[[
  3. @module main
  4. @summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
  5. @version 1.0
  6. @date 2025.11.25
  7. @author 王世豪
  8. @usage
  9. 本demo为Air8000/8000G/8000XB/8000GB 的电池充电管理示例,演示的核心功能为:
  10. 使用exchg库管理Air8000系列内置的YHM2712充电IC,包括配置电池参数,注册事件回调,处理充电状态变化。
  11. 历史背景:
  12. 本demo原本是专为内置充电IC的Air8000/8000G/8000XB/8000GB所设计,但是Air8000系列内置充电IC会存在以下问题,故含有充电管理的型号已不再推荐:
  13. 1,内置的充电管理芯片,不仅只负责充电,也负责供电路径管理、供电短路保护等;
  14. 2,当大家使用的不是电池,而是由诸如充电器等类似电源供电时,如电路连接不当,非常容易造成给DCDC充电的效果,进而形成VBAT供电的混乱;
  15. 3,同时,如果快速的下电和上电,内置的充电管理芯片会根据电压的快速跌落而判断电源短路,继而把VBAT供电电路断开,造成的后果就是不能开机、无法下载、电脑无法识别USB等,本质都是充电管理芯片的主动保护造成的;
  16. 4,出现充电管理芯片的短路保护之后,一般要过一段时间等板子上电容的余电放光后,也就是充电管理芯片的保护功能失效后再上电开机,或者通过插入充电器(充电器接模组VCHG管脚的前提之下)来退出短路保护;
  17. 5,即便是电池供电,如果系统设计上增加了类似于拨动开关一类的上下电的复位设计,在含有充电管理的这些型号上,也需要在断电一段时间后(取决于板载电容的大小,电容越大,余电放电越慢,充电IC的保护作用就越长)再上电,
  18. 否则仍然会有长时间无法开机的风险(快速的下电和上电,根据实测,大家在2分钟左右会恢复正常开机);
  19. 适用场景:
  20. 本软件模块旨在对 Air8000 系列 已内置的 YHM2712 充电管理IC 进行功能管理与状态监控。
  21. 主要应用场景为标准的 “电池供电 + 需要通过VCHG引脚进行充电” 的应用。在此场景下,本模块提供以下核心功能:
  22. 1. 电池充电管理:用于管理Air8000系列内置的YHM2712充电IC,包括配置电池参数,注册事件回调,处理充电状态变化。
  23. 2. 电池过放保护:当电池电压快速下降到1V以下时,充电IC会触发过放保护,切断VBAT到系统内部供电的电路,防止电池过放。
  24. 3. 电池充电完成检测:充电IC会在电池充电完成后触发事件,用于检测充电是否完成。
  25. 4. 电池电压测量:充电IC可以测量电池电压,用于实时监控电池状态。
  26. 更详细的Air8000系列特别说明,请查看:https://docs.openluat.com/air8000/product/notice/
  27. 更多说明参考本目录下的readme.md文件
  28. ]]
  29. local exchg = require("exchg")
  30. -- 配置参数
  31. local BATTERY_VOLTAGE = 4200 -- 电池充电截止电压(mV): 4200或4350
  32. local BATTERY_CAPACITY = 400 -- 电池容量(mAh),根据实际电池容量设置
  33. local CHARGE_CURRENT_MODE = exchg.CCDEFAULT -- 充电电流模式: exchg.CCMIN/exchg.CCDEFAULT/exchg.CCMAX
  34. -- 上次充电状态,用于状态变化检测
  35. local last_charge_status = nil
  36. local last_battery_voltage = 0
  37. local last_charger_state = false
  38. -- 充电状态描述映射
  39. local charge_stage_map = {
  40. [0] = "放电模式",
  41. [1] = "预充电模式",
  42. [2] = "涓流充电",
  43. [3] = "恒流快速充电",
  44. [4] = "预留状态",
  45. [5] = "恒压快速充电",
  46. [6] = "预留状态",
  47. [7] = "充电完成",
  48. [8] = "未知状态"
  49. }
  50. -- 事件回调函数
  51. local function exchg_event_callback(event)
  52. if event == exchg.OVERHEAT then
  53. log.info("充电管理", "警告: 设备温度过高!请暂停充电")
  54. elseif event == exchg.CHARGER_IN then
  55. log.info("充电管理", "充电器已插入")
  56. elseif event == exchg.CHARGER_OUT then
  57. log.info("充电管理", "充电器已拔出")
  58. end
  59. end
  60. -- 格式化电池电压显示
  61. local function format_battery_voltage(voltage)
  62. if voltage < 0 then
  63. if voltage == -1 then return "当前阶段不需要测量" end
  64. if voltage == -2 then return "电压测量失败" end
  65. if voltage == -3 then return "仅充电器就绪(无电池)" end
  66. return "未知错误"
  67. end
  68. return string.format("%.2fV", voltage / 1000)
  69. end
  70. -- 计算电池电量百分比(简单估算)
  71. local function calculate_battery_percentage(voltage)
  72. if voltage < 0 then return 0 end
  73. -- 简单的电压到百分比映射,实际应根据电池特性调整
  74. local min_voltage = 3300 -- 3.3V,电池最低电压
  75. local max_voltage = BATTERY_VOLTAGE -- 充电截止电压
  76. if voltage <= min_voltage then
  77. return 0
  78. elseif voltage >= max_voltage then
  79. return 100
  80. end
  81. -- 线性计算百分比(简单估算)
  82. local percentage = (voltage - min_voltage) / (max_voltage - min_voltage) * 100
  83. return math.floor(percentage)
  84. end
  85. -- 显示充电信息的函数
  86. local function display_charge_info(status)
  87. if not status.result then
  88. log.error("充电管理", "获取充电状态失败")
  89. return
  90. end
  91. -- 计算电量百分比
  92. local percentage = calculate_battery_percentage(status.vbat_voltage)
  93. -- 格式化日志输出
  94. log.info("充电管理", string.format("电池电压: %s (%d%%)",
  95. format_battery_voltage(status.vbat_voltage), percentage))
  96. log.info("充电管理", string.format("充电阶段: %s",
  97. charge_stage_map[status.charge_stage] or "未知"))
  98. log.info("充电管理", string.format("充电完成: %s",
  99. status.charge_complete and "是" or "否"))
  100. log.info("充电管理", string.format("电池在位: %s",
  101. status.battery_present and "是" or "否"))
  102. log.info("充电管理", string.format("充电器在位: %s",
  103. status.charger_present and "是" or "否"))
  104. log.info("充电管理", string.format("IC过热: %s",
  105. status.ic_overheat and "是" or "否"))
  106. -- 检测并记录状态变化
  107. if last_charge_status ~= status.charge_stage then
  108. log.info("充电管理", string.format("状态变化: %s -> %s",
  109. charge_stage_map[last_charge_status] or "未知",
  110. charge_stage_map[status.charge_stage] or "未知"))
  111. last_charge_status = status.charge_stage
  112. end
  113. -- 检测电池电压变化超过100mV
  114. if math.abs(status.vbat_voltage - last_battery_voltage) > 100 and status.vbat_voltage > 0 then
  115. log.info("充电管理", string.format("电压变化显著: %.2fV", status.vbat_voltage / 1000))
  116. last_battery_voltage = status.vbat_voltage
  117. end
  118. -- 检测充电器状态变化
  119. if last_charger_state ~= status.charger_present then
  120. last_charger_state = status.charger_present
  121. log.info("充电管理", "充电器状态变化: " .. (status.charger_present and "连接" or "断开"))
  122. end
  123. end
  124. -- 电池管理任务
  125. local function battery_management_task()
  126. log.info("充电管理", "初始化电池管理...")
  127. -- 注册事件回调
  128. exchg.on(exchg_event_callback)
  129. -- 设置电池参数
  130. log.info("充电管理", string.format("设置电池参数: %.2fV, %dmAh, %s",
  131. BATTERY_VOLTAGE / 1000, BATTERY_CAPACITY, CHARGE_CURRENT_MODE))
  132. local setup_result = exchg.setup(BATTERY_VOLTAGE, BATTERY_CAPACITY, CHARGE_CURRENT_MODE)
  133. if setup_result then
  134. log.info("充电管理", "电池参数设置成功")
  135. else
  136. log.error("充电管理", "电池参数设置失败,检查芯片是否支持")
  137. return
  138. end
  139. -- 启动充电(可选,根据exchg库说明,通常不需要手动调用)
  140. -- 但为了演示完整流程,这里包含调用示例
  141. log.info("充电管理", "尝试启动充电...")
  142. local start_result = exchg.start()
  143. if start_result then
  144. log.info("充电管理", "充电启动成功")
  145. else
  146. log.warn("充电管理", "充电启动失败或已自动启动")
  147. end
  148. log.info("充电管理", "开始监控电池状态...")
  149. -- 主循环,定期检查电池状态
  150. while true do
  151. -- 获取充电状态
  152. local status = exchg.status()
  153. if status then
  154. -- 显示充电信息
  155. display_charge_info(status)
  156. -- 如果电池充满电,可以添加相应处理
  157. if status.charge_complete and status.charger_present then
  158. log.info("充电管理", "电池已充满!")
  159. end
  160. -- 如果充电IC过热,采取保护措施
  161. if status.ic_overheat then
  162. log.warn("充电管理", "充电IC过热,正在暂停充电...")
  163. exchg.stop()
  164. log.info("充电管理", "充电已暂停,请等待设备降温")
  165. -- 等待一段时间后再次尝试
  166. sys.wait(60000) -- 等待60秒
  167. log.info("充电管理", "尝试恢复充电...")
  168. exchg.start()
  169. end
  170. else
  171. log.error("充电管理", "无法获取充电状态")
  172. end
  173. -- 根据状态调整检查频率
  174. if last_charger_state then
  175. -- 充电中,更频繁地检查
  176. sys.wait(20000) -- 20秒
  177. else
  178. -- 未充电,降低检查频率
  179. sys.wait(60000) -- 60秒
  180. end
  181. end
  182. end
  183. -- 系统初始化完成后执行
  184. sys.taskInit(battery_management_task)