使用MLX90640自制红外热像仪(二):API函数的使用
前面一篇文章介绍了MLX90640的相关信息和API库的移植,接下来介绍一下API库中的函数,和使用方法。
首先给出API函数的调用顺序,再对每个用到的API函数做说明:
#define FPS2HZ 0x02
#define FPS4HZ 0x03
#define FPS8HZ 0x04
#define FPS16HZ 0x05
#define FPS32HZ 0x06#define MLX90640_ADDR 0x33
#define RefreshRate FPS4HZ
#define TA_SHIFT 8 //Default shift for MLX90640 in open airstatic uint16_t eeMLX90640[832];
static float mlx90640To[768];
uint16_t frame[834];
float emissivity=0.95;
int status;int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MLX90640_I2CInit();MLX90640_SetRefreshRate(MLX90640_ADDR, RefreshRate); //设置帧率MLX90640_SetChessMode(MLX90640_ADDR); //棋盘模式 paramsMLX90640 mlx90640;status = MLX90640_DumpEE(MLX90640_ADDR, eeMLX90640); //读取像素校正参数 if (status != 0) printf("\r\nload system parameters error with code:%d\r\n",status);status = MLX90640_ExtractParameters(eeMLX90640, &mlx90640); //解析校正参数if (status != 0) printf("\r\nParameter extraction failed with error code:%d\r\n",status);while (1){int status = MLX90640_GetFrameData(MLX90640_ADDR, frame); //读取一帧原始数据if (status < 0){//printf("GetFrame Error: %d\r\n",status);}float vdd = MLX90640_GetVdd(frame, &mlx90640); //计算 Vdd(这句可有可无)float Ta = MLX90640_GetTa(frame, &mlx90640); //计算实时外壳温度float tr = Ta - TA_SHIFT; //Reflected temperature based on the sensor ambient temperature//printf("vdd: %f Tr: %f\r\n",vdd,tr);MLX90640_CalculateTo(frame, &mlx90640, emissivity , tr, mlx90640To); //计算像素点温度MLX90640_BadPixelsCorrection(mlx90640.brokenPixels, mlx90640To, 1, &mlx90640); //坏点处理MLX90640_BadPixelsCorrection(mlx90640.outlierPixels, mlx90640To, 1, &mlx90640); //坏点处理printf("\r\n==========================IAMLIUBO MLX90640 WITH STM32 SWI2C EXAMPLE Github:github.com/imliubo==========================\r\n");for(int i = 0; i < 768; i++){if(i%32 == 0 && i != 0){printf("\r\n");}printf("%2.2f ",mlx90640To[i]);}printf("\r\n==========================IAMLIUB0 MLX90640 WITH STM32 SWI2C EXAMPLE Github:github.com/imliubo==========================\r\n");}
}
API函数介绍
1. 设置测量分辨率函数
int MLX90640_SetResolution(uint8_t slaveAddr, uint8_t resolution)
此函数用于设置 MLX90640 的测量分辨率值(0~3 表示分辨率为 16~19 位)。需要注意的是在下次重新上电时,此函数修改的值会自动恢复为默认值(即:此函数修改后不会保存,掉电即失)。返回 0 表示设置成功, -1 表示设备未应答, -2 表示重新读取后发现不是预期的值。
例如:
设置分辨率为 19 位: MLX90640_SetResolution(0x33,0x03);
2. 读取测量分辨率函数
int MLX90640_GetCurResolution (uint8_t slaveAddr)
此函数用于读取当前的测量分辨率(0~3),若此函数返回了-1 则表示读取失败。
3. 设置测量速率函数
int MLX90640_SetRefreshRate (uint8_t slaveAddr,uint8_t refreshRate)
此函数用于设置 MLX90640 的测量速率(即:每秒测量几帧数据),参数值可以是 0~7 代表 0.5、1、 2、 4、 8、 16、 32 和 64Hz。返回 0 表示设置成功, -1 表示设备未应答, -2 表示重新读取后发现不是预期的值。
例如:
设置为每秒测量 16 帧: MLX90640_SetRefreshRate (0x33,0x05);//5 的意思就是 16Hz
4. 读取测量分辨率函数
int MLX90640_GetRefreshRate (uint8_t slaveAddr)
此函数用于读取当前的测量速率值(0~7),若此函数返回了-1 则表示读取失败。
5. 读取完整实时数据
int MLX90640_GetSubPageNumber (uint16_t *frameData)
此函数用于读取一次完整的测量数据(832 个字),返回值表示当前帧是哪个子页(0 或 1)。
例如:
static int mlx90640Frame[834];
int subPage;
subPage = MLX90640_GetSubPageNumber(mlx90640Frame);
6. 设置子页模式为 TV
int MLX90640_SetInterleavedMode (uint8_t slaveAddr)
此函数用于设置测量分布模式为 TV 模式(行交错模式)。 返回 0 表示设置成功, -1 表示设备未应答, -2 表示重新读取后发现不是预期的值。
7. 设置子页模式为棋盘
int MLX90640_SetChessMode (uint8_t slaveAddr)
此函数用于设置测量分布模式为棋盘模式(像素交错模式)。 返回 0 表示设置成功, -1 表示设备未应答, -2 表示重新读取后发现不是预期的值。
8. 读取子页测量模式
int MLX90640_GetCurMode (uint8_t slaveAddr)
此函数用于读取当前的测量分布模式,返回 0 表示工作于 TV 模式,返回 1 表示工作于棋盘模式。
9. 读取全部校正参数
int MLX90640_DumpEE(uint8_t slaveAddr, uint16_t *eeData)
此函数用于读取保存于EEPROM内的全部832个字的温度计算校准数据,保存于eeData数组内。
例如:
static uint16_t eeMLX90640[832];
int status;
status = MLX90640_DumpEE (0x33, eeMLX90640); //eeMLX90640 数组内是读取得到的EEPROM 参数数据
10. 解析校正参数为计算参数
int MLX90640_ExtractParameters(uint16_t * eeData,paramsMLX90640 *mlx90640)
此函数用来将MLX90640_DumpEE函数读取的所有 EEPROM 数据解析到定义于 MLX90640_API.h 中的自定义结构体变量中,此变量特别重要,是完成各种计算的必需参数(以下简称“计算参数” )。当解析完成后,原来的 EEPROM 数据基本再没有意义了(可以根据需要释放,也可以不管)。此函数返回-7 表示提供的 EEPROM 参数错误。
例如:
static uint16_t eeMLX90640[832];
paramsMLX90640 mlx90640;
int status;
status = MLX90640_DumpEE (0x33, eeMLX90640);//将 EEPROM 数据读取到 eeMLX90640 数组中
status = MLX90640_ExtractParameters(eeMLX90640, &mlx90640);//将 eeMLX90640 数组中的数据解析计算参数变量中
11. 读取一帧计算用实时数据
int MLX90640_GetFrameData(uint8_t slaveAddr, uint16_t *frameData)
此函数用于读取完整的一帧实时测量数据。计算所需要的完整的一帧数据为 834 个字(包括 832个字 RAM 数据+控制寄存器+状态寄存器)。如果返回-1 表示 MLX90640 未应答, -8 表示读取异常(最可能的情况是读取速率太低了),若返回 0 或者 1 则表示读取到了刚刚测量完成的子页 0 或者子页 1(读取成功),此时参数 frameData 数组内即是 834 个字的实时数据。
例如:
static uint16_t mlx90640Frame[834];
int status;
status = MLX90640_GetFrameData (0x33, mlx90640Frame);
12. 计算 Vdd
float MLX90640_GetVdd(uint16_t *frameData,const paramsMLX90640 *params)
此函数用于计算并返回 Vdd 电压值。需要的参数说明如下:
- uint16_t *frameData:读取到的完整的一帧实时数据(MLX90640_GetFrameData得到的 834 个字的数组)
- const paramsMLX90640 *params:由EEPROM解析得到的自定义结构体变量(MLX90640_ExtractParameters函数计算得到的“计算参数” )
此函数的返回值是浮点数,单位为 V。若不是 3.3V 左右,则说明发生了较为严重的问题。
Vdd 在计算点阵温度时用做参考电压, 故此计算结果必须为实际电压, 否则无法得到正确的温度值。(Vdd 的值在MLX90640_CalculateTo 函数体中会用到)
例如:
为了得到 Vdd 电压值,需要如下步骤:
float vdd;
uint8_t slaveAddress;
static int eeMLX90640[832];
static int mlx90640Frame[834];
paramsMLX90640 mlx90640;
int status;
status = MLX90640_DumpEE (slaveAddress, eeMLX90640); //读取 EEPROM
status = MLX90640_ExtractParameters(eeMLX90640, &mlx90640); //由 EEPROM 计算得到计算参数
status = MLX90640_GetFrameData (0x33, mlx90640Frame); //读取一帧实时数据
vdd = MLX90640_GetVdd(mlx90640Frame, &mlx90640); //由计算参数和实时数据计算得到 Vdd
13. 计算 Ta
float MLX90640_GetTa(uint16_t *frameData,const paramsMLX90640 *params)
此函数计算得到 Ta(MLX90640 外壳温度)。
所需要的参数与 12 相同。
此函数的返回值是浮点数,单位为℃。若与环境温度相差甚远,则说明发生了较为严重的问题。
例如:
为了得到 Ta 温度值,需要如下步骤:
float Ta;
uint8_t slaveAddress;
static int eeMLX90640[832];
static int mlx90640Frame[834];
paramsMLX90640 mlx90640;
int status;
status = MLX90640_DumpEE (slaveAddress, eeMLX90640); //读取 EEPROM
status = MLX90640_ExtractParameters(eeMLX90640, &mlx90640); //由 EEPROM 计算得到计算参数
status = MLX90640_GetFrameData (0x33, mlx90640Frame); //读取一帧实时数据
Ta = MLX90640_GetTa(mlx90640Frame, &mlx90640); //由计算参数和实时数据计算得到 Ta
14. 计算物体绝对温度数据
void MLX90640_CalculateTo(uint16_t *frameData,const paramsMLX90640 *params,float emissivity, float tr,float *result)
此函数计算一帧温度值(768 像素点)。计算结果为浮点型,保存于 result 数组内。参数说明如下:
- uint16_t *frameData:读取到的一帧实时数据
- const paramsMLX90640 *params:由 EEPROM 计算得到的计算参数
- float emissivity:被测物体的辐射率(人体为 0.95,其它材料的辐射率请上网查)
- float tr:校正温度,一般取 Ta-8
- float *result:计算结果, 768 个浮点数
例如:
计算一帧刚刚读取到的实时数据为温度值,假设被测物体的辐射率为 0.95。
float emissivity = 0.95;
float Ta,tr;
unsigned char slaveAddress;
static uint16_t eeMLX90640[832];
static uint16_t mlx90640Frame[834];
paramsMLX90640 mlx90640;
static float mlx90640To[768];
int status;
status = MLX90640_DumpEE (slaveAddress, eeMLX90640);
status = MLX90640_ExtractParameters(eeMLX90640, &mlx90640);
status = MLX90640_GetFrameData (0x33, mlx90640Frame);
Ta= MLX90640_GetTa(mlx90640Frame, &mlx90640);
tr = Ta-8.0;
MLX90640_CalculateTo(mlx90640Frame, &mlx90640, emissivity, tr, mlx90640To)
计算完成后, mlx90640To 数组中保存的即是 768 个单位为℃温度值。
15. 计算热图像数据
void MLX90640_GetImage(uint16_t *frameData,const paramsMLX90640 *params,float *result)
此函数的功能与上一节计算温度几乎完全相同,不同点仅为计算结果中的数值没有规划为温度单位,而是一些仅有数值大小意义的数值,用这些数值大小来绘图是足够的,这个函数的优点就是速度要比计算温度要快很多(仅需要绘图而不关心绝对温度值时可以使用这个函数来计算完成)。
例如:
static uint16_t eeMLX90640[832];
static uint16_t mlx90640Frame[834];
paramsMLX90640 mlx90640;
static float mlx90640Image[768];
int status;
status = MLX90640_DumpEE (0x33, eeMLX90640);
status = MLX90640_ExtractParameters(eeMLX90640, &mlx90640);
status = MLX90640_GetFrameData (0x33, mlx90640Frame);
MLX90640_GetImage(mlx90640Frame, &mlx90640, mlx90640Image);
发射率(emissivity)
发射率(emissivity),这是物体的一种属性,根据材料的不同而不同,一般非金属(如塑料、油漆、皮革、纸张等)发射率通常为 0.95,常见物体发射率可以参考下图:
使用MLX90640自制红外热像仪(二):API函数的使用相关推荐
- 使用MLX90640自制红外热像仪(一):MLX90640介绍与API库移植
平时工作的时候会遇到如下场景: 新焊接好的板子,通电后发现电流异常,需要看下板子上哪里发热异常. 需要监控某个器件(比如三极管.MOS)的温度,以防过热烧掉. 测量温升. 因此需要一个红外热像 ...
- 使用MLX90640自制红外热像仪(三):图像插值、图像彩色编码
经过上一节,已经把MLX90640的32x24个像素点读出来了,可是使用32x24直接显示在屏幕上,显示区域显示太小了,于是就需要对图像就行放大. 图像插值 常见的插值算法可以分为两类:自适应 ...
- 使用MLX90640自制红外热像仪(四):stm32f103c8t6刷320x240分辨率屏的时间测试
要显示MLX90640的数据,需要每次把320*240个像素点全部刷新一次.现在来测试下stm32f103c8t6使用普通IO刷屏. 72M主频的stm32f103c8t6刷TFT,全屏一直刷新测试 ...
- Fluke TiX560 红外热像仪二次开发包
Fluke TiX560 红外热像仪 增加一项:提供定制的二次开发包 主要特性 适用于 320x240 红外热像仪的 5.7 英寸感应液晶触摸屏 用于拍取难以拍摄的镜头的 240° 铰接式镜头 320 ...
- 热像仪 二次开发 c++_一种全新的红外热像仪——“可编程红外热像仪”
如 今,红外热像仪对于很多人而言已经不是一个新鲜事物了,它利用红外探测器对被测目标的红外辐射进行探测,并加以光电转换和信号处理等手段,将被测目标的温度分布转换为我们人眼可以直观识别的图像.受益于这种温 ...
- 福禄克FLUKE 重磅发布两款红外热像仪— TiS55+和TiS75+
美国福禄克公司于2021年1月重磅发布两款红外热像仪--TiS55+和TiS75+. 作为福禄克优选系列热像仪中的拳头产品,TiS55+和TiS75+在传承福禄克仪器高品质的同时,也在硬件方面做了许多 ...
- 美国福禄克公司于2021年1月重磅发布两款红外热像仪——TiS55+和TiS75+
美国福禄克公司于2021年1月重磅发布两款红外热像仪--TiS55+和TiS75+. 作为福禄克优选系列热像仪中的拳头产品,TiS55+和75+在传承福禄克仪器高品质的同时,也在硬件方面做了许多提升, ...
- 美国福禄克2021年1月重磅发布两款红外热像仪——TiS55+和TiS75+
美国福禄克公司于2021年1月重磅发布两款红外热像仪--TiS55+和TiS75+. 作为福禄克优选系列热像仪中的拳头产品,TiS55+和TiS75+在传承福禄克仪器高品质的同时,也在硬件方面做了许多 ...
- 红外测温 AGM8833红外热像仪传感器的使用
红外测温 AMG8833红外热像仪传感器的使用 传感器介绍 模块原理图 温度测量 热成像 总结 原文链接:https://www.yourcee.com/newsinfo/2928723.html 传 ...
最新文章
- python使用matplotlib可视化线图(line plot)、设置X轴坐标的下限和上限数值(setting the lower and upper bound of the x axis)
- spring4声明式事务—02 xml配置方式
- 太阳光是平行光吗_“彩虹的形成是因为光的色散和光沿直线传播是一回事吗?”...
- 15-CSS基础-浮动流
- Unity 之 Shader 面的剔除 Cull
- 负载均衡集群介绍LVS介绍LVS调度算法LVS NAT模式搭建
- ASP.NET配置文件Web.config 详细解释
- C#中类的默认访问是私有的
- android unit(px,dp,dip,sp)
- Java课设——文本编辑器
- modbus功能码04实例_20种PLC元件编号和Modbus编号地址对应表
- vue中的阿里巴巴矢量图标使用
- 浅谈核桃的栽培技术与种植管理方法
- [产品设计]如何绘制业务流程图(上)
- Express 框架 以及特性
- 设置电脑 保护视力 还有桌面默认颜色
- gtx3050属于什么档次的显卡
- 武汉工程大计算机学校地址,武汉工程学院
- 吴恩达深度学习课程值不值得学?四晚学完的高手给你建议
- 1072: 青蛙爬井 C语言
热门文章
- hive动态分区shell_Hive动态分区 参数配置及语法
- linux的消息机制,linux消息机制的过程是什么啊,请赐教
- 全面开启线上参会报名!CNCC线上与现场参会者共赴技术盛宴!
- 意念打字、梦境重现如何成真,张钹、李路明等知名专家共话脑机接口最新进展 | 首届脑科学开放日...
- 助力健康中国,国内首个中文医疗信息处理挑战榜正式发布
- 「无糖快乐水」就安全了?不不,心血管疾病的风险照样增加
- iPhone重回5千档!苹果浴霸三摄新机发布,吊打华为上代芯,绝口不提5G
- PostgreSQL ODBC问题与探索SQLSpecialColumns
- PageRank的基本原理以及个性化PageRank在推荐系统的应用
- 【转】ExtJS DateField 日期控件Format格式化