目前额温枪这个东西特别火,所以大家都在搞这个事情,那我也来蹭个热度吧。
大概的工作原理:
热电堆传感器->ADC->MCU->LCD显示。
其实原理很简单,那比较麻烦的事情就是温度补偿和校准的事情了。这个需要太多专业仪器,繁琐,这里不多说。
那其实简而言之,就是传感器,ADC采集出来之后运算,就得到了温度。那从传感器采集到的数据是什么呢?现在大部分用的都是热电堆传感器,这种传感器检测到红外热射信号后,会将该信号转换成模拟数据传出来。传出的信号有2种信号,一种是热敏电阻NTC,另一种是热电堆电压。只要有这两个数据,就能推算出温度。
这里可以推算出来的温度一共有两种,一种是环境温度,一种是物体表面温度。环境温度主要通过热敏电阻NTC的值来算,表面温度主要根据环境温度和热电堆电压来算。那怎么算呢?
首先,ADC采集到热敏电阻NTC的值后,这时候需要去查V-T表。这个表一般是传感器厂家提供的。就是热敏电阻值和温度的对照表。如下
左边是温度,对应右边热电堆的电阻值。所以ADC采集到热电堆电阻值后可以根据这个表来反推到温度,这个温度就是环境温度。当如,采集出来的电阻不可能说刚好是表上的值,比如23度对应106.9320,24度对应104.5436.那如果采集出来的值在这个之间,那肯定不能近似等于23度或24度。这里需要根据这4个值做一个计算。这个热电堆电阻的变化曲线随温度变化近似为一次函数,如下:
可以简单理解为一次函数,2个点的坐标就能求出这两个点上的所有点。这就是算法需要做的。这个算法在文章会附上。那只要我们得到热电堆电阻,然后查表查出在哪个区间,保留这个区间的4个数值,就可以计算到热电堆值对应的具体温度。当然,精度根据算法来。本算法只保留小数点后1位,也就是说只精确到0.1。
热电堆查表算法如下:
uint16_t gst_algorithm_get_T_from_R_T(uint16_t input_r)
{
uint8_t xdata i = 0;
uint16_t xdata rst = 0,temp1 = 0,temp2 = 0;
if(input_r > temp_form_R_T[0]) //不在区间
return OVERFLOW_RETURN_L;
else if(input_r < temp_form_R_T[43])
return OVERFLOW_RETURN_H;
for(i = 0;i < 43;i++)
{
if(input_r == temp_form_R_T[i])
{
return i*10;
}
else if(input_r == temp_form_R_T[43])
{
return 43*10;
}
else if((input_r < temp_form_R_T[i]) && (input_r >
temp_form_R_T[i+1])) //找到对应区间
{
rst = (((i+1+32)*temp_form_R_T[i] - (i+32)*temp_form_R_T[i+1] -
input_r) * 10) / (temp_form_R_T[i] - temp_form_R_T[i+1]);
return rst;
}
}
return 0;
}
这里只测量温度从0-43度之间,超过该范围则认为是异常值,不做处理。temp_form_R_T数组就是存储的热电堆的电阻值,从0-43,共44个数。这里所有的电阻值扩大了100倍,方便计算。毕竟MCU最好不要运算浮点,比较慢。
同样的,热电堆电压值也根据同样的方式计算,就能得到目标的温度。