文件
zhou yang和Claude Opus 5.5 c37c08aa43 固件 A16:风扇闭环接进任务体 + NTC / TACH 真实采样(已上板)
- ntc.{h,c}(宿主机可测):分压端 mV → Ω → NCP18XH103F03RB 的 R-T 表插值;
  开路 / 短路 / 表外一律「读不到」(t_thermal 因此满速)
- thermal_esp.{h,c}(仅 IDF):ADC1 oneshot + 曲线校准读两路 NTC;两个 PCNT 单元数 TACH 边沿
- app_main:task_thermal 任务体、t_thermal_init 放在上电恢复之前、status 带热管理快照
- test_ntc.c 4 例;全工程 429 例全绿;版本 0.1.0-a16
- 板 B:两路 NTC 38.2 / 34.0 °C;风扇两路 rpm 0 报停转(拉满电流不涨,疑未插风扇,待确认)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-09-27 13:31:32 +08:00

50 行
2.4 KiB
C

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
/* 两路板载 NTC 的换算:ADC 读回的毫伏 → 毫摄氏度(A16,需求 §10.3 `t_thermal`)。
---- 电路(已按 `.claude/r2/_base_pcb_nets.json` 逐脚核实)----------------
+3V3 ── R660 10k ──┬── NTC1(IO4, ADC1_CH3) ── C736 ── GND
└── RT601 ── GND
(NTC2 同形:R661 / RT602 / C739 → IO5, ADC1_CH4)
**NTC 在下臂**:越热电阻越小、电压越低。写反成上臂的现象是「越热读数越低」——
风扇闭环照样算、照样有数,只是方向反了,要等机器满载才暴露。
RT601/RT602 = Murata **NCP18XH103F03RB**(10 kΩ @25 °C,B25/50 = 3380,立创 C13564;
设计文档 BOM 那一行)。换算走厂家 R-T 表(5 °C 一格、格内线性插值),
不用 B 值公式:B 公式在 25/50 °C 以外偏差 1~2 °C,而且要浮点和 log。
---- 这一层不做的事 ------------------------------------------------------
· 不读 ADC(那是 `thermal_esp.c`,只进 IDF)。本文件是纯整数换算,宿主机可测;
· 不做滤波:C736/C739 是硬件 RC,t_thermal 1 s 才读一次,再滤就是加延迟。 */
#ifndef NTC_H
#define NTC_H
#include <stdbool.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#define NTC_PULLUP_OHM 10000 /* R660 / R661 */
/* 分压端离两条轨多近就判「读不到」(mV)。
开路(NTC 没焊 / 断线)⇒ 电压贴 +3V3;短路 ⇒ 贴地。两者都不是温度。
⚠️ 这不是精度门限,是「这还是不是一颗 NTC」的门限:
表的两端(−40 °C / +125 °C)分别对应约 3.13 V / 0.16 V,离两条轨都还远。 */
#define NTC_RAIL_MARGIN_MV 30
/* ADC 读回的分压端电压 + 当时的上臂电源电压 → 毫摄氏度。
`vref_mv` 传 +3V3 的实际值(不知道就传 3300);比例式测量,电源偏 1 % 在 25 °C 附近带来 ~0.6 °C(分压中点处电阻误差是电源误差的 2 倍,NTC 每度约 4 %)。
返回 false = 开路 / 短路 / 超出表的范围(−40~125 °C),`*milli_c` 不动。 */
bool ntc_mc_from_mv(int32_t mv, int32_t vref_mv, int32_t *milli_c);
/* 电阻 → 毫摄氏度(查表 + 插值)。超出表的范围返回 false。给测试用,也给标定用。 */
bool ntc_mc_from_ohm(uint32_t ohm, int32_t *milli_c);
#ifdef __cplusplus
}
#endif
#endif /* NTC_H */