ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MLX90640 红外热成像传感器测温模块开发笔记(三)

2022-07-21 13:34:51  阅读:109  来源: 互联网

标签:测温 测量 像素 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 消耗,较低的效率。

成果展示

标签:测温,测量,像素,MLX90640,修改,参数,寄存器,红外热
来源: https://www.cnblogs.com/wenkon/p/16501569.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有