炬芯ATS3089X的放电与充电NTC温度保护功能实现
# NTC 电池温度保护本版为 ATS3089P 开发板增加充电和放电温度保护开机自动运行无需启动命令。主控通过 GPIO20/J3 的 NTC 电路测温外置 CW6305 负责执行停止、恢复充电。## 默认保护规则| 状态 | 条件 | 动作 || --- | --- | --- || 充电供电状态 | 温度 ≤ 0℃ | 停止充电 || 充电供电状态 | 温度 ≥ 45℃ | 停止充电 || 已因温度停止充电 | 温度恢复到 342℃含端点 | 允许恢复原充电电流 || 放电状态 | 温度 -14℃ 或 60℃ | 发送正常关机事件 || 充电供电状态 | NTC 开路、短路或 ADC 采样失败 | 停止充电 || 放电状态 | NTC 开路、短路或 ADC 采样失败 | 发送正常关机事件 |保护和恢复默认要求 **连续 5 次**满足相应条件采样间隔约 1 秒确认过程约 5 秒。中间出现正常值会重新累计异常次数中间出现异常值会重新累计恢复次数。截图中的“保持 30 min”是温箱验收时的稳定测试条件不表示软件等待 30 分钟才保护。开机后先禁止充电连续取得 5 次有效且处于 342℃的读数后才允许充电。温度处于 03℃或 4245℃之间时保持已有充电保护状态避免在边界反复启停。供电状态发生变化时重新确认不沿用切换前累计的次数。**放电默认值 -14℃、60℃是根据已有 SDK 温度曲线两端推定的可配置值不是原工程已有的放电保护标准。** 产品实际要求不同应修改下面的配置。放电保护关机后不会自动开机温度恢复后由用户重新启动设备。## 接线与采样原理用户已确认 NTC 两处均已连接主控 GPIO20/J3 接口和 CW6305 的 BAT_NTC 接口。本版以主控采样值作为软件保护依据CW6305 的硬件 NTC 功能仍保持原配置NTC_Func_EnableNO不额外启用其 NTC 上拉。两处连接的实物电路仍会影响 ADC 值调试时应核对外部上拉、NTC 阻值和参考电压。| 信号 | 当前用途 || --- | --- || GPIO20 / J3 第 1 脚 | NTC 分压采样LRADC2PMU ADC 通道 7 || J3 第 2 脚 | GND || GPIO23 | 同一 LRADC2 的参考电压采样分时切换 || PMUADCDIG_CTL bit 5 | 打开/关闭 GPIO20 的内部 100K 上拉 || CW6305 | 通过 I2C 控制充电使能读取输入供电状态 |GPIO21 保留给显示屏供电控制NTC 采样不占用该引脚。开启 NTC 后 UART1 已关闭显示驱动继续负责 GPIO21 的上电、关闭以及休眠后的供电恢复。2026-10-13 修正版恢复了 GPIO21 的屏幕供电配置。此前 NTC 版本误将该配置禁用可能出现界面日志正常刷新但屏幕没有显示的情况本次只修复此处显示供电配置。**GPIO23 必须按原图“悬空参考采样”方式使用不能带 ETA7027 EN 或其 1M 下拉负载。**如果实际板上已装这部分电路需要先断开相应负载或重新设计并标定参考采样方案。不能同时把 GPIO23 当电源开关输出和本版的参考采样输入。一次测量按以下顺序执行1. GPIO20 切换为 NTC 输入GPIO23 保持高阻打开内部 100K 上拉等待约 50 ms 后读 ADC。2. 关闭内部上拉将 GPIO20 置高阻GPIO23 切换为参考采样等待约 5 ms 后读 ADC。3. 计算 scale NTC_ADC × 1000 / REF_ADC抵消上拉电源变化造成的部分误差。4. 根据 SDK 曲线计算近似温度交给保护状态机。5. 无论采样成功还是失败最终关闭内部上拉并将 GPIO20、GPIO23 都恢复高阻。本版占用 GPIO20原 GPIO20/21 的 UART1 测试和开机 hello word 输出停用。app gpio_uart on、写入和回环接口会返回 -EBUSY避免重新占用 NTC 引脚。原 UART0 控制台和 USB CDC 命令方式继续使用USB CDC 的开启方法见[USB_SERIAL.md](USB_SERIAL.md)。## SDK 曲线与温度精度用户选择使用已有参数因此本版沿用battery_leopard_internal/bat_charge_private.h 中 BAT_NTC_RANGE_0..4 的归一化边界| scaleNTC_ADC / REF_ADC × 1000 | 近似温度 || --- | --- || 183 | 60℃ || 234 | 52℃ || 318 | 42℃ || 633 | 14℃ || 788 | 0℃ || 895 | -14℃ |相邻点之间使用分段线性插值。超过表格上下端时使用端点相邻线段外推仅用于识别温度越界不把外推值当作可靠的温度测量结果。scale ≤ 20、scale ≥ 980 或参考 ADC 值过低会判为无效读数避免开路、短路或参考电路异常被误认为正常温度。这些参数来自 SDK 的区域边界**不是当前实物 NTC 的完整 R-T 曲线**。当前没有确认 NTC 物料型号、R25 和 B 值也没有套用 B3950 等额外假设。temperature_decic 表示近似温度单位为 0.1℃有一位小数不等于具有 0.1℃的测量精度。本版不能据此宣称满足截图中的 ±2℃要求必须用实际电池 NTC 和板上电路做温箱标定。如需提高精度可把 ntc_policy.c 的曲线替换为实际物料数据或实测标定点。应重点校准 0℃、3℃、42℃、45℃以及实际放电保护点并保留上拉电源参考采样。## 停止和恢复充电的实现充电供电状态根据 **CW6305 当前输入电源**判断读取状态寄存器 0x0E 的 PG 位。不使用 USB CDC 是否连接也不使用主控 PMU 的 DC5V 电平替代外置充电芯片状态。停止充电后芯片可能报告 DISCHARGE/NORMAL仍按输入电源存在执行充电恢复规则。读取供电状态失败时保持禁止充电不把未知状态当作有效放电状态。温度异常时清除 CW6305 CHG_EN使充电停止效果相当于充电电流为 0。**不把 CC 电流配置写成 0**该芯片电流配置编码 0x00 对应 10 mA并非 0 mA。停止期间保存正常充电请求和原有电流配置恢复时使用原配置。温度保护拦截所有充电开启路径包括插入电源后的延迟开启、正常充电、测量真实电池电压后的恢复、满电后的再充电以及低电量 mini charge。原始寄存器调试写入同样不能在温度禁止期间重新打开 CHG_EN。温度恢复只是解除温度限制。满电、正在测压、无电池、无输入电源以及其他原有充电状态条件仍会阻止启动避免温度恢复直接绕过原充电管理。I2C 写入或读回失败会记录错误并在后续监测中重试硬件执行成功须以寄存器读回及实际充电电流验证为准。放电保护通过电池事件发送给 main在主线程再次确认保护状态和当前 PG 后进入原有正常关机流程完成应用退出、参数保存和电源关闭。## 调度与待机功耗NTC 使用独立 workqueue栈 1536 字节、优先级 4避免被原 mini charge 中的约 10 秒等待阻塞。CW6305 的中断处理也使用独立 workqueue栈 1536 字节、优先级 8避免共用默认队列导致供电状态更新滞后。监测期间持续持有 PARTIAL_WAKE_LOCK防止进入 S3 后普通采样任务暂停。它允许屏幕关闭但 CPU 保持普通运行因此会增加待机功耗。正常关机、重启退出监测时取消任务并释放锁。本版优先保证持续温度监测后续如需低功耗运行可增加 T1 定期唤醒采样方案。## 查看日志在 UART0 或已开启的 USB CDC shell 执行textapp ntc status命令和周期日志会直接显示摄氏温度例如textntc: temp27.6 C temp_decic276 valid1 adc7226 ref15006 scale481 dc5v0 block1 bad0 poweroff0temp27.6 C 表示约 27.6℃负温度会显示为 temp-0.5 C 等格式。无效采样显示 tempinvalid不能用此时的 temp_decic 判断实际温度。| 字段 | 含义 || --- | --- || temp | 摄氏温度直接显示小数和 C 单位采样无效时显示 invalid || temp_decic | 近似温度0.1℃例如 250 表示约 25℃ || valid | 1 表示本次温度采样有效0 时不要使用温度字段判断实际温度 || adc / ref | NTC 和参考的原始 ADC 值 || scale | NTC/参考的归一化比例乘以 1000 || dc5v | CW6305 输入供电状态0 无输入、1 有输入其他值为未知/读取失败 || block | 1 表示温度充电禁止门已设置不等于已经实测到 0 mA || bad | 连续异常样本次数 || poweroff | 1 表示已满足放电保护关机条件 |主要动作日志text[ntc] CHARGE_STOP[ntc] CHARGE_RESUME_ALLOWED[ntc] DISCHARGE_PROTECT: shutdown前两条充电日志表示软件保护状态变化正常采样日志还会显示温度、ADC、比例和供电。本版只提供状态查询不提供绕过保护的强制充电或伪造温度命令。## 修改保护阈值配置位于 zephyr/drivers/power_supply/Kconfig可以在应用配置中覆盖。温度配置单位均为 **0.1℃**textCONFIG_BATTERY_NTC_PROTECTIONyCONFIG_BATTERY_NTC_CHARGE_LOW_STOP0CONFIG_BATTERY_NTC_CHARGE_LOW_RESUME30CONFIG_BATTERY_NTC_CHARGE_HIGH_RESUME420CONFIG_BATTERY_NTC_CHARGE_HIGH_STOP450CONFIG_BATTERY_NTC_DISCHARGE_LOW-140CONFIG_BATTERY_NTC_DISCHARGE_HIGH600CONFIG_BATTERY_NTC_CONFIRM_SAMPLES5必须保持低温停止 低温恢复 高温恢复 高温停止放电下限 放电上限。修改配置或曲线后需要重新编译和打包。## 实板验证方法本次完整固件编译及打包已通过51 项自动化场景全部通过温度曲线与保护策略21 项、ADC/监控与错误处理 12 项、真实固件 ELF 中的 CW6305 驱动 18 项。执行方法见 [测试说明](tests/ntc/README.md)。尚未进行温箱与实际充电电流验证。软件模拟测试用于验证状态机和充电控制实际温度精度、接线及充电电流需要以下实板验证1. 检查 NTC、GPIO20/J3 和参考 GPIO23 的实物接线断开 GPIO20/21 上的 UART1 工具。2. 在常温执行 app ntc status确认 valid1ADC/参考/比例稳定温度与外部温度计接近。3. 用电阻箱替代主控采样支路的 NTC验证边界和开路/短路动作。若两个接口接同一支路不要在未断开原 NTC 时并联电阻箱按实际电路连接避免改变等效阻值。4. 有充电输入时降到 0℃或升到 45℃确认连续异常后停止充电并测量充电电流。分别升到 3℃、降到 42℃确认连续正常后恢复原电流。5. 拔掉充电输入在实际放电上下限外确认正常关机温度恢复后手动重新开机。6. 在低电量 mini charge、正常充电、满电、测压和电源插拔场景重复验证确认没有提前恢复。7. 使用温箱在截图规定的温度条件下保持 30 分钟记录外部温度、ADC、保护动作和实测电流根据测量结果调整曲线验证所需的 ±2℃范围。## 源码与固件包| 文件 | 作用 || --- | --- || zephyr/drivers/power_supply/battery_ntc/ntc_protection.c | ADC 采样、参考归一、独立队列、休眠锁和关机通知 || zephyr/drivers/power_supply/battery_ntc/ntc_policy.c | SDK 温度曲线、充放电阈值、滞回和连续样本确认 || zephyr/drivers/power_supply/battery_leopard_external/bat_charge_cw6305.c | PG 读取、充电门控、寄存器保护和充电控制 || application/bt_watch/src/main/system_app_main.c | 开机启动和主线程放电保护关机 || application/bt_watch/src/main/system_app_shell.c | app ntc status || zephyr/boards/arm/ats3089p_dev_watch/board.c | GPIO20/23 分时复用 |在仓库的 zephyr 目录先编译再打包powershellninja -C ..\application\bt_watch\outdir\ats3089p_dev_watchpython build.py -n -p -b ats3089p_dev_watch -a bt_watch本次固件位于 application/bt_watch/outdir/ats3089p_dev_watch/_firmware/- ats3089p_dev_watch_261013_ntc_temp_log.fw- ats3089p_dev_watch_261013_ntc_temp_log_debug.fw此版本包含 GPIO21 屏幕供电修复并增加温度的直接显示温度换算、保护阈值和动作不变。烧录后应先通过常温状态、输入电源 PG 和 ADC 读数核对板级连接再进行温度边界测试。

相关新闻

燃烧仿真中辐射传热模型怎么选?DO与WSGGM实战指南

燃烧仿真中辐射传热模型怎么选?DO与WSGGM实战指南

1. 辐射传热:燃烧仿真中最容易忽略的主角做燃烧仿真的人都知道一个矛盾:大多数人入门的第一个燃烧算例,火焰温度总是偏高。不管湍流模型怎么调、化学反应机理怎么换,炉膛出口温度就是压不下来。直到某天某位前辈淡淡说了一句“你开…

2026/10/14 4:27:51 阅读更多 →
GridView AJAX化实战:告别Postback,实现无刷新分页与排序

GridView AJAX化实战:告别Postback,实现无刷新分页与排序

简介:面向ASP.NET开发者的GridView实用示例包,针对VS自带的GridView在数据增删改操作上不灵活、页面刷新频繁、交互体验差等痛点,提供了一套基于ASP.NET 4.0与SQL Server 2008的轻量级解决方案,通过Ajax实现无刷新操作&#xff0c…

2026/10/14 4:27:51 阅读更多 →
什么情况下索引会失效

什么情况下索引会失效

一、什么叫做索引失效索引失效,是指查询时因为写法或条件的问题,数据库用不上(或只用上一部分)已有的索引,导致加速能力丧失,退化成全表扫描或逐行过滤。数据照样查得出来,结果也对,…

2026/10/14 4:27:51 阅读更多 →

最新新闻

电商AI视觉生产流水线:12个可编排图像生成Skill开源实践

电商AI视觉生产流水线:12个可编排图像生成Skill开源实践

1. 这不是又一个“AI画图工具”,而是电商视觉生产流水线的底层能力拆解你有没有遇到过这样的场景:运营同事凌晨两点发来消息,“明天大促主图要换,三套风格,带卖点文案,尺寸必须是800800和1200628双规格&…

2026/10/14 5:25:13 阅读更多 →
JavaScript正则方法全解析:从exec到replaceAll的实战指南

JavaScript正则方法全解析:从exec到replaceAll的实战指南

写正则的人最怕的不是正则写不出来,而是同一个需求,每个方法看起来都“差不多能用”,但真上线之后,Bug一个接一个。我见过好几次这样的情况:有人用match想拿捕获组,结果返回了一堆字符串;有人在…

2026/10/14 5:25:13 阅读更多 →
Apache Mesos 0.28.0 特性深度解析:net_cls 网络隔离、统一容器化与 v1 Executor HTTP API

Apache Mesos 0.28.0 特性深度解析:net_cls 网络隔离、统一容器化与 v1 Executor HTTP API

云原生 【免费下载链接】mesos Apache Mesos 项目地址: https://gitcode.com/gh_mirrors/mesos2/mesos 点击查看 免费下载 Apache Mesos 0.28.0 是 Mesos 发展历程中承上启下的一个重要版本:它在 Linux cgroups 网络隔离、标量资源精度、动态预留资源元…

2026/10/14 5:25:13 阅读更多 →
人体供暖系统:科学激活产热机制抵御寒冬

人体供暖系统:科学激活产热机制抵御寒冬

1. 寒冬里的主动发热之道最近几年冬天越来越难熬,特别是南方没有集中供暖的地区。作为一个在杭州生活了十年的北方人,我深刻体会到南方湿冷的威力——那种冷是往骨头缝里钻的。开空调太干燥,电热毯又只能局部取暖,于是我开始研究如…

2026/10/14 5:25:13 阅读更多 →
UE5 C++单播代理实战:DECLARE_DELEGATE与TDelegate全面解析

UE5 C++单播代理实战:DECLARE_DELEGATE与TDelegate全面解析

做游戏逻辑的时候,最常干的一件事就是把“某个行为”传递给“另一个系统”。按键按下的那一刻要通知谁,异步加载完关卡要提醒谁,血量掉到某个阈值要唤起谁——这些在UE5 C里最直接的落地方案就是代理(Delegate)。其中单…

2026/10/14 5:25:13 阅读更多 →
VC++ FTP服务器与客户端完整源码解析:从协议到断点续传实战

VC++ FTP服务器与客户端完整源码解析:从协议到断点续传实战

简介:一套面向VC/MFC与网络通信初学者的FTP客户端与服务器完整示例工程,基于VC6.0调试通过。工程同时提供控制台版本的FTP服务器和MFC界面客户端,源码头文件结构清晰,关键功能均以类接口形式开放,便于在此基础上扩展成…

2026/10/14 5:24:12 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →