默认参数时,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开发笔记(十)成果展示-红眼睛相机
邮箱:INFO@GEO-INS.COM