NTC 测温应用电路汇总及温度读取软件设计

  1. 使用可变电阻的NTC高精度测温电路

NTC热敏电阻温度传感器温度控制电路

(1)灵敏度调节:max约0.01°C

(2)电压调整温度设定用

金属膜电阻

BZ061(6V1W)稳压二极管SSR为固态继电器也可用12V电磁继电器

 

图1 可变电阻NTC测温电路

2.消费电子应用的测温电路

在手机,平板以及一些电子消费类产品中,都会有用到NTC进行温度检测。

此图是最简单的,也是最常用的NTC温度检测的电路图。

 

其中

R1为精度1%,阻值为390K的电阻。

RT1即为我们的NTC热敏电阻。

C1为1nF的电容,可加可不加。加的话可以滤除来自电源的或者电路板感应而来的高频干扰信号。在一些实际项目中,大都为了省成本,会选择不加。

 

要想知道温度,我们必须要知道NTC的阻值。但是我们并没有办法直接获取,但是我们却可以利用NTC获得的分压,测出电压值,从而进一步的可以了解其电阻值。

 

其中根据欧姆定律,RT1所在的支路,电流值为I=Vcc/(R1+RT1),RT1的电压值为U=IR=VCCRT1/(RT1+R1)。

 

同时假设MCU采用的是12位的ADC进行采样

则输入ADC的AD值为:

AD=4096U/UADC= 4096VCCRT1/[(RT1+R1) UADC]。

如果VCC与MCU的供电电压相同的话,则较为方便即

AD=4096*RT1/RT1+R1。

根据AD值进而可以了解RT1的分压,了解其阻值,进而了解其温度。

3. 采用电桥实现NTC温度采集

上图中我们通过一个电桥来采集NTC电阻的变化,因为电阻的变化会引起C17两端电压的变化。温度越高NTC电阻越小,C17两端电压差就越大,反之越小。我们采用了25摄氏度时,阻值为10K的NTC。不难推断出输出电压与NTC电阻值得关系。当输出电压为0V时,电阻约25K,查表可知唯独为5摄氏度左右。当输出电压为5V时,电阻值接近0,查表可知在100摄氏度以上。

4.简单的NTC测温电路

(1) AD620采用+5V供电。

(2)依据测量的最高温度值查表得热敏电阻的零功率电

阻,选择尺。=查表得热敏电阻的零功率电阻。

(3)选择Rwi =2R。,并向上圆整到电位器的系列值。

(4)计算在测量范围最低温端热敏电阻桥路的输出灵敏度

( mV/℃),如果输出灵敏度>lmV/℃,则需要提高Rs阻值或

在R。上并联一只电阻。

(5)如果测量范围最低温端热敏电阻桥路的输出灵敏度<lmV/℃,则可计算仪器放大器AD620所

需放大倍数的理论最小值。

( 6)通过查表可以得到热敏电阻器在0℃的阻值并计算测量臂的理论输出电压值,从而可以调整

电位器的输出分压值等于该理论值。有条件可以将热敏电阻放入冰水混合物中(注意传感器及其引线

的绝缘),调整使得万用表的示值为0(可以将万用表调整到最高灵敏度挡,如20mV或2mV挡)。

(7)町能的情况下,用高精度的温度计来校准电路,在整个测温范围内反复调整,便得在测量范

围内满足精度要求。必要时可以在Rt上并联一只电阻以改善线性。

(8)选择C的合适值,如O.OILt,F。

5. 增加偏置的NTC测温电路

上面温度传感电路图使用与负温度系数(NTC热敏电阻)串联的电阻器热敏电阻形成分压器,产生线性输出电压。该电路使用一个非反向运算放大器,该放大器具有对偏移的反向参考并获得信号。这有助于充分利用ADC分辨率并提高测量精度。

设计说明:

  1. 线性工作区采用运算放大器。线性输出波动通常在aol测试中指定。

  2. Vin被连接到输出电压的正温度系数。 纠正NTC输出电压,切换R1和NTC热敏电阻的位置。

  3. R1根据温度范围和NTC值选择。

  4. 可以使用DAC或分压器创建Vref。如果使用分压器,等效电阻分压器的电压将影响电路的增益。

  5. 高值电阻降低放大器和电容电路的相位裕度引入额外的噪声。建议使用约10kΩ或更小的电阻值。

  6. 放置在与所述电容器并联,以限制带宽,提高稳定性并提供反馈电阻有助于降低噪音。

设计模拟DC转换数据AC输出数据

NTC温度软件设计

NTC 是热敏电阻,其电阻值对温度变化敏感,在不同的温度下,可以呈现不同的电阻值。热敏电阻有两类,一类是负温度系数电阻(NTC),温度增加时,电阻值降低,另一类是正温度系数电阻(PTC),温度增加时,电阻值增加。

热敏电阻的电阻值计算

NTC 的电阻值 R 与温度的关系可以近似表示为:

 

公式1

 

公式 1,电阻与温度函数关系式。其中 T 是绝对温度,数值为摄氏温度+273.15,单位为 K(开尔文)。R0 一般取温度 25℃即 298.15K 时的电阻值,对应的 T0 取 25℃,即 298.15K。B 为材料常数.不同的村料或者生产工艺都能导致 B 的数值发生变化,甚至在热敏电阻的工作范围内,B 的数值都可能发生变化,而不是严格的常数;因为 NTC 的电阻与温度呈非线性的关系,而且存着温度的增加,温度随着温度变化的变化率越小。所以随着温度的增加,NTC 测温的精度变化;所以比较适合于温度变化范围小的使用场景,比如环境温度(约为 -20℃-50℃)或者是水温的检测(0℃-100℃)。

按照温度为 25℃的电阻取值,可有 5KΩ,10 KΩ等不同的规格,而材料系数 B 值固定为 3950。我选择 10K 的规格,根据公式 1,可以得到这款 NTC 的电阻与温度的关系为:

 

公式2

 

公式 2,电阻与温度的函数关系式。通过 excel 表格的公式,在 excel 工作薄的第一列输入温度,第二列输入公式可以得到不同温度下的电阻值,比如 0℃为 33.6 KΩ

采用 excel 计算 AD 值,

公式法:

程序设计中如将公式 1 取对数,通过复杂的对数运算和倒数运算得到温度值,这是不合适的,主要是:普通的单片机不一定提供这样的数学函数库。普通的单片机没有浮点数运算,浮点数都是转成整弄运算的,不可避免会有舍入误差。单片机做对数,倒数的运算,只能是近似算法,而且会耗费大量的运算时间,可能会到几百 ms 级,影响了对其它功能处理的实时性。公式 1 只是一个近似公式,B 值也并不是一个常数,用这样具体的解析公式计算,没有办法根据实际测量值对计算值进行标定,从而提高测量精度。

查表直线拟合法:把曲线通过数据拟合成直线。查表法顾名思义就是通过电阻分度表来获取温度区间,再做拟合。首先我们需要建立相应的表我们定义为数组。有了分度表实现也就简单了,但需要注意两端极限位置的处理。具体实现如下:

1 /*查表法计算NTC温度值*/
2 static float LookupNTCTemperature(float resistance)
3 {
4 float temp;
5 uint16_t index=NTC_TABLE_LENGTH+10;
6
7 index=FindTargetLocation(resistance);
8
9 if(index<=0)
10 {
11 temp=ntcValueTable[0][0];
12 }
13 else if(index>=NTC_TABLE_LENGTH)
14 {
15 temp=ntcValueTable[0][NTC_TABLE_LENGTH-1];
16 }
17 else
18 {
19 float lowT=ntcValueTable[0][index-1];
20 float lowR=ntcValueTable[1][index-1];
21 float highR=ntcValueTable[1][index];
22
23 temp=((resistance-lowR)*0.5)/(highR-lowR)+lowT;
24 }
25
26 return temp;
27 }
28
29 /*查找目标位置*/
30 static uint16_t FindTargetLocation(float resistance)
31 {
32 uint16_t position=0;
33 while(ntcValueTable[1][position]>resistance)
34 {
35 if(position<NTC_TABLE_LENGTH-1)
36 {
37 position++;
38 }
39 else
40 {
41 position++;
42 break;
43 }
44 }
45
46 return position;
47 }

其中,B是NTC的常数,每种为固定值。Rt是NTC的电阻,R为标称25摄氏度时的电阻。T1是Rt对应的开氏温度,T2是标称的开氏温度。于是我们就可以推导出有电阻计算温度的公式。

1 /*公式法计算NTC温度值*/
2 static float FormulaNTCTemperature(float resistance)
3 {
4 float temp;
5 float result=0.0;
6
7 result=resistance/NTC_NOMINAL_RESISTANCE;
8 result=(log(result)/NTC_NOMINAL_CONSTANT)+(1/(NTC_NOMINAL_TEMPERATURE+KELVIN_CONSTANT));
9 temp=1/result-KELVIN_CONSTANT;
10
11 return temp;
12 }

分段线性法:

步骤如下:

采用 excel 表格自动生成 C 语言中包含 AD 与温度的二维数组

将测温范围分若干个区间,比如在 0-100 度的范围内,分 100 个区间,每个区间范围为 1℃计算或者实测每一个区间下限和区间上限的温度值; 比如区间 30℃-31℃,根据公式 1 计算或者实际测试出 30℃以及 31℃的 AD 值。将这些区间表示为 2 维数组(这个 2 维数组也可以通过实际测试形成);取出将 AD 转换并多次平均之后数值,编历分段的区间,与这些区间的 AD 上、下限进行比较,判断落在哪一个区间,根据一次函数的公式进行区间内的插值修正:测试温度值=区间温度下限+(区间温度上限 - 区间温度下限)/(区间 AD 上限 - 区间 AD 下限)*(AD 测量值 - 区间 AD 下限)。

全段查表法

根据需要实现的温度精度,用EXCEL表格计算对应的NTC对应的电阻值最大值和最小值,采用查表法。原理如下:利用两个存储区同时存储最大值和最小值,根据AD采样得到的对应的电阻值进行查表,从而得到温度值。

VHDL语言

p1:process(clk,rst_n)

variable p1_vrb_state4: std_logic_vector(3 downto 0);

variable p1_vrn_delay_cnt:integer range 0 to 31;

begin

if(rst_n='0')then

p1_vrb_state4:=(others=>'0');

p1_vrn_delay_cnt:=0;

p1_sgb_ntc_temp_addr_buf<=(others=>'0');

p1_sgb_ntc_temp_acq_res1<=(others=>'0');

p1_sgb_ntc_temp_acq_res2<=(others=>'0');

out_ntc_temp1<=(others=>'0');

out_ntc_temp2<=(others=>'0');

elsif(clk'event and clk='1')then

if(p1_vrb_state4=x"0") then ----初始化状态机

p1_sgb_ntc_temp_acq_res1<=in_ntc_res1; ---获取第一路对应的电阻值

p1_sgb_ntc_temp_acq_res2<=in_ntc_res2; ---获取第二路对应的电阻值

p1_vrb_state4:=x"1"; ----

elsif (p1_vrb_state4=x"1") then

p1_sgb_ntc_temp_addr<=p0_sgb_ntc_temp_addr_buf;

p1_vrb_state4:=x"2"; ----

elsif (p1_vrb_state4=x"2") then

if (p1_vrn_delay_cnt=2) then

p1_vrb_state4:=x"3"; -----延时3个时钟周期,转移到下一个状态

p1_vrn_delay_cnt:=0;

else

p1_vrn_delay_cnt:=p1_vrn_delay_cnt+1;

end if;

elsif (p1_vrb_state4=x"3") then

if(p1_sgb_ntc_max_res>=p1_sgb_ntc_temp_acq_res1) and (p1_sgb_ntc_temp_acq_res1>=p1_sgb_ntc_min_res) then

out_ntc_temp1<=p1_sgb_ntc_temp_addr_buf;

end if;

if(p1_sgb_ntc_max_res>=p1_sgb_ntc_temp_acq_res2) and (p1_sgb_ntc_temp_acq_res2>=p1_sgb_ntc_min_res) then

out_ntc_temp2<=p1_sgb_ntc_temp_addr_buf;

end if;

p1_vrb_state4:=x"4";

elsif (p1_vrb_state4=x"4") then

if (p1_sgb_ntc_temp_addr_buf=x"a0") then ---x"a0"=160 ----对应实际温度160-40=120℃

p1_vrb_state4:=x"0"; -----开始下一个电阻温度查找

p1_sgb_ntc_temp_addr_buf<=(others=>'0');

else

p1_sgb_ntc_temp_addr_buf<=p0_sgb_ntc_temp_addr_buf+x"01";

p1_vrb_state4:=x"1"; -------继续当前温度查找

end if;

else

p1_vrb_state4:=(others=>'0');

p1_vrn_delay_cnt:=0;

p1_sgb_ntc_temp_addr_buf<=(others=>'0');

p1_sgb_ntc_temp_acq_res1<=(others=>'0');

p1_sgb_ntc_temp_acq_res2<=(others=>'0');

end if;

end if;

end process p1;

转自:https://zhuanlan.zhihu.com/p/489394816
posted @ 2022-05-25 14:15  苍月代表我  阅读(2679)  评论(0编辑  收藏  举报