NTC热敏电阻是一种负温度系数的热敏电阻,它的性性是阻值随温度的升高而降低,主要作用是对温度的测量及补偿,也用于NTC温度传感器的制作,常用的使用范围在-55℃至200℃之间。
以 MF52 系列测温型 NTC 热敏电阻器规格书为例,来看一看NTC的一些主要参数
热敏电阻标称阻值是关键参数之一,常见阻值范围从1KΩ至几百KΩ,具体看使用情况。通常使用25℃的温度,这可以表示为R25值。对于更专业的应用,可以使用其他温度。还要注意,有时温度可以用绝对温度引用,即°K。
此NTC 25℃情况下的阻值为10KΩ
与任何电阻一样,标准电阻具有容差,被称为为R25值,或者给出电阻的温度值。通常可获得±2%,±3%和±5%的值
B值是温度系数热敏电阻器的材料常数(热敏指数),单位是开尔文温度(K)。半导体陶瓷经过高温烧结后通过一系列的加工工序形成具有一定电阻率的NTC热敏芯片,每种配方和烧结温度下只有一个B值。NTC热敏电阻的B值与产品电阻温度系数正相关,也就是说B值越大,其电阻温度系数也就越大。
NTC热敏电阻B值公式为: B= T1*T2/(T2-T1)*Ln(RT1/RT2)
其中的B:NTC热敏电阻的B值,由厂家提供;
RT1、RT2:热敏电阻在温度分别为T1、T2时的电阻值;
T1、T2:绝对温标。
NTC热敏电阻的B值一般在2000K-6000K之间,根据不同的应用范围可以选择不同的B值。一般情况下,作为温度测量、温度补偿以及抑制浪涌用的产品,可选用较大的B值。因为随着温度的变化,B值大的产品其电阻值变化更大,也就是说NTC热敏电阻B值越大,使用时更灵敏,响应时间更快。
热敏电阻时间常数对于需要快速响应的任何应用都很重要 - 例如在防止过载等情况下。没有人能立即将温度从一个值升高到另一个值。它遵循渐近曲线。身体越大,温度升高所需的时间越长。因此,器件的时间常数对于某些应用来说是重要的热敏电阻规范。
热时间常数参数用希腊字母τ来表示,它定义为热敏电阻变为初始温度(t1)和瞄准温度(t2)之差的63.2%(即1:1 / e)所需的时间当热敏电阻没有消耗功率时,温度差作为阶跃变化施加。
出于测量目的,τ测量所需的温度; 即达到63.2%温差的阻力时间为:
这是热敏电阻的一个重要特征,因为所有热敏电阻都需要通过一些电流来运行包含它们的电路,才能致热敏电阻的自发热。
该热敏电阻规范定义了所施加的功率和热敏电阻自加热之间的关系。如果过多的电流通过热敏电阻,那么它将抵消热敏电阻的操作。因此,该规范控制可以通过设备的电流。耗散因子δ以mW /℃表示。
其中
P =功耗以瓦特为单位
ΔT=以°C为单位的温度上升
δ的特定值将对应于将热敏电阻温度提高1°C所需的功率水平。耗散因数取决于许多因素,因此耗散因数δ的热敏电阻规格实际上仅作为指导而非精确数字。
这是热敏电阻设计运行的温度范围。材料,结构和其他类似因素限制了设备可以操作的范围。因此,为了可靠性和性能,热敏电阻不应在其指定的温度范围之外操作。
对于传感应用,功耗保持较低以防止自发热,但在某些情况下可能有理由消耗更多功率。如果不导致损坏,则不应超过最大功耗规范。为了获得最大的可靠性,器件应在其最大功耗范围内运行良好 - 通常仅为规格的50-66%。
基本上这些事主要的参数,可能还有其他一些参数
依然以 MF52 系列测温型 NTC 热敏电阻器规格书为例,可以看到此款NTC的主要参数R25、B值等
阻值是有一定误差的,电阻的精度温度精度以及温度对应的阻值都有体现,我们可以根据这个表格来编写代码,获取相应的温度
硬件设计比较简单,如图所示:
如何由硬件电路设计得到我们想要的温度呢?
首先我们需要用到ADC采集相关电压,根据电压计算得出相应的阻值,进一步,根据温度、阻值对照表得出温度:
假设我们使用的是MCU内部ADC,12位分辨率
1、计算采集点电压
V_diodetem = Vref*Vtemp/(1<<12)
其中:V_diodetem为采集点电压
Vref为参考电压,此处为3.3V
Vtemp为ADC获取到的寄存器值
(1<<12)为12位分辨率,2^12=4096
2、根据电阻反推RTC有效阻值
根据分压计算:
Vdiodetem/Vref = Rntc/(Rntc+R)
化简之后可得:
Rntc = R*Vtemp/((1<<12)-Vtemp)
其中,Rntc为NTC的有效阻值
R为串联电阻阻值
根据以上公司就可以计算得出相应的阻值了,再根据温度-阻值对照表就可以反推出温度值了
首先我们需要建立一个表格,用于存储我们的阻值,用于查表寻找温度,表格就设计为简单一维数组模式,-40-105度,如下表,我们就构建完成了阻值跟温度的对应,只需要通过ADC获取阻值,查表获取温度即可
#define NUMBER_NTC_TEMP 145
const uint16 NTC_MAP[NUMBER_NTC_TEMP] =
{
/*10R*/
19572, 18459, 17422, 16455, 15551, 14707, 13917,13176, 12481, 11829, //-40 ~ -31
11216, 10640,10098, 9588, 9107, 8654, 8227, 7823, 7442, 7082, //-30 ~ -21
6742, 6420, 6116, 5828, 5556, 5298, 5053, 4821, 4601, 4393, //-20 ~ -11
4195, 4010, 3830, 3660, 3500, 3347, 3201, 3064, 2933, 2808, //-10 ~ -1
2696, 2576, 2468, 2366, 2268, 2175, 2086,2002, 1921, 1844, //0 ~ 9
1773, 1700, 1633, 1570, 1509, 1450, 1395, 1341, 1290, 1241, //10-19
1195, 1150, 1107, 1067, 1027, 990, 953, 918, 885, 852, //20-29
821, 792, 764, 737, 710, 685, 661, 638, 616, 595, //30-39
575, 555, 536,518, 500, 484, 468, 452, 438, 423, //40-49
409, 396, 383, 371, 359, 348, 337, 326, 316, 306, //50-59
297,288,279,270,262,254,247,239,232,225, //60-69
219,212,206,200,194,189,183,178,173,170, //70-79
163,159,154,150,146,141,138,134,130,127, //80-89
123,120,117,114,111,108,102,105,102,100,98, //90-99
95,93,90,88,86,84//100-105
}
ADC获取电阻值:
根据上面的计算公式,计算得出NTC电阻值R,用于下面的根据阻值获取温度
如下代码通过阻值获取温度,要注意我们是从-40度开始的,但是index是从0开始的,所以要记得 -40,获取到真正的温度
//通过阻值获取温度
uint8 Get_Temp_By_Res(uint16 R)
{
uint8 i = 0;
for (i = 0; i < 145; i++)
{
if (R >= NTC_MAP[i])
break;
}
return i;
}
欢迎关注小飞哥玩嵌入式,一起解锁更多嵌入式相关的开发知识