MLX90640开发笔记(三)工作流程和操作MLX90640的一般步骤

默认参数时,MLX90640的工作流程如下:

(1)上电,内部初始化(约40ms)

(2)读取工作参数到控制和状态寄存器

(3)开始以2Hz的速率测量实时数据并更新到RAM,自动更新状态寄存器。

 

测量帧解释:

MLX90640共有768个测量像素点,每次测量其中的一半,称为1帧,故此完成768像素需要测量2帧,用帧0和帧1来表示。即:所谓的1帧数据其实是完整像素的一半。

 

可以修改的参数有以下几个方面:

  • 自动测量:默认为自动测量,即自动循环测量帧0和帧1更新到RAM中。与其对应的是手动测量,即:用指令来控制测量帧0还是帧1。手动测量已经在官方的数据手册中被删除,看来MLX也不喜欢别人用,所以我们也就别用了。自动测量保持默认值,不要改就好。
  • 帧分布:前面已经说了,1帧实际上是测量完成了一半的像素点,这一半像素有两种分布模式,手册上称为TV模式和Chess模式,TV模式以行为单位,是指每帧只测量奇数行或者偶数行,Chess模式是指以像素为单位,每次交错着像素测384个像素点。我们可以称之为“行交错模式”和“像素交错模式”。

在这方面,手册上又说了,出厂时是以Chess模式校准的,具有最好的精度(言下之意就是说如果修改为了TV模式时会不准),鉴于此,这个参数也不要动。

  • 测量分辨率:可选的有16~19位AD转换精度,默认是18位,转换位数当然是越高越好了,但18和19位经过测试也没有发现有什么实际区别,这个参数可改可不改。
  • 测量速率:每秒测量几帧数据,这个参数很有用处,毕竟我们希望成像后是连续的动画,每秒2次一定是不好的,我们可以调用API将这个参数修改为8Hz或者16Hz甚至32Hz,64Hz是不建议的,因为测量速率太快时噪声特别大,图像特别乱。普通相机的刷新速率也就15Hz左右,所以建议最高设置为16Hz吧。

所以,虽然数据手册上写的感觉好像可修改的参数挺多,这么一分析,其实只有1个测量速率是有用处的,其它都是浮云(鸡肋)。

 

参数修改方法讨论:

有两种修改方法,修改寄存器和修改EEPROM。

(1)修改寄存器(推荐)

传感器上电后会自动从EEPROM读取参数到寄存器,寄存器内的参数值是运行时实际执行的参数,直接通过I2C修改寄存器值即可,随用随改、立即生效。寄存器的值是掉电遗失的,所以每次上电后都要修改一次。

(2)修改EEPROM

EEPROM是掉电不丢失的,所以修改EEPROM内的运行参数只需要一次,下次启动生效。但EEPROM内存储的不仅只是同步到运行寄存器的几个参数,大部分的是768个像素的校准参数,这些参数是出厂时写入的,特别重要,所以我的建议还是不要对EEPROM有任何的写操作,以免发生意外,EEPROM里的像素校正参数一旦被意外修改就再也找不回来了。

 

MLX90640底层驱动Keil项目(STC单片机)下载:

https://download.csdn.net/download/xulikai/11845558

 

建议的操作流程

unsigned short EE[832];

unsigned short Frame[834];

paramsMLX90640 MLXPars;

float Vdd,Ta,Tr;

float Temp[768];

 

IIC_Init();                                               //I2C初始化

MLX90640_I2CInit();                          //MLX传感器初始化

Delay_ms(50);                                      //预留一点时间让MLX传感器完成自己的初始化

MLX90640_SetRefreshRate(0);       //测量速率1Hz(0~7对应0.5,1,2,4,8,16,32,64Hz)

 

MLX90640_I2CRead(0x2400, 832, EE);                     //读取像素校正参数

MLX90640_ExtractParameters(EE, &MLXPars);    //解析校正参数(计算温度时需要)

 

while (1)

{

         Delay_ms(5);

         if (MLX90640_GetFrameData(Frame)==0)      //有转换完成的帧

         {

                   Vdd=MLX90640_GetVdd(Frame, MLXPars);   //计算Vdd(这句可有可无)

                   Ta=MLX90640_GetTa(Frame, MLXPars);                  //计算实时外壳温度

                   Tr=Ta-8.0;         //计算环境温度用于温度补偿

//手册上说的环境温度可以用外壳温度-8℃

MLX90640_CalculateTo(Frame, MLXPars, 0.95, Tr, Temp);    //计算像素点温度

/*

         Temp数组内即是转换完成的实时温度值,单位℃

         可以在这里对得到的32*24=768个温度值进行处理、转换为颜色值、显示

         关于温度转颜色方法,在后续的文章中会有专门介绍

*/

}

}

一点疑问:校正参数存储于传感器内部的EEPROM,实时数据也来自传感器,如何利用实时数据和校正参数计算温度的方法也是事先规定好的,MLX为什么不直接在内部完成这个温度计算让用户直接读取温度值?为了体现这个传感器的复杂性或者是让用户有成就感吗?

本来可以在传感器内部解决的问题被厂家要求在外部完成,对MCU的性能要求是特别高的,大量的浮点运算,大量的RAM消耗,较低的效率。

 

MLX90640开发笔记(一)概述及开发资料准备
MLX90640开发笔记(二)API移植-I2C和关键接口函数
MLX90640开发笔记(三)工作流程和操作MLX90640的一般步骤
MLX90640开发笔记(四)损坏和不良像素的处理
MLX90640开发笔记(五)阵列插值处理-多项式插值由32*24像素到512*384像素
MLX90640开发笔记(六)红外图像伪彩色编码
MLX90640开发笔记(七)小结-注意事项
MLX90640开发笔记(八)扩展知识-辐射率、灵敏度、精度、探测距离
MLX90640开发笔记(九)EEPROM、RAM、寄存器说明
MLX90640开发笔记(十)成果展示-红眼睛相机

邮箱:[email protected]

你可能感兴趣的:(红外成像,MLX90640)