传感器初识
2020年伊始,一场疫情让国人的年过得心惊胆战,随之而来的就是口罩紧缺,消杀药品遭疯抢。相信作为电子行业的朋友都能看到:复工刚开始各种测温设备、测温相关的传感器、芯片价格暴涨。本文主要介绍用于热成像的传感器德国海曼的HTPA 32x32d,希望能帮助正在研发热成像设备的企业或者个人,能快速了解和上手这个传感器。这篇文章是第一篇,后续还有介绍PCB板设计、器件驱动,数据读取和计算,上位机开发等篇章陆续发表。
专业词汇
K: 开尔文,温度单位, 273.15K = 0℃ 更多看单位介绍 , 维基
dK: DeciK, 十分之一开尔文, 比如2731.5dK = 273.15K = 0℃, 在线转换器: calculand.com
PTAT: (proportional to absolute temperature,与绝对温度成正比)
器件对比
在说海曼这个传感器之前,我们先对另一个厂商的传感器做一点介绍,这就是迈来芯公司的MLX90640传感器,为什么要说这个传感器呢,如果您是正在开发这个传感器的开发人员答案应该不用我说了,这个芯片在国内已经买不到了,而原因是他的价格相对较低,并且API做的很好,非常容易上手,厂家提供了一套完整的API函数库,包含了读取、校准,计算,坏点的处理等一系列操作函数,无论您用的是何种单片机平台,只需要稍微修改一下就可以方便地移植到想要的平台上。
先来一张图片直观的对比下两个器件的电气特性:
图像像素不同 ,HTPA32x32d是3232的分辨率、MLX90640是3224的分辨率;
工作电流不同 ,HTPA32x32d功耗更低;
视场角度不同, HTPA32x32d可以选择的角度更多,博主用的是33°的;
时钟频率不同 ,MLX90640的频率更高,并且固定为38MHz,这意味着相同的ADC位数,MLX90640的转换速度可能更快,相应的图像刷新率应该可以更高;
测温范围不同 ;
ADC分辨率不同 ,MLX90640可以配置到19bit;
数据读取模式不同 这个是简单来说就是读取数据的顺序不同,HTPA32x32d是块读取模式,后面会详细介绍,它内部有8个块,分为顶层4块和底层4块;而MLX90640是电视模式和棋盘模式读取,或者叫隔行读取和隔点读取,厂商推荐的是隔点读取。
他们的相同点就是都是IIC接口的通信接口。
器件型号
不同的型号有不同的含义,手册中有详细说明,比如HTPA32x32dR1L5.0/0.85F7.7eHiC,
代表了: 分辨率32x32,带有数字输出的版本号为1,5mm焦距,光圈0.85, 滤波特性F7.7(μm, bandpass), 带有外部光圈,高灵敏度,带有保存在eeprom的校准数据。
操作流程
这里是主要的流程,具体每一步的计算及其公式需要仔细阅读手册或看示例代码
器件初始化,首先初始化IIC接口,博主用的是STM32,最好是用软件模拟IIC总线,因为调试过程中硬件IIC总线也调试好了,但是出了一些诡异的问题,不敢用了;可以用其他IIC器件试过的驱动程序,通过读或者写内部寄存器看看传感器有没有回复。
从eeprom读取校准数据,EEPROM是第三方公司提供的24AA64 , 集成在传感器内部。共8K byte。其实你可以看做是两个器件,一个是传感器,一个是EEPROM存储器,需要注意的是他们的通信时钟频率不同,传感器最大可以到1MHz,EEPROM最大只能到400KHz。
计算 pix_c 的值
可以根据读到的出厂校准使用的参数来初始化传感器,如果不使用校准时使用的值出来的数据可能会不准
设置blind位,启动转换,读取 electrical_offsets, 分为上下部共256个uint16 值, 注意下部的顺序
不设置blind位,启动转换,读取像素值,上下两部分,共1024个int16值,注意下部的顺序; 以及同时获取到ptats共 8个uint16。
获取VDD值,上下部,共8个uint16值.
这里需要注意的是由于vdd和ptats的值都是伴随像素值的读取同时一次读取出来的, 所以为了加快帧率,实际上不必为了读这两种数据而启动两次转换,而是在两次读取像素值中,一次读取vdd,一次读取ptats,这样可以增加一倍的读取速率。
热量补偿: 根据 ptats和eeprom读出的校准数据计算得到新的像素值2
电子补偿: 根据获取到的 electrical_offsets 校准得到新的像素值3, 经过这一步数值(的绝对值)就会变得比较小了
电压补偿: 根据获得的VDD值以及eeprom读取到的数据校准得到新的像素值4
灵敏度补偿: 根据 eeprom 读取到的数据和设定的灵敏系数(PCSCALEVAL(10^8))得到新的像素值5
根据厂商提供的表,转换得到温度值,单位是dK, 将其转换成摄氏度即可,厂商会提供很多型号的表,当前传感器具体使用哪个表可以读取eeprom的TN(table number)值, 然后使用对应的table number的表。
注意块读取顺序:不是我们想的那样按顺序读取,要十分注意得到的数据实际在传感器的哪个位置,具体的一定要仔细阅读手册,比如第一次读到[0,31]以及[992,1023],而不是[0,31]和[512,543]。
调试过程中容易遇到的坑(画重点!!少走弯路)
注意数据读取顺序以及最终储存到内存的顺序,eeprom和传感器的读取字节序是反的
查表需要弄清需要哪个表(根据TN(table number)),每个型号不一样,博主的表号是113,十六进制0x71。
数据比较大,在内存不大的单片机驱动时注意内存的使用,如果内存重复使用,一定要注意别把后面需要用到的数据给覆盖了,牺牲空间可以提高性能。
配置一定要使用eeprom中读出来的校准时用的配置,至少在调试阶段是这样,后面玩溜了就随您的便了。
结束
读完本文,您一定对这个传感器了解个大概了,当然想要驱动这个器件工作,肯定要把芯片手册读透的,下一篇文章我们介绍如何读取这个传感器内部的EEPROM以及怎么来解析内部的数据,敬请期待。
————————————————
版权声明:本文为CSDN博主「uutotoyang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ganxiaoyagn000/article/details/104835127