网站建设pdf微盘,做兼职的网站有哪些工作内容,深圳做网站d公司,公司发布网站需要备案吗红外温度传感器一般用于非接触式的温度检测。在我们的系统中经常会有这样的需求。所以我们将其设计为通用的驱动库以备复用。这一篇我们将讲述MLX90614红外温度传感器驱动的设计与实现。
1、功能概述
MLX90614是一种红外温度计#xff0c;用于非接触式温度测量。红外测温是根…红外温度传感器一般用于非接触式的温度检测。在我们的系统中经常会有这样的需求。所以我们将其设计为通用的驱动库以备复用。这一篇我们将讲述MLX90614红外温度传感器驱动的设计与实现。
1、功能概述
MLX90614是一种红外温度计用于非接触式温度测量。红外测温是根据被测物体的红外辐射能量来确定物体的温度不与被测物体接触具有不影响被测物体温度分布场温度分辨率高、响应速度快、测温范围广、不受测温上限的限制、稳定性好等特点。MLX90614被测目标温度和环境温度通过IIC接口输出适合于汽车空调、室内暖气、家用电器、手持设备以及医疗设备应用等。
1.1、硬件描述
MLX90614 是一款无接触式的红外线温度感应芯片它在同一TO-39封装内整合了红外热电堆感应器与一款定制的信号调节芯片。MLX90614在信号调节芯片中使用了先进的低噪音放大器一枚17-bit ADC以及功能强大的DSP元件 从而实现高精度温度测量。其引脚封装及功能如下 MLX90614的出厂校准温度范围很广环境温度为-40°C…125°C目标温度为-70°C…380°C。测量值是传感器视场中所有物体的平均温度。在室温下MLX90614的标准精确度为±0.5度。有一种特殊的医疗应用版本在人体体温的有限温度范围内精确呈现±0.2恒温。
1.2、数据通讯
MLX90614红外温度传感器具有数字PWM和SMBus(系统管理总线)输出。10位PWM作为标准配置可以在-20…120完美呈现测量温度输出分辨率为0.14完美呈现。工厂默认的设置是SMBus总线接口。
MLX90614红外温度传感器又有一个参数存储EEPROM内存。在EEPROM内存中有限数量的地址可以由客户更改这些地址存储着传感器可修改配置信息。整个EEPROM都可以通过SMBus接口读取。具体分配如下 在这个EEPROM中我们需要注意的有PWM控制寄存器以及配置寄存器。PWMCTRL寄存器的各位定义如下 ConfigRegister1由控制位组成用于配置模拟和数字部分ConfigRegister1寄存器的各位定义如下 MLX90614红外温度传感器还拥有一个32个字的RAM。用于存储一些实时更新的数据如我们的测量数据。这一部分是只读的其地址分配如下 我们了解了MLX90614红外温度传感器的EEPROM和RAM的地址分配它们的地址是分别编码的似乎看不出差别。那我们如何能来区别访问它们呢于是MLX90614红外温度传感器定义有如下的功能码 读写EEPROM和RAM的命令前三位表示命令后5为对应所读参数在EEPROM和RAM中的地址。标志位是只读的MLX90614在16位数据之后返回PEC其中只有4位是有意义的如果MD需要它它可以在第一个字节之后停止通信。读数据和读标志的区别在于后者没有重复的起始位。
MLX90614红外温度传感器设备地址默认为0xB4可以通过写EEPROM来修改设备地址。
2、驱动设计与实现
我们已经了解了MLX90614红外温度传感器的基本情况接下来我们将根据这些资料开发MLX90614红外温度传感器的驱动程序。
2.1、对象定义
在使用一个对象之前我们需要获得一个对象。同样的我们想要使用MLX90614红外温度传感器对象就需要先定义MLX90614红外温度传感器的对象。
2.1.1、对象的抽象
我们要得到MLX90614温度传感器对象需要先分析其基本特性。一般来说一个对象至少包含两方面的特性属性与操作。接下来我们就来从这两个方面思考一下MLX90614温度传感器的对象。
先来考虑属性作为属性肯定是用于标识或记录对象特征的东西。我们来考虑MLX90614红外温度传感器对象属性。作为SMBus总线设备需要一个设备地址这一地址用来区分总线上不同设备所以我们将设备地址作为它的一个属性。对象的状态标识PWM控制寄存器、配置寄存器都只是了MLX90614红外温度传感器当前所处的状态所以我们将它们也作为属性。设备ID号是唯一标识各个MLX90614红外温度传感器的我们也将其作为属性。测量的温度信号也表示了MLX90614红外温度传感器当前的状态我们也将他们作为属性。标志寄存器在MLX90614红外温度传感器中是16位的但真正有效的只有4位所以我们以8位表示。
接着我们还需要考虑MLX90614红外温度传感器对象的操作问题。对于MLX90614红外温度传感器来说我们需要对它进行读数据和写数据而读写操作依赖于具体的硬件平台所以我们将其作为对象的操作以回调函数的方式使用。在操作MLX90614红外温度传感器的过程中有些时序需要控制所以需要延时函数但延时操作依赖于具体的软硬件平台所以我们将其作为对象的操作以回调函数的方式使用。
根据上述我们对MLX90614红外温度传感器的分析我们可以定义MLX90614红外温度传感器的对象类型如下
typedef struct MLXObject {uint8_t devAddress; //对象的地址uint8_t flags; //对象状态标志uint16_t pwmctrl; //PWM控制寄存器uint16_t ConfigRegister; //配置寄存器uint16_t ID[4]; //对象的ID值float tempAmbient; //温度值float tempObject1; //温度值float tempObject2; //温度值void (*Read)(struct MLXObject *mlxuint8_t cmduint8_t *rDatauint16_t rSize); //读数据操作指针void (*Write)(struct MLXObject *mlxuint8_t cmduint8_t *wDatauint16_t wSize); //写数据操作指针void (*Delayus)(volatile uint32_t nTime); //延时操作指针
}MLXObjectType;
2.1.2、对象初始化
我们知道一个对象仅作声明是不能使用的我们需要先对其进行初始化所以这里我们来考虑MLX90614红外温度传感器对象的初始化函数。一般来说初始化函数需要处理几个方面的问题。一是检查输入参数是否合理二是为对象的属性赋初值三是对对象作必要的初始化配置。据此我们设计MLX90614红外温度传感器对象的初始化函数如下
/* 红外温度传感器对象初始化 */
void MLXInitialization(MLXObjectType *mlx //MLX90614对象uint8_t address //设备地址MLXRead read //读数据函数指针MLXWrite write //写数据函数指针MLXDelayus delayus //微秒岩石函数指针)
{if((mlxNULL)||(readNULL)||(writeNULL)||(delayusNULL)){return;}mlx-Readread;mlx-Writewrite;mlx-Delayusdelayus;mlx-tempAmbient0.0;mlx-tempObject10.0;mlx-tempObject20.0;if(address0x00){mlx-devAddressaddress;}else{mlx-devAddressMLXSlaveAddress;}mlx-Delayus(200);GetIDFromMLX90614(mlx);mlx-flags(uint8_t)ReadFlagFromMLX(mlx);mlx-pwmctrlReadDataFromMLX(mlxEEPROMAccess|PWMCTRL);mlx-ConfigRegisterReadDataFromMLX(mlxEEPROMAccess|ConfigRegister1);
}
2.2、对象操作
我们已经完成了MLX90614红外温度传感器对象类型的定义和对象初始化函数的设计。但我们的主要目标是获取对象的信息接下来我们还要实现面向MLX90614红外温度传感器的各类操作。
2.2.1、读数据操作
我们需要从MLX90614红外温度传感器读取数据不管这个数据是在EEPROM还是在RAM我们都可以采用相同的方式读取。我们已经说过操作EEPROM和RAM的命令字节由3位命令和5位地址组成。我们实现数据读取函数如下 /*读数据操作*/
static uint16_t ReadDataFromMLX(MLXObjectType *mlxuint8_t cmd)
{uint8_t data[3];uint16_t tempCode0;uint8_t pec[6];mlx-Read(mlxcmddata3);pec[0]mlx-devAddress;pec[1]cmd;pec[2]mlx-devAddress1;pec[3]data[0];pec[4]data[1];pec[5]data[2];if(PECCalculation(pec6)0x00){tempCode(data[1]8)data[0];}return tempCode;
}
2.2.2、写数据操作
我们需要向MLX90614红外温度传感器写一些数据用以配置传感器这些可写的寄存器处于EEPROM之中如配置寄存器、PWM控制信息、设备地址等。这里我们设计一个配置这些数据的操作函数。 /* 写数据操作 */
static void WriteDataToMLX(MLXObjectType *mlxuint8_t cmduint16_t data)
{uint8_t wData[3];uint8_t pec[4];pec[0]mlx-devAddress;pec[1]cmd;pec[2](uint8_t)data;pec[3](uint8_t)(data8);wData[0](uint8_t)data;wData[1](uint8_t)(data8);wData[2]PECCalculation(pec4);mlx-Write(mlxcmdwData3);
}
2.2.3、操作休眠模式
有些时候在我们不使用设备时我们希望能够让设备休眠以节省资源在需要时再将其唤醒投入工作。MLX90614具备有休眠的功能这里我们看看如何使用这一功能。 /* 使设备进入休眠模式 */
void EnterSleepModeForMLX(MLXObjectType *mlx)
{uint8_t cmd;static uint8_t pec;uint8_t data[2];cmdEnterSLEEPMode;data[0]mlx-devAddress;data[1]cmd;pecPECCalculation(data2);mlx-Write(mlxcmdpec1);
}
3、驱动的使用
我们已经设计并实现了MLX90614红外温度传感器的驱动程序。我们还需要对这一驱动进行验证。接下来我们将基于这一驱动程序开发获取MLX90614红外温度传感器数据的简单应用。
3.1、声明并初始化对象
使用基于对象的操作我们需要先得到这个对象所以我们先要使用前面定义的MLX90614红外温度传感器对象类型声明一个MLX90614红外温度传感器对象变量具体操作格式如下
MLXObjectType mlx;
我们声明了这个对象变量但还不能立即使用。我们还需要使用驱动中定义的初始化函数对这个对象变量进行初始化。初始化函数有一些用于对象初始化的参数需要输入
MLXObjectType *mlxMLX90614对象
uint8_t address设备地址
MLXRead read读数据函数指针
MLXWrite write写数据函数指针
MLXDelayus delayus微秒延时函数指针
对于这些参数对象变量我们已经定义了它正是我们需要初始化的对象。在这些参数中我们需要注意的是几个函数指针我们需要在应用中定义这几个函数并将函数指针作为参数。这几个函数的类型如下
/*定义读MLX90614数据操作指针类型*/
typedef void (*MLXRead)(struct MLXObject *mlxuint8_t cmduint8_t *rDatauint16_t rSize);/*定义写MLX90614数据操作指针类型*/
typedef void (*MLXWrite)(struct MLXObject *mlxuint8_t cmduint8_t *wDatauint16_t wSize);/*定义微秒延时操作指针类型*/
typedef void (*MLXDelayus)(volatile uint32_t nTime);
对于这几个函数我们根据样式定义就可以了具体的操作可能与使用的软硬件平台有关系。在这里我们使用STM32F4的第2个I2C接口及其外设库所以具体函数定义如下
/*从MLX90614接收数据*/
static void ReceiveFromMLX(MLXObjectType *mlxuint8_t cmduint8_t *rDatauint16_t rSize)
{HAL_I2C_Master_Transmit(hlpti2cmlx-devAddresscmd11000);HAL_I2C_Master_Receive(hlpti2c mlx-devAddressrData rSize 1000);
}/*向MLX90614传送数据*/
static void TransmitToMLX(MLXObjectType *mlxuint8_t cmduint8_t *tDatauint16_t tSize)
{uint8_t data[10];data[0]cmd;for(int i0;itSize;i){data[i1]tData[i];}HAL_I2C_Master_Transmit(hlpti2cmlx-devAddressdatatSize11000);
}
对于延时函数我们可以采用各种方法实现。我们采用的STM32平台和HAL库则可以直接使用HAL_Delay()函数。于是我们可以调用初始化函数如下
MLXInitialization(mlx0xB4ReceiveFromMLXTransmitToMLXHAL_Delay);
3.2、基于对象进行操作
我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值接下来我们使用这一驱动开发我们的应用实例。
/*读取温度值*/
void GetTemperatureDataFromMLX(void)
{float tempObject;float tempAmbient;GetMLXTemperature(mlx);tempObjectmlx.tempObject1;tempAmbientmlx.tempAmbient;
}
4、应用总结
我们设计并实现了MLX90614红外温度传感器的驱动程序并在此基础上设计了一个简单的应用来验证之。事实上我们在实际项目中也是使用这一驱动程序来实现应用的并且效果良好。
读标志与读数据在时序控制上是有一些差别的下发命令与接收数据之间没有重启的操作这一点在操作它时需要注意。
我们在使用驱动时一般会选择使用GPIO模拟的I2C收发器这样稳定性更好。而使用硬件I2C接口及其库函数实现时经常会有死锁的事情发生。我们曾多次遇到特别是在STM32的第一路I2C接口。至于第1路I2C接口与其它的I2C接口有什么差异尚未确定。总之使用GPIO模拟I2C收发器更为稳定。
欢迎关注