0、什么时候需要MLX90640的驱动


如果想制作一个热成像仪,或者红外图像相关的什么东西,首先就需要找到一个好用的热成像模块。

假设你希望这个模块价格不要太贵(500元以下),精度也不用太高也不要太低(单帧数据为一个几十×几十的矩阵),那么MLX90640基于这款芯片制作的热成像模块就是你的不二选择。

在说明驱动方式之前,咱先看看这款芯片的特性和基于它制作的一种模块GYMCU90640


1、MLX90640


MLX90640Melexis公司发布的一款热成像芯片,共有长镜头短镜头两种封装。长镜头视角小、成像距离远;短镜头则视角大,成像距离近。



上图是从MLX90640的数据手册(DataSheet)里面截取的,这里给出Melexis公司的官网:https://www.melexis.com/zh,相关的技术文档可以从这里获取到。

从数据手册里可以看到芯片的特性参数——支持使用I2C通信协议读取数据,需要3.3V的电源电压。



MXL90640的引脚如下图所示,共VDD,GND,SCL,SDA四个引脚,两个用于接电源的引脚(VDD,GND)、两个支持IIC通信的引脚(SCL,SDA)。



2、GYMCU90640

GYMCU90640是基于MLX90640设计的热成像模块,这个模块在芯片原有的I2C协议之外还附加了一个USRT通信接口。


借助CH340等串口转USB的模块,GYMCU90640模块可以接到电脑上配合上位机显示镜头前的热辐射图。



3、驱动MLX90640

MPU6050一样,MLX90640可以被挂载到I2C总线上。像下图那样,如果它被当作DEVICE n挂到I某个I2C总线上,我们使用的STM32MCU就可以通过蓝色的SCL线和红色的SDA线这两条线对MLX90640进行读写操作啦。

这部分是I2C通信的知识,有疑问的话可以自行补一补哈。这里给一个链接:I2C总线_百科



MPU6050不一样的是,这个热成像芯片的配置和数据解算比较复杂,自行写驱动就比较麻烦啦。所以呢,Melexis公司官方也就给出了驱动,需要的时候移植官方的驱动就可以了。

Melexis公司把驱动放在GIthub上仓库里,链接是: Mlx90640官方驱动
Github可能比较慢,可以使用GitCode的镜像仓库:Mlx90640官方驱动镜像仓库链接


4、官方驱动

上面链接给的官方驱动仓库里面包含了驱动的源文件、头文件和驱动的说明书。



驱动包含了I2C驱动和MLX90640读写API两部分,functions文件夹中包含三个.c文件——MLX90640_API.cppMLX90640_I2C_Driver.cppMLX90640_SWI2C_Driver.cpp

MLX90640_I2C_Driver.cpp是硬件I2CMLX90640_SWI2C_Driver.cpp是软件I2C


为了方便大伙理解APII2C的关系,特意画了下面这张图哈。API是建立在I2C驱动基础上的,只要I2C的驱动写好(不管是软件还是硬件),那么编写代码调用API就可以对MLX90640进行读写操作啦。



到这里,我们就知道,根据我们的硬件改好驱动就行,那接下来咱就看看怎么改驱动。


5、怎样改驱动

怎么修改呢?有个说明书(MLX90640.pdf)嘛,咱先翻翻看看。



主要看第二章I2C Driver和第三章MLX90640 API。下面这张图是说明书第二章的概述,写的很清楚吧,主要改驱动的硬件参数。


API是写好了的,不要去改动。


6、改驱动

6.1 删函数
虽然前面说不要改API文件,但我们要删一个函数:

int MLX90640_TriggerMeasurement(uint8_t slaveAddr);

这个我们用不上,不用担心,如果有问题加回来就行,所以建议注释,不要直接删除了。



6.2 改软件驱动.c文件
考虑到代码的通用性,并且为了规避STM32里硬件I2CBUG,建议使用软件I2C,这里我们也只说软件I2C的修改。

先看MLX90640_SWI2C_Driver.cpp,下面这张图指出了需要删除的部分。这个源文件包含了“mbed.h”这个头文件,咱们没有,当然要把它删了吧,第二个红框框里面的也一样,全部删掉哈。



然后注意哟,里面有一个void Wait(int)函数,这是控制I2C时序的延时函数,打开看看:

void Wait(int freqCnt)
{int cnt;for(int i = 0;i<freqCnt;i++){cnt = cnt++; }
}

只是个软件延时函数,由freqCnt来控制延时时间。实际上,I2C驱动里每次调用Wait()函数,输入的参数都是同一个freqCnt,所以咱们只需要改那个

static int freqCnt;

让他随便等于一个数(2、3或者4)就行啦,

static int freqCnt=2;

如果这个不管的话,软件I2C通信是用不了的。


6.3 改软件驱动头文件
为了定义SCL和SDA线的引脚,咱们在MLX90640_I2C_Driver.h这个头文件里加上:

#define SCL_PIN              GPIO_Pin_6
#define SCL_GPIO_PORT       GPIOB  #define SDA_PIN              GPIO_Pin_7
#define SDA_GPIO_PORT       GPIOB  #define SCL_HIGH             GPIO_SetBits(SCL_GPIO_PORT , SCL_PIN)
#define SCL_LOW             GPIO_ResetBits(SCL_GPIO_PORT , SCL_PIN)#define SDA_HIGH             GPIO_SetBits(SDA_GPIO_PORT , SDA_PIN )
#define SDA_LOW             GPIO_ResetBits(SDA_GPIO_PORT , SDA_PIN)#define SCL_read             GPIO_ReadInputDataBit(SCL_GPIO_PORT , SCL_PIN)
#define SDA_read            GPIO_ReadInputDataBit(SDA_GPIO_PORT , SDA_PIN)

PB6设置为SCLPB7设置为SDA


然后加上一些常量宏定义和枚举,把整个头文件改成

#ifndef _MLX90640_I2C_Driver_H_
#define _MLX90640_I2C_Driver_H_#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include <stdint.h>enum REFRESHRATE{FPS2HZ = 0x02,FPS4HZ = 0x03,FPS8HZ = 0x04,FPS16HZ = 0x05,FPS32HZ = 0x06
};
#define  RefreshRate FPS32HZ
#define  WAIT_TIC 2 //软件I2C频率控制#define  MLX90640_ADDR 0x33
#define  TA_SHIFT 8 //Default shift for MLX90640 in open air#define SCL_PIN             GPIO_Pin_6
#define SCL_GPIO_PORT       GPIOB
#define SDA_PIN             GPIO_Pin_7
#define SDA_GPIO_PORT       GPIOB
#define SCL_HIGH            GPIO_SetBits(SCL_GPIO_PORT , SCL_PIN)
#define SCL_LOW             GPIO_ResetBits(SCL_GPIO_PORT , SCL_PIN)
#define SDA_HIGH            GPIO_SetBits(SDA_GPIO_PORT , SDA_PIN )
#define SDA_LOW             GPIO_ResetBits(SDA_GPIO_PORT , SDA_PIN)
#define SCL_read            GPIO_ReadInputDataBit(SCL_GPIO_PORT , SCL_PIN)
#define SDA_read            GPIO_ReadInputDataBit(SDA_GPIO_PORT , SDA_PIN)void MLX90640_I2CInit(void);
int MLX90640_I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data);
int MLX90640_I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data);
int MLX90640_I2CGeneralReset(void);
#endif

7、使用驱动

首先包含两个头文件

#include "MLX90640_I2C_Driver.h"
#include "MLX90640_API.h"

初始化I2C

MLX90640_I2CInit();

初始化设备

paramsMLX90640 mlx90640;
MlxConfig_Init(&mlx90640);

初始化函数定义为

uint16_t eeMLX90640[832];
float mlx90640To[768];
uint16_t frame[834];
int status;void MlxConfig_Init(paramsMLX90640* params)
{MLX90640_SetRefreshRate(MLX90640_ADDR, RefreshRate);printf("MLX90640_SetRefreshRate done\n");MLX90640_SetChessMode(MLX90640_ADDR);printf("MLX90640_SetChessMode done\n");MlxConfig_Check(params);
}

paramsMLX90640是一个存放配置信息的结构体,定义在头文件MLX90640_API.h

typedef struct{int16_t kVdd;int16_t vdd25;float KvPTAT;float KtPTAT;uint16_t vPTAT25;float alphaPTAT;int16_t gainEE;float tgc;float cpKv;float cpKta;uint8_t resolutionEE;uint8_t calibrationModeEE;float KsTa;float ksTo[5];int16_t ct[5];uint16_t alpha[768];    uint8_t alphaScale;int16_t offset[768];    int8_t kta[768];uint8_t ktaScale;    int8_t kv[768];uint8_t kvScale;float cpAlpha[2];int16_t cpOffset[2];float ilChessC[3]; uint16_t brokenPixels[5];uint16_t outlierPixels[5];  } paramsMLX90640;

获取、解算并发送数据

testShowThermal(&mlx90640);

这个函数定义为

void testMlx90640Value(paramsMLX90640* params)
{printf("\n---------------start--------------------\n");int status = MLX90640_GetFrameData(MLX90640_ADDR, frame);if (status < 0){printf("GetFrame Error: %d\r\n",status);}float vdd = MLX90640_GetVdd(frame, params);float Ta = MLX90640_GetTa(frame, params);float tr = Ta - TA_SHIFT; //Reflected temperature based on the sensor ambient temperatureprintf("vdd:  %f Tr: %f\r\n",vdd,tr);MLX90640_CalculateTo(frame, params, emissivity , tr, mlx90640To);for(int i = 0; i < 768; i++){if(i%32 == 0 && i != 0){printf("\r\n");}printf("%2.2f ",mlx90640To[i]);}
}

计算MLX90640_CalculateTo()需要的一个参数tr时,

float tr = Ta - TA_SHIFT; //Reflected temperature based on the sensor ambient temperature

用到的TA_SHIFT定义在头文件MLX90640_I2C_Driver.h中,是我们刚才添加进去的:

#define  TA_SHIFT 8 //Default shift for MLX90640 in open air

好啦,这样就可以用啦,更多的就自己看看驱动说明书吧,API很丰富的。

如何使用STM32F10x驱动MLX90640模块(移植官方驱动)相关推荐

  1. 免费分享:5本安卓开发经典书籍,Android 7编程入门经典(第4版),Android底层驱动分析和移植,底层驱动分析和移植

    1.Android 7编程入门经典(第4版) 使用Android Studio 2  PDF 下载 下载地址: http://www.askwinds.com/r-c/down-info-02/579 ...

  2. p3000显卡 驱动 linux,NVIDIA Linux官方驱动2010年度回顾

    NVIDIA Linux官方驱动2010年度回顾 出处:快科技 2010-12-20 10:21:14     作者:上方文Q 编辑:上方文Q[爆料] 收藏文章 每逢岁末,Phoronix.com网站 ...

  3. DW1000开发笔记(三)基于STM32 HAL库裸机工程移植DW1000官方驱动

    系列文章 DW1000开发笔记(一)DW1000芯片概览 DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信 一.官方驱动 Decawave官方提 ...

  4. 学习ARM架构,系统移植和驱动开发总结

    本次结束了对ARM架构,系统移植和驱动开发的学习,它们都是属于底层,难度想对都比较的难一点,但先学习arm架构之后去学习系统移植和驱动开发,会使自己对系统移植和驱动开发容易理解点. arm架构 arm ...

  5. ubuntu 16.04 安装nvidia驱动 下载nvidia官方驱动

    ubuntu 16.04 安装nvidia驱动 下载nvidia官方驱动 1,nvidia官方驱动下载 2,驱动安装 1,nvidia官方驱动下载 NVIDIA 驱动程序下载 2,驱动安装 ERROR ...

  6. linux驱动编写(其他的驱动代码)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] linux里面的代码很多,要全部说完,那是不现实的.在实际工作中,我们基本上需要什么驱动,就移植 ...

  7. win7万能声卡驱动_黑苹果常见 .kext 驱动解读下载

    科普一下黑苹果下各种  ***.kext  驱动的各种功能,方便大家认清楚自己驱动包里的各项驱动是干什么用的,也可对应此表把自己不用的驱动做适当精简.如果您有更多黑苹果安装的驱动或以下内容有误需要补充 ...

  8. 基于STM32F4移植W5500官方驱动库ioLibrary_Driver(转)

    源: 基于STM32F4移植W5500官方驱动库ioLibrary_Driver 参考: 基于STM32+W5500 的Ethernet和Internet移植 Upgrade W5500 Throug ...

  9. LoRa 之一 旧版驱动(sx12xxDrivers-V2.1.0)移植及驱动架构详解

      在之前的项目中,一直使用 LoRa 通信.很早之前就想写写文章记录一下学习过程.怎奈一直是一知半解的状态,想写不敢写!LoRa 这个东西在国内用的貌似不是太多.   对于无线通信,各个国家或者地区 ...

最新文章

  1. c语言按行存储数据库,C语言实现按行读写文件
  2. Windows上搭建EMQTT服务器
  3. 前端学习(2134):前端模块化雏形和common.js
  4. 型管件的作用_管道工程基础 - 管件和管道附件的布置规定
  5. matlab画横的/水平的条形图
  6. 【C语言】文件操作及输入输出格式(文件常用的库函数)
  7. spring_boot 与MyBatis 整合
  8. 如何在苹果Mac上截屏或录制屏幕?
  9. Python - 列表与字典相互转换
  10. SGX技术与SGX攻击
  11. 计算机专业英语词汇分类收录
  12. 佛系程序员的月薪五万指南 -- 作者|李运华
  13. 文本框、图片的一些使用方法
  14. AI快捷键大全 2020
  15. 用c语言寸件照换底颜色,怎么给证件照换底色【使用步骤】
  16. usemvc永远不会被使用_你永远不会离开
  17. dataframe两个表合并_python处理DataFrame数据的一些常用操作
  18. SSH公钥秘钥git
  19. C1实训-动态令牌(二次验证码)原理及实现
  20. 极速模式下java无法加载_谷歌和360急速模式 下的XMLHttpRequest 的onprogress事件失效...

热门文章

  1. 诫子书 --诸葛亮
  2. EfficientDet ---最细节的论文解析
  3. 浙商突围--关于“浙江制造”的营销学观察(下)
  4. 2007-2021年36家商业银行绿色信贷相关数据
  5. 【深度学习】常见的神经网络层(下)
  6. 非常精妙的主副电源自动切换电路
  7. 华为杯数学建模思路整理
  8. qtQuick pdf 下载
  9. 人才测评,你想得到和想不到的五大趋
  10. JavaScirpt(JS)——js介绍及ECMAScript