德国海曼HTPA 32x32d热成像传感器代替MLX90640之传感器数据读取和计算

传感器数据读取和计算

之前的文章我们简单介绍了热成像传感器德国海曼的HTPA 32x32d的EEPROM数据读取和解析,本文主要进一步介绍传感器数据读取,最终通过五大步计算和校准得到我们想要的32x32分辨率的图像。

传感器主要寄存器

传感器里面包含了3个只读传感器和8个只写传感器。其中TRIM_REGISTER1 到TRIM_REGISTER7 我们可以直接用EEPROM里面存储的设置参数来对传感器进行初始化就可以了;STATUS_REGISTER 是状态寄存器,通过查询该寄存器的EOC比特位可以知道上一次AD转换是否完成,如果EOC为1表示上一次转换完成了,这时候可以去读取TOP_HALF 和BOTTOM_HALF 寄存器,可以每次读取出258byte。

// write only
#define CONFIGURATION_REGISTER  0x01
#define TRIM_REGISTER1          0x03
#define TRIM_REGISTER2          0x04
#define TRIM_REGISTER3          0x05
#define TRIM_REGISTER4          0x06
#define TRIM_REGISTER5          0x07
#define TRIM_REGISTER6          0x08
#define TRIM_REGISTER7          0x09
// read only
#define STATUS_REGISTER         0x02
#define TOP_HALF                0x0A
#define BOTTOM_HALF             0x0B

在这里插入图片描述
传感器第一个寄存器CONFIGURATION_REGISTER是一个只写寄存器,也是这次重点讲解的寄存器,可以看到里面的比特位表示不同含义:
1、WAKEUP:这个位时用来开关传感器的,貌似通过设置该位可以达到低功耗的目的,还没试过,有待研究,尝试过得朋友可以交流下。
2、START:启动和关闭转换,如果不需要图像了,可以设置该位为0,让传感器进入到空闲模式,但是空闲模式不是最低功耗的,这个需要注意,最低功耗因该是睡眠模式。
3、BLOCK:用来设置进行哪一个块的转换,一共4个块,每次能转换一个块,他们分别在顶层和底层。
4、BLIND:用来设置所有的像素关闭的,这个很好理解,这个在测量电子偏移量的时候会用到,就是在像素关闭的情况下进行测量,这个值就是电子偏移量。
5、VDD_MEAS:用于设置是进行VDD的测量还是PTAT的测量。

采样流程

读取流程好像不止一种,常规的读法是:
1、配置控制寄存器进行BLOCK0的PTAT的转换:设置为0x09

 // --- BLOCK 0 with PTAT ---
 // change block in configuration register (to block0)
 // |  7  |  6  |  5  |  4  |   3   |    2     |   1   |    0   |
 // |    RFU    |   Block   | Start | VDD_MEAS | BLIND | WAKEUP |
 // |  0  |  0  |  0  |  0  |   1   |    0     |   0   |    1   |

2、读取顶层和底层的数据块
3、同理依次进行BLOCK1、BLOCK2、BLOCK3的PTAT的转换:设置为0x19 、 0x29 、 0x39
4、配置控制寄存器进行BLOCK0的VDD的转换:设置为0x0D

// --- BLOCK 0 with VDD --
 // change block in configuration register (to block0)
 // |  7  |  6  |  5  |  4  |   3   |    2     |   1   |    0   |
 // |    RFU    |   Block   | Start | VDD_MEAS | BLIND | WAKEUP |
 // |  0  |  0  |  0  |  0  |   1   |    1     |   0   |    1   |

5、读取顶层和底层的数据块
6、同理依次进行BLOCK1、BLOCK2、BLOCK3的VDD的转换:设置为0x1D 、 0x2D 、 0x3D
7、配置控制寄存器进行ELE OFFSET的转换:设置为0x0B

  // --- EL.OFFSET ---
  // change block in configuration register (to block0)
  // |  7  |  6  |  5  |  4  |   3   |    2     |   1   |    0   |
  // |    RFU    |   Block   | Start | VDD_MEAS | BLIND | WAKEUP |
  // |  0  |  0  |  0  |  0  |   1   |    0     |   1   |    1   |

8、读取转换好的电子偏移值。
注意:以上每次启动转换和每次读取是配对进行的,先启动一次转换紧接着是一次读取,这个顺序不能乱,但是各个启动转换和读取流程可以任意交换顺序。

数据分类

因为传感器内部的像素顺序不是我们一般认为的从左到右,从上到下的方式排列,所以读取后的块数据要经过重新的排列,最终形成一个32x32的原始像素二维数组。
由于数组data_top_block0[0]和data_top_block0[1]存放着VDD和PTAT的值,所以我们从data_top_block0[2]开始取数据。

for (int n = 0; n < NUMBER_COL; n++) 
{
   // --- PIXEL DATA TOP HALF ---
   // block 0
   data_pixel[0][n] = data_top_block0[2 * n + 2] << 8 | data_top_block0[2 * n + 3];       //后面像素值排列方法同理
}

PTAT和VDD由8个block的平均值得来,环境温度ambient_temperature根据系数ptatgr_float和偏移量ptatoff_float得到,他们的计算方法如下:

  // calculate ptat average (datasheet, chapter: 11.1 Ambient Temperature )
  sum = ptat_top_block0 + ptat_top_block1 + ptat_top_block2 + ptat_top_block3 + ptat_bottom_block0 + ptat_bottom_block1 + ptat_bottom_block2 + ptat_bottom_block3;
  ptat_av_uint16 = sum / 8;

  // calculate ambient_temperature (datasheet, chapter: 11.1 Ambient Temperature )
  ambient_temperature = ptat_av_uint16 * ptatgr_float + ptatoff_float;

  // calculate vdd average (datasheet, chapter: 11.4 Vdd Compensation )
  sum = vdd_top_block0 + vdd_top_block1 + vdd_top_block2 + vdd_top_block3 + vdd_bottom_block0 + vdd_bottom_block1 + vdd_bottom_block2 + vdd_bottom_block3;
  vdd_av_uint16 = sum / 8;

像素的计算和校准

1、原始像素:经过上面的数据分类可以得到原始的像素值1。
2、热量补偿: 根据 ptats和eeprom读出的校准数据计算得到新的像素值2。
3、电子补偿: 根据获取到的 electrical_offsets 校准得到新的像素值3, 经过这一步数值(的绝对值)就会变得比较小了。
4、电压补偿: 根据获得的VDD值以及eeprom读取到的数据校准得到新的像素值4。
5、灵敏度补偿: 根据 eeprom 读取到的数据和设定的灵敏系数(PCSCALEVAL(10^8))得到新的像素值5,(厂商会提供很多型号的表,当前传感器具体使用哪个表可以读取eeprom的TN(table number)值, 然后使用对应的table number的表)。
6、根据厂商提供的表转换得到的温度值,单位是dK, 将其转换成我们熟悉的摄氏度即可。

最激动人心的时刻到了,我们把最终校准得到的图像导入Excel工具中,为了更直观的显示图像,我们先把每个格子设置到长宽一致,然后使用一个叫色阶的功能对各个像素值进行量化。就得到下面的图像了。
在这里插入图片描述

坏点和不良点的处理

坏点和不良点的处理主要用到EEPROM里存放的坏点地址和掩码,基本方法是邻域平均法,通过地址和掩码查找到坏点的坐标和他们的“邻居”,他的值由他的“邻居”取平均值得到。

其他算法

产生了完整的一帧图像以后,我们可以对图像进行一些处理,比如高斯模糊等,或者稍微简单的邻域平均算法使得图像变得更加平滑一些,下面是两张图片的对比,第一张是校准后原始的图像,第二张是使用了平滑处理后的图像。
在这里插入图片描述

结束

关于海曼HTPA 32x32d热成像传感器的文章到此就结束了,下一篇文章我们将用上位机呈现出计算出的图像!希望抛砖引玉能给做开发的工程师同行有点帮助,欢迎技术交流和讨论,这里有热成像相关的系列博客连接:

第一篇: HTPA 32x32d热成像传感器初识.
第二篇: HTPA 32x32d热成像传感器EEPROM数据读取和解析.
第三篇: HTPA 32x32d热成像传感器数据读取和计算.
第四篇: HTPA 32x32d热成像传感器Qt串口上位机开发.
在这里插入图片描述

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值