1、什么是温度传感器
温度传感器是指能感受温度并转换成电信号输出的传感器。在日常生活以及各个行业的应用场景中都需要用到温度传感器。温度传感器通常由温度感测元件和信号处理电路组成。
温度感测元件用于测量环境或物体的温度,比如热敏电阻、热电偶、红外温度传感器等。上图是一个汽车水箱的水温传感器示意图,图中左侧它的温度感测元件是一个热敏电阻,发动机温度的变化将导致热敏电阻值的变化,这个变化被发动机控制单元电路检测到后,再将这个电信号处理转换成温度值显示以及进行相应的处理。
2、温度传感器是如何工作的
其工作原理主要是基于材料的温度特性。当温度发生变化时,感温元件内部的电阻或电势也会发生变化,从而导致输出电信号的变化,这个电信号的变化由微控制器或其他设备读取处理后就可以表示出当前测试出来的温度。
我们还是以发动机冷却液的温度传感器来说明,当发动机温度升高时,由于热敏电阻的负温度特性,其电阻变小,流过的电流变大, 控制单元电路检测到电流的增大,将其转换显示为温度值的升高。
3、常见的温度传感器的种类
现代电子设备中最常使用的温度传感器有四种类型:热电偶、RTD(电阻温度检测器)、热敏电阻和基于半导体的集成电路 (IC)。
3.1 热电偶
热电偶(上图)是最常用的温度传感器类型,多用于各种工业、汽车和消费应用。具有无需供电,工作温度范围宽,响应速度快的特点。热电偶是热电传感器,它是由焊接或压接在一起的不同金属(例如铜和康铜)的两个接头组成。一个结保持在恒温,称为参考结或者冷结,而另一个为测量结,也叫热结。当两个结处于不同温度时,由于热电效应,会在参考结上产生电压差,测量此电压差就能计算出对应的温度。
3.2 电阻温度检测器RTD
任何金属的电阻会随着温度的变化而变化。电阻温度检测器RTD(上图),就是利用这个了原理. 它是一种特殊的电阻,其阻值会随着温度的升高而变大,随着温度的降低而减小,它主要用于-200—500℃温度范围内的温度测量。由于具有几乎线性的温度与电阻的关系,并且具有足够大的电阻温度系数,铂金是最常见也是最精确的用于制造 RTD 的材料。
3.3 热敏电阻
热敏电阻也是随温度变化的电阻(上图)。它和RTD的工作原理相同,但是制作材料不同,热敏电阻通常由陶瓷或聚合物材料制成,而RTD由纯金属制成。热敏电阻是高灵敏度和非线性的,而RTD相对不敏感但非常线性。因此,通常在高精度不重要的地方使用热敏电阻,而且由于其非线性。使用时需要进行校准。具有负温度系数的热敏电阻叫做(NTC),它们的电阻随着温度的升高而降低。具有正温度系数 的热敏电阻叫做(PTC)。比较常用的是NTC。
3.4 IC型温度传感器
IC 型温度传感器是利用晶体管的物理特性,比如CMOS管的PN结温度特性来制作的传感器。它具有集成度高,精度高,功耗低,响应快等优点。可广泛适用于工业、医疗、便携式设备、家用电器、可穿戴设备等方面。比如图6右边这款在分销商得捷电子网站上列出的这款微型温湿度传感器芯片,尺寸只有2毫米乘2毫米。
3.5 温度传感器特性对比
总结一下刚才介绍的四种常用温度传感器的特性对比,如上表所示。热电偶的应用温度范围最广,适合于极端温度的环境以及测试设备。热敏电阻具有快速响应高灵敏度,但是线性度差,适合吹风机,保护电路等应用。而RTD准确性最好,适合高精度测量。而芯片IC型温度传感器有良好的线性度以及支持数字接口,适合用于穿戴式设备场合。
3.6 红外温度传感器
另外从测量方式上还有非接触型的温度传感器,比如我们熟悉的红外测温计就是使用的红外辐射传感器来确定被测物体的温度。它通过检测物体放射出的红外辐射来确定其温度,因为物体的温度与其辐射的红外光谱有关。它可以使用TPIS 1S 1385 / 5029 这颗红外温度传感器来设计。
4、温度传感器实验演示
最后,我们来演示如何使用配备显示屏的树莓派读取温度传感器的数据并将结果显示出来。这里我们选用的是一款热敏电阻。树莓派MCU通过模拟接口读取到的数字进行数字化处理后,在显示屏上直观地显示出来。
主控板卡:基于RP2040的带屏调试助手
以下是主程序中对于温度传感器数据的获取代码示例。
from breakout_colourlcd240x240 import BreakoutColourLCD240x240
from machine import ADC, Pin, Timer, PWM
from utime import sleep
import time, math,array
#------------------------------------------------------------------
width = BreakoutColourLCD240x240.WIDTH
height = BreakoutColourLCD240x240.HEIGHT
display_buffer = bytearray(width * height*2)
display = BreakoutColourLCD240x240(display_buffer)
timer1 = Timer()
stemp = ADC(2)
current_temp = 0
#-------------------------------------------------------------------
def display_init():
display.set_pen(0,255,0)
display.rectangle(58,30,13,160)
display.circle(64,190,10)
display.set_pen(255,0,0)
display.text("current", 150, 20, 194, 2)
display.text("temp", 150, 35, 194, 2)
display.update()
for i in range(6):
display.set_pen(0,200,0)
display.pixel_span(80,27 + i*30,10)
display.text(str(50 - i *10), 100, 20+i*30, 194, 2)
display.set_pen(0,0,220)
if i < 5:
for j in range(4):
display.pixel_span(80,33 + j*6 + i * 30,5)
display.update()
#---------------------------------------------------------------------
def display_change(temp, color):
global current_temp
current_temp = temp
#print(temp)
display.set_pen(color[0], color[1], color[2])
display.rectangle(58,30,13,160)
display.circle(64,190,10)
display.set_pen(0,0,150)
display.rectangle(58,20,13,7+int((50-temp)/2)*6)
display.set_pen(0,0,0)
display.rectangle(150,50,90,40)
display.set_pen(0,255,0)
display.text(str(temp), 150, 50, 5, 5)
display.update()
#----------------------------------------------------------------------
#温度获取
def get_temp():
Analogvalue=stemp.read_u16()
voltage=100*float(Analogvalue)/65535
return voltage
#----------------------------------------------------------------------
def main():
color = [0,255,0]
timer1 = Timer()
display_init()
timer1.init(freq=5,mode=Timer.PERIODIC, callback=lambda t:display_change(round(get_temp(),1), color))
while True:
sleep(0.1)
main()