4.0 KiB
新板 TP4056 充电检测
2026-10-23:本实现替换旧单路充电检测与满电电压推断。
接线与状态
新板正式 TP4056 电路的 CHRG# 经 Q7 接 GPIO18,STDBY# 经 Q8 接 GPIO8。
两路默认低有效,3.3V上拉。配置位于 TQ Cat Configuration -> Board Hardware Configuration (GPIO);GPIO10马达没有接入。
| GPIO18 | GPIO8 | 确认后的领域状态 |
|---|---|---|
| 低 | 高 | charging,充电中 |
| 高 | 低 | full,充满信号有效 |
| 高 | 高 | not_charging,未充电 |
| 低 | 低 | fault,异常组合 |
原理图只能支持接线推断,仍须实测未插电、充电、充满、无电池的实际电平。
两个状态脚不能可靠确定USB存在或电池存在;full表示芯片输出的稳定充满信号,
不等于检测到了电池。百分比仍按电压估算,不因满电信号强制改为100%。
检测与提示
- 平台只读取原始数字电平和ADC,不解释充电语义。数字输入初始化不依赖ADC校准。
- 领域每100ms检查一次两路组合;连续采样稳定1秒才发布状态。超过250ms未轮询, 丢弃旧稳定假设并重新确认;持续抖动2秒则置未知。读取失败立即置未知。 这是采样去抖,不能证明两个采样点之间没有短脉冲。
- 控制层不注册GPIO边沿中断,复用原有电池任务,无新增任务或定时器。 领域快照同时保留最近读取的有效性和两路有效信号,供状态转换日志诊断; 最近原始输入可能与尚未改变的去抖状态不同。
- 本次运行先确认充电,再确认满电才播放一次满电提示。启动已满、充电后拔线、 异常或读取失败均不播放;后两类还会取消本轮提示资格。重新确认充电可开启下一轮。
- 移除旧的最低满电电压、百分比及30秒推断时间配置;满电不再靠电压推断。
GPIO页新增
TQ_BATTERY_FULL_GPIO=8、TQ_BATTERY_FULL_ACTIVE_LEVEL=0。
ADC、低电量和深睡
ADC正常10秒一次,轻待机300秒一次,失败或负载抑制1秒后重试;进入或退出轻待机 立即安排新样本。低压关机确认期间1秒一次。数字信号抖动不加速ADC采样,也不重复 消费旧样本推进关机计数。ADC失败会清空控制层低压确认计数。
原有电量曲线、滤波、负载抑制及阈值保持:低电量≤20%确认3次,≥25%退出; 未判定充电时,电量≤5%且滤波电压≤3.45V确认3次,或最新有效电压≤3.35V确认2次, 进入受控关机。未知/异常不冒充充电,不用来长期屏蔽原有低压保护。
GPIO18仍是低有效深睡唤醒源;GPIO8不作为唤醒源。唤醒保护提供约1.2秒有界轮询窗口, 确认充电或满电,或有效电压≥3.55V后允许继续启动。窗口内调度中断或输入抖动可能 导致状态仍未知,此时按电压判定,不无限等待。
验证与实机验收
主机回归入口:
python3 tools/test_battery_adc_init.py
python3 tools/test_battery_charge_detection.py
第一项提取实际平台C函数,验证GPIO18/8联合输入初始化、独立数字读取、ADC1/ADC2、 锁失败、校准失败释放和重试。第二项编译实际领域代码,用可控时钟和GPIO/ADC验证 四种输入组合、启动未知、连续抖动、稳定确认、长采样间隔、读取失败、ADC失败及 负载抑制独立性;并提取实际控制层电池任务,验证ADC节奏、待机切换、启动已满、 充电→满电提示、拔线取消及ADC失败不累计关机确认。 使用AddressSanitizer和UndefinedBehaviorSanitizer。
本次上述两个电池测试与五个显示回归脚本已通过;ESP-IDF 5.5.4新板配置构建通过。 未烧录,尚无本次逻辑的实机电平、提示或深睡验收结果。
实机仍需验证:不插电静置、插拔充电、充满、无电池、扬声器/电机/Wi-Fi并行、低电量 保护、深睡插电唤醒。对照GPIO18/8电平和万用表VBAT;主机测试或构建不能代替这些测量。