MLX90640 红外热成像传感器测温模块开发笔记(三)
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 单片机)下载
建议的操作流程
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 消耗,较低的效率。
成果展示