- 作者:
- 分类:知识&开发->开发板&模块->摄像头
- 阅读:7552
- 点赞:39
- 版权:CC BY-SA 4.0
- 创建:2019-11-01
- 更新:2020-02-26
原文链接(持续更新):https://neucrack.com/p/199
官网: http://www.heimannsensor.com
器件型号
不同的型号有不同的含义,手册中有详细说明,比如HTPA32x32dR1L5.0/0.5F7.7eHiC
,
代表了: 分辨率32x32
,带有数字输出的版本号为1,5mm
焦距,光圈0.8
, 滤波特性F7.7(μm, bandpass), 带有外部光圈,高灵敏度,带有保存在eeprom
的校准数据
专业词汇
dK: DeciK, 十分之一开尔文, 比如
2731.5dK = 273.15K = 0℃
, 在线转换器: calculand.comPTAT: (proportional to absolute temperature,与绝对温度成正比)
驱动
驱动流程
这里是主要的流程,具体每一步的计算及其公式需要仔细阅读手册或看示例代码
- 扫描器件
初始化:
- 从
eeprom
读取校准数据 - 计算 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
的表
通信
通信方式: IIC 通信
地址: 两个地址,
0x1A
和0x50
, 一个是用来发送命令和读取数据,另一个是用来读取内部eeprom
- 速度: 读取
eeprom
最高支持400KHz
, 读写传感器最高支持1MHz
数据分为上下两部分,这两部分是同时测量的,每个部分又分为4个块,这4个块需要分别发送命令启动测量,也就是要获得一个完整的图片需要启动4次测量
设置0x01
寄存器的blind位, VDD_MEAS
位设置被传输的值是PTAT
还是VDD
,来获取电子补偿,比如写值0x0f
到寄存器0x01
, 然后读取0x0A
,读取共258
个字节,然后同样是0x0B
258
个字节,注意必须一次性读完258个字节.
要十分注意得到的数据实际在传感器的哪个位置,具体的一定要仔细阅读手册
比如第一次读到[0,31]
以及[992,1023]
,而不是[0,31]
和[512,543]
实际数据示例
- 采集到的像素值
获取到的值如果直接显示会发现毫无规律的样子,如图:
- 从
eeprom
读取的数据计算得出的pix_c
- 温度校准后
- 电子校准
- 然后经过
vdd
和 灵敏度校准,最后查表和转换单位得到温度
得到的图像:
放大到240x240
:
调试过程中容易遇到的问题
- 数据读取顺序以及最终储存到内存的顺序
- 高低位(
MSB
还是LSB
),eeprom
都是LSB
, 传感器是MSB
- 查表需要弄清需要哪个表(根据
TN(table number)
) - 数据比较大,在内存不大的单片机驱动时注意内存的使用,如果内存重复使用,一定要注意别把后面需要用到的数据给覆盖了
- 数据可以参考官方给的数据和我的截图,对比分析
- 配置一定要使用
eeprom
中读出来的校准时用的配置
关于提高帧率
对于这款32x32的传感器,按照出厂校准时的参数,可以达到8帧左右的输出,加上计算,大概7帧多一点.
主要时间花费在采集electrical_offset
和pixels
两个过程,以I2C
频率为1MHz
为例,前者大概需要30ms
,后者大概需要120ms
.
这其中,VDD
的值和PTAT
的值还是在两次采集pixels
的过程中分别一起采集的,也就是说一次VDD/PTAT
的值要给两次数据用,或者使用某种算法进行融合也可以, 同样,如果electrical_offset
也每隔一次pixels
采集一次,理论上也可以减少15ms
左右的时间.