/* 两路板载 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 #include #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 */