请Coody讲解一下有关实验箱NTC测温代码的疑问。
实验箱(32G或者AI8051U)代码包中NTC测温章节,有一张NTC传感器温度对一电阻值图表,图表的值跟代码中u16 code temp_table[]不知道是什么关系。根据实验箱NTC电气连接情况,即10K电阻与NTC节点接ADC3,10k电阻一端P51口,NTC另一端接地,ADC3采集的是10k电阻与NTC电阻分压的ADC值,取图表中25℃时NTC电阻为10K验算,4096的一半等于2048,此值与代码中u16 code temp_table[]中25℃时值一致。再取图表2℃时NTC电阻为29.92K,接近30K验算,ADC值应该是3072左右,但代码中u16 code temp_table[]中2℃时值为1041。在代码u16 get_temperature(void)函数计算温度中有一句“adc = 4096 - adc; //Rt接地”,RT接地是什么意思不明白,代码中注明了:电路和软件算法设计: Coody。温度低ADC值应该大,温度高ADC值应该小,代码中列表正好相反,感觉Coody貌似按颠倒电气连接情况计算。
关于实验箱(如32G或AI8051U)中NTC测温代码的疑问,确实是一个值得深入解析的问题。以下将从电路结构、ADC采集原理、温度与电阻关系、代码实现逻辑等方面进行详细说明,以帮助理解u16 code temptable[]数组的作用、adc = 4096 - adc;语句的含义,以及为何温度与ADC值之间看似“颠倒”的关系。
一、NTC测温电路原理简介
实验箱中NTC传感器的典型接法如下:
NTC一端接地;
另一端与一个10kΩ的固定电阻串联后接到VCC;
两者的连接点(即分压点)接到ADC3口进行电压采样。
因此,ADC3采集的是NTC与10kΩ电阻分压后的电压值。根据分压原理:
$$
V{ADC} = V{CC} \times \frac{R{NTC}}{R{fixed} + R{NTC}}
$$
其中:
$ R{fixed} = 10k\Omega $
$ R{NTC} $ 是随温度变化的电阻
ADC为12位精度,即最大值为4095(对应VCC电压)。
当NTC电阻增大(温度降低)时,分压点电压升高,ADC值增大;
当NTC电阻减小(温度升高)时,分压点电压降低,ADC值减小。
二、NTC温度与电阻关系
NTC的电阻随温度呈非线性变化,通常通过查表或经验公式(如Steinhart-Hart公式)来计算温度。实验箱中提供了NTC温度与电阻值的对照表,用于建立温度与ADC之间的映射关系。
例如:
25℃时,NTC电阻约为10kΩ,此时分压比为1:1,ADC值应为4096的一半,即2048;
2℃时,NTC电阻约为29.92kΩ,此时分压比为29.92:10,ADC值应接近3072。
但实际代码中的temptable[]在25℃时值为2048,在2℃时值为1041,与理论计算值不符,似乎“颠倒”了。这正是需要进一步分析的关键。
三、代码中的temptable[]数组含义
在代码中,u16 code temptable[]数组存储的并非NTC的电阻值,也不是温度值,而是ADC采样值对应的温度索引。也就是说,数组索引代表ADC值,数组内容代表温度(单位为摄氏度)。
例如:
temptable = 25 表示当ADC值为2048时,温度为25℃;
temptable = 2 表示当ADC值为1041时,温度为2℃。
这说明:
ADC值越小,表示NTC电阻越小,温度越高;
ADC值越大,表示NTC电阻越大,温度越低。
这与理论一致,说明温度与ADC值成正相关关系是错误的理解,应该是温度与ADC值成反比关系。
四、“adc = 4096 - adc;”语句的含义
该语句出现在函数u16 gettemperature(void)中,其注释为“Rt接地”,意思是NTC一端接地,另一端连接分压点。那么为何要做减法?
原因如下:
1. 电路结构影响ADC值与温度的关系
由于NTC接地,固定电阻接VCC,ADC采集的是固定电阻上的电压。因此:
温度升高 → NTC电阻下降 → 固定电阻分压升高 → ADC值下降;
温度下降 → NTC电阻上升 → 固定电阻分压下降 → ADC值上升。
所以ADC值与温度成反比关系。
2. 便于查表处理
为了方便查表(即temptable[]数组索引为ADC值),将ADC值做一次“翻转”处理:
$$
adc = 4096 - adc
$$
这样处理后:
原来ADC值小(温度高) → 变为大值;
原来ADC值大(温度低) → 变为小值;
从而使得ADC值越大,温度越高,更符合人的直观理解,也便于后续查表使用。
3. 软件逻辑一致性
通过该语句,可以统一处理逻辑:ADC值越大,温度越高,直接作为索引查找temptable[]即可。
五、总结与建议
1. temptable[]数组的作用
存储的是温度值;
数组索引对应ADC值;
用于将ADC采样值快速映射为温度值。
2. ADC值与温度的关系
由于NTC接地,ADC采集的是固定电阻上的电压;
温度高 → ADC值小;
温度低 → ADC值大;
通过adc = 4096 - adc;使ADC值与温度成正比,便于查表。
3. 疑问澄清
“温度低ADC值应该大,温度高ADC值应该小”是正确的;
代码中temptable[]的值与理论计算不符,是因为它不是电阻值,而是温度值;
“颠倒电气连接”的说法不准确,实际是软件逻辑处理使然。
4. 实际使用建议
若电路连接方式改变(如NTC接VCC,固定电阻接地),则应去掉adc = 4096 - adc;语句;
若需更高精度,可采用Steinhart-Hart公式或线性插值法优化温度计算;
确保temptable[]数组与实际使用的NTC型号一致,否则需重新标定。
如需进一步讨论电路设计、温度标定方法或代码优化,欢迎继续提问。
[本文内容由国芯人工智能辅助生成,仅供参考] 可以先看下这个帖子是否能解惑,有个简易电路、公式注释和对应的NTC电阻手册:
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=12839&pid=131196
Rt接地就是热敏电阻接地的意思,此时固定电阻接Vref
页:
[1]