找回密码
 立即注册
查看: 87|回复: 3

请Coody讲解一下有关实验箱NTC测温代码的疑问。

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:583
  • 最近打卡:2025-10-16 07:15:35

27

主题

123

回帖

447

积分

中级会员

积分
447
发表于 2025-10-4 09:25:53 | 显示全部楼层 |阅读模式
实验箱(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貌似按颠倒电气连接情况计算。
SDNT2012X103F3950FTF R-T对照表.png

回复

使用道具 举报 送花

3

主题

1880

回帖

608

积分

等待验证会员

积分
608
发表于 2025-10-4 09:28:00 | 显示全部楼层
关于实验箱(如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[2048] = 25 表示当ADC值为2048时,温度为25℃;
temptable[1041] = 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型号一致,否则需重新标定。

如需进一步讨论电路设计、温度标定方法或代码优化,欢迎继续提问。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:328
  • 最近打卡:2025-10-15 08:50:20
已绑定手机

85

主题

3256

回帖

7196

积分

荣誉版主

无情的代码机器

积分
7196
发表于 2025-10-4 11:05:21 | 显示全部楼层
可以先看下这个帖子是否能解惑,有个简易电路、公式注释和对应的NTC电阻手册:

https://www.stcaimcu.com/forum.p ... 2839&pid=131196
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:585
  • 最近打卡:2025-10-16 07:20:54
已绑定手机

86

主题

6274

回帖

1万

积分

超级版主

积分
11738
发表于 2025-10-5 11:53:02 | 显示全部楼层
Rt接地就是热敏电阻接地的意思,此时固定电阻接Vref
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-16 07:48 , Processed in 0.122945 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表