日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

外设驱动库开发笔记13:MLX90614红外温度传感器驱动

發(fā)布時(shí)間:2024/7/23 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 外设驱动库开发笔记13:MLX90614红外温度传感器驱动 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

紅外溫度傳感器一般用于非接觸式的溫度檢測。在我們的系統(tǒng)中經(jīng)常會(huì)有這樣的需求。所以我們將其設(shè)計(jì)為通用的驅(qū)動(dòng)庫以備復(fù)用。這一篇我們將講述MLX90614紅外溫度傳感器驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)。

1、功能概述

MLX90614是一種紅外溫度計(jì),用于非接觸式溫度測量。紅外測溫是根據(jù)被測物體的紅外輻射能量來確定物體的溫度,不與被測物體接觸,具有不影響被測物體溫度分布場,溫度分辨率高、響應(yīng)速度快、測溫范圍廣、不受測溫上限的限制、穩(wěn)定性好等特點(diǎn)。MLX90614被測目標(biāo)溫度和環(huán)境溫度通過IIC接口輸出,適合于汽車空調(diào)、室內(nèi)暖氣、家用電器、手持設(shè)備以及醫(yī)療設(shè)備應(yīng)用等。

1.1、硬件描述

MLX90614 是一款無接觸式的紅外線溫度感應(yīng)芯片,它在同一TO-39封裝內(nèi)整合了紅外熱電堆感應(yīng)器與一款定制的信號調(diào)節(jié)芯片。MLX90614在信號調(diào)節(jié)芯片中使用了先進(jìn)的低噪音放大器,一枚17-bit ADC以及功能強(qiáng)大的DSP元件, 從而實(shí)現(xiàn)高精度溫度測量。其引腳封裝及功能如下:

MLX90614的出廠校準(zhǔn)溫度范圍很廣:環(huán)境溫度為-40°C…125°C,目標(biāo)溫度為-70°C…380°C。測量值是傳感器視場中所有物體的平均溫度。在室溫下,MLX90614的標(biāo)準(zhǔn)精確度為±0.5度。有一種特殊的醫(yī)療應(yīng)用版本,在人體體溫的有限溫度范圍內(nèi)精確呈現(xiàn)±0.2恒溫。

1.2、數(shù)據(jù)通訊

MLX90614紅外溫度傳感器具有數(shù)字PWMSMBus(系統(tǒng)管理總線)輸出。10PWM作為標(biāo)準(zhǔn)配置,可以在-20…120完美呈現(xiàn)測量溫度,輸出分辨率為0.14完美呈現(xiàn)。工廠默認(rèn)的設(shè)置是SMBus總線接口。

MLX90614紅外溫度傳感器又有一個(gè)參數(shù)存儲EEPROM內(nèi)存。在EEPROM內(nèi)存中有限數(shù)量的地址可以由客戶更改,這些地址存儲著傳感器可修改配置信息。整個(gè)EEPROM都可以通過SMBus接口讀取。具體分配如下:

在這個(gè)EEPROM中,我們需要注意的有PWM控制寄存器以及配置寄存器。PWMCTRL寄存器的各位定義如下:

ConfigRegister1由控制位組成,用于配置模擬和數(shù)字部分,ConfigRegister1寄存器的各位定義如下:

MLX90614紅外溫度傳感器還擁有一個(gè)32個(gè)字的RAM。用于存儲一些實(shí)時(shí)更新的數(shù)據(jù),如我們的測量數(shù)據(jù)。這一部分是只讀的,其地址分配如下:

我們了解了MLX90614紅外溫度傳感器的EEPROM和RAM的地址分配,它們的地址是分別編碼的,似乎看不出差別。那我們?nèi)绾文軄韰^(qū)別訪問它們呢?于是MLX90614紅外溫度傳感器定義有如下的功能碼:

讀寫EEPROMRAM的命令,前三位表示命令,后5為對應(yīng)所讀參數(shù)在EEPROMRAM中的地址。標(biāo)志位是只讀的,MLX9061416位數(shù)據(jù)之后返回PEC,其中只有4位是有意義的,如果MD需要它,它可以在第一個(gè)字節(jié)之后停止通信。讀數(shù)據(jù)和讀標(biāo)志的區(qū)別在于后者沒有重復(fù)的起始位。

MLX90614紅外溫度傳感器設(shè)備地址默認(rèn)為0xB4,可以通過寫EEPROM來修改設(shè)備地址。

2、驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

我們已經(jīng)了解了MLX90614紅外溫度傳感器的基本情況,接下來我們將根據(jù)這些資料開發(fā)MLX90614紅外溫度傳感器的驅(qū)動(dòng)程序。

2.1、對象定義

在使用一個(gè)對象之前我們需要獲得一個(gè)對象。同樣的我們想要使用MLX90614紅外溫度傳感器對象就需要先定義MLX90614紅外溫度傳感器的對象。

2.1.1、對象的抽象

我們要得到MLX90614溫度傳感器對象,需要先分析其基本特性。一般來說,一個(gè)對象至少包含兩方面的特性:屬性與操作。接下來我們就來從這兩個(gè)方面思考一下MLX90614溫度傳感器的對象。

先來考慮屬性,作為屬性肯定是用于標(biāo)識或記錄對象特征的東西。我們來考慮MLX90614紅外溫度傳感器對象屬性。作為SMBus總線設(shè)備需要一個(gè)設(shè)備地址,這一地址用來區(qū)分總線上不同設(shè)備,所以我們將設(shè)備地址作為它的一個(gè)屬性。對象的狀態(tài)標(biāo)識,PWM控制寄存器、配置寄存器都只是了MLX90614紅外溫度傳感器當(dāng)前所處的狀態(tài),所以我們將它們也作為屬性。設(shè)備ID號是唯一標(biāo)識各個(gè)MLX90614紅外溫度傳感器的,我們也將其作為屬性。測量的溫度信號也表示了MLX90614紅外溫度傳感器當(dāng)前的狀態(tài),我們也將他們作為屬性。標(biāo)志寄存器在MLX90614紅外溫度傳感器中是16位的,但真正有效的只有4位,所以我們以8位表示。

接著我們還需要考慮MLX90614紅外溫度傳感器對象的操作問題。對于MLX90614紅外溫度傳感器來說,我們需要對它進(jìn)行讀數(shù)據(jù)和寫數(shù)據(jù),而讀寫操作依賴于具體的硬件平臺,所以我們將其作為對象的操作,以回調(diào)函數(shù)的方式使用。在操作MLX90614紅外溫度傳感器的過程中,有些時(shí)序需要控制,所以需要延時(shí)函數(shù),但延時(shí)操作依賴于具體的軟硬件平臺,所以我們將其作為對象的操作,以回調(diào)函數(shù)的方式使用。

根據(jù)上述我們對MLX90614紅外溫度傳感器的分析,我們可以定義MLX90614紅外溫度傳感器的對象類型如下:

typedef struct MLXObject {uint8_t devAddress;?????????? //對象的地址uint8_t flags;??????????????? //對象狀態(tài)標(biāo)志uint16_t pwmctrl;???????????? //PWM控制寄存器uint16_t ConfigRegister;????? //配置寄存器uint16_t ID[4];?????????????? //對象的ID值float tempAmbient;??????????? //溫度值float tempObject1;??????????? //溫度值float tempObject2;??????????? //溫度值void (*Read)(struct MLXObject *mlx,uint8_t cmd,uint8_t *rData,uint16_t rSize);??? //讀數(shù)據(jù)操作指針void (*Write)(struct MLXObject *mlx,uint8_t cmd,uint8_t *wData,uint16_t wSize);?? //寫數(shù)據(jù)操作指針void (*Delayus)(volatile uint32_t nTime);?????? //延時(shí)操作指針 }MLXObjectType;

2.1.2、對象初始化

我們知道,一個(gè)對象僅作聲明是不能使用的,我們需要先對其進(jìn)行初始化,所以這里我們來考慮MLX90614紅外溫度傳感器對象的初始化函數(shù)。一般來說,初始化函數(shù)需要處理幾個(gè)方面的問題。一是檢查輸入?yún)?shù)是否合理;二是為對象的屬性賦初值;三是對對象作必要的初始化配置。據(jù)此我們設(shè)計(jì)MLX90614紅外溫度傳感器對象的初始化函數(shù)如下:

/* 紅外溫度傳感器對象初始化 */ void MLXInitialization(MLXObjectType *mlx,??? //MLX90614對象uint8_t address,???? ??//設(shè)備地址MLXRead read,??? ??????//讀數(shù)據(jù)函數(shù)指針MLXWrite write,? ??????//寫數(shù)據(jù)函數(shù)指針MLXDelayus delayus??????//微秒巖石函數(shù)指針) {if((mlx==NULL)||(read==NULL)||(write==NULL)||(delayus==NULL)){return;}mlx->Read=read;mlx->Write=write;mlx->Delayus=delayus;mlx->tempAmbient=0.0;mlx->tempObject1=0.0;mlx->tempObject2=0.0;if(address>0x00){mlx->devAddress=address;}else{mlx->devAddress=MLXSlaveAddress;}mlx->Delayus(200);GetIDFromMLX90614(mlx);mlx->flags=(uint8_t)ReadFlagFromMLX(mlx);mlx->pwmctrl=ReadDataFromMLX(mlx,EEPROMAccess|PWMCTRL);mlx->ConfigRegister=ReadDataFromMLX(mlx,EEPROMAccess|ConfigRegister1); }

2.2、對象操作

我們已經(jīng)完成了MLX90614紅外溫度傳感器對象類型的定義和對象初始化函數(shù)的設(shè)計(jì)。但我們的主要目標(biāo)是獲取對象的信息,接下來我們還要實(shí)現(xiàn)面向MLX90614紅外溫度傳感器的各類操作。

2.2.1、讀數(shù)據(jù)操作

我們需要從MLX90614紅外溫度傳感器讀取數(shù)據(jù),不管這個(gè)數(shù)據(jù)是在EEPROM還是在RAM,我們都可以采用相同的方式讀取。我們已經(jīng)說過,操作EEPROMRAM的命令字節(jié)由3位命令和5位地址組成。我們實(shí)現(xiàn)數(shù)據(jù)讀取函數(shù)如下:

/*讀數(shù)據(jù)操作*/ static uint16_t ReadDataFromMLX(MLXObjectType *mlx,uint8_t cmd) {uint8_t data[3];uint16_t tempCode=0;uint8_t pec[6];mlx->Read(mlx,cmd,data,3);pec[0]=mlx->devAddress;pec[1]=cmd;pec[2]=mlx->devAddress+1;pec[3]=data[0];pec[4]=data[1];pec[5]=data[2];if(PECCalculation(pec,6)==0x00){tempCode=(data[1]<<8)+data[0];}return tempCode; }

2.2.2、寫數(shù)據(jù)操作

我們需要向MLX90614紅外溫度傳感器寫一些數(shù)據(jù)用以配置傳感器,這些可寫的寄存器處于EEPROM之中,如配置寄存器、PWM控制信息、設(shè)備地址等。這里我們設(shè)計(jì)一個(gè)配置這些數(shù)據(jù)的操作函數(shù)。

/* 寫數(shù)據(jù)操作 */ static void WriteDataToMLX(MLXObjectType *mlx,uint8_t cmd,uint16_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)(data>>8);wData[0]=(uint8_t)data;wData[1]=(uint8_t)(data>>8);wData[2]=PECCalculation(pec,4);mlx->Write(mlx,cmd,wData,3); }

2.2.3、操作休眠模式

有些時(shí)候在我們不使用設(shè)備時(shí),我們希望能夠讓設(shè)備休眠以節(jié)省資源,在需要時(shí)再將其喚醒投入工作。MLX90614具備有休眠的功能,這里我們看看如何使用這一功能。

/* 使設(shè)備進(jìn)入休眠模式 */ void EnterSleepModeForMLX(MLXObjectType *mlx) {uint8_t cmd;static uint8_t pec;uint8_t data[2];cmd=EnterSLEEPMode;data[0]=mlx->devAddress;data[1]=cmd;pec=PECCalculation(data,2);mlx->Write(mlx,cmd,&pec,1); }

3、驅(qū)動(dòng)的使用

我們已經(jīng)設(shè)計(jì)并實(shí)現(xiàn)了MLX90614紅外溫度傳感器的驅(qū)動(dòng)程序。我們還需要對這一驅(qū)動(dòng)進(jìn)行驗(yàn)證。接下來我們將基于這一驅(qū)動(dòng)程序開發(fā)獲取MLX90614紅外溫度傳感器數(shù)據(jù)的簡單應(yīng)用。

3.1、聲明并初始化對象

使用基于對象的操作我們需要先得到這個(gè)對象,所以我們先要使用前面定義的MLX90614紅外溫度傳感器對象類型聲明一個(gè)MLX90614紅外溫度傳感器對象變量,具體操作格式如下:

MLXObjectType mlx;

我們聲明了這個(gè)對象變量,但還不能立即使用。我們還需要使用驅(qū)動(dòng)中定義的初始化函數(shù)對這個(gè)對象變量進(jìn)行初始化。初始化函數(shù)有一些用于對象初始化的參數(shù)需要輸入:

MLXObjectType *mlxMLX90614對象

uint8_t address,設(shè)備地址

MLXRead read,讀數(shù)據(jù)函數(shù)指針

MLXWrite write,寫數(shù)據(jù)函數(shù)指針

MLXDelayus delayus,微秒延時(shí)函數(shù)指針

對于這些參數(shù),對象變量我們已經(jīng)定義了,它正是我們需要初始化的對象。在這些參數(shù)中,我們需要注意的是幾個(gè)函數(shù)指針,我們需要在應(yīng)用中定義這幾個(gè)函數(shù),并將函數(shù)指針作為參數(shù)。這幾個(gè)函數(shù)的類型如下:

/*定義讀MLX90614數(shù)據(jù)操作指針類型*/ typedef void (*MLXRead)(struct MLXObject *mlx,uint8_t cmd,uint8_t *rData,uint16_t rSize);/*定義寫MLX90614數(shù)據(jù)操作指針類型*/ typedef void (*MLXWrite)(struct MLXObject *mlx,uint8_t cmd,uint8_t *wData,uint16_t wSize);/*定義微秒延時(shí)操作指針類型*/ typedef void (*MLXDelayus)(volatile uint32_t nTime);

對于這幾個(gè)函數(shù)我們根據(jù)樣式定義就可以了,具體的操作可能與使用的軟硬件平臺有關(guān)系。在這里我們使用STM32F4的第2個(gè)I2C接口及其外設(shè)庫,所以具體函數(shù)定義如下:

/*從MLX90614接收數(shù)據(jù)*/ static void ReceiveFromMLX(MLXObjectType *mlx,uint8_t cmd,uint8_t *rData,uint16_t rSize) {HAL_I2C_Master_Transmit(&hlpti2c,mlx->devAddress,&cmd,1,1000);HAL_I2C_Master_Receive(&hlpti2c, mlx->devAddress,rData, rSize, 1000); }/*向MLX90614傳送數(shù)據(jù)*/ static void TransmitToMLX(MLXObjectType *mlx,uint8_t cmd,uint8_t *tData,uint16_t tSize) {uint8_t data[10];data[0]=cmd;for(int i=0;i<tSize;i++){data[i+1]=tData[i];}HAL_I2C_Master_Transmit(&hlpti2c,mlx->devAddress,data,tSize+1,1000); }

對于延時(shí)函數(shù)我們可以采用各種方法實(shí)現(xiàn)。我們采用的STM32平臺和HAL庫則可以直接使用HAL_Delay()函數(shù)。于是我們可以調(diào)用初始化函數(shù)如下:

MLXInitialization(&mlx0xB4ReceiveFromMLXTransmitToMLXHAL_Delay);

3.2、基于對象進(jìn)行操作

我們定義了對象變量并使用初始化函數(shù)給其作了初始化。接著我們就來考慮操作這一對象獲取我們想要的數(shù)據(jù)。我們在驅(qū)動(dòng)中已經(jīng)將獲取數(shù)據(jù)并轉(zhuǎn)換為轉(zhuǎn)換值的比例值,接下來我們使用這一驅(qū)動(dòng)開發(fā)我們的應(yīng)用實(shí)例。

/*讀取溫度值*/ void GetTemperatureDataFromMLX(void) {float tempObject;float tempAmbient;GetMLXTemperature(&mlx);tempObject=mlx.tempObject1;tempAmbient=mlx.tempAmbient; }

4、應(yīng)用總結(jié)

我們設(shè)計(jì)并實(shí)現(xiàn)了MLX90614紅外溫度傳感器的驅(qū)動(dòng)程序,并在此基礎(chǔ)上設(shè)計(jì)了一個(gè)簡單的應(yīng)用來驗(yàn)證之。事實(shí)上我們在實(shí)際項(xiàng)目中也是使用這一驅(qū)動(dòng)程序來實(shí)現(xiàn)應(yīng)用的,并且效果良好。

讀標(biāo)志與讀數(shù)據(jù)在時(shí)序控制上是有一些差別的,下發(fā)命令與接收數(shù)據(jù)之間沒有重啟的操作,這一點(diǎn)在操作它時(shí)需要注意。

我們在使用驅(qū)動(dòng)時(shí),一般會(huì)選擇使用GPIO模擬的I2C收發(fā)器,這樣穩(wěn)定性更好。而使用硬件I2C接口及其庫函數(shù)實(shí)現(xiàn)時(shí),經(jīng)常會(huì)有死鎖的事情發(fā)生。我們曾多次遇到,特別是在STM32的第一路I2C接口。至于第1I2C接口與其它的I2C接口有什么差異尚未確定。總之使用GPIO模擬I2C收發(fā)器更為穩(wěn)定。

歡迎關(guān)注:

?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的外设驱动库开发笔记13:MLX90614红外温度传感器驱动的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91网国产| 原创少妇半推半就88av | 综合 欧美 亚洲日本 | 国产成人8x视频一区二区 | 屁屁影院国产第一页 | 国产一区二区在线视频观看 | 男人天堂新地址 | 色婷婷久久五月综合成人 | 日本免费高清一区二区 | 青春草视频在线免费观看 | 97在线免费| 青青视频在线播放 | 色婷婷色婷婷 | 亚洲精品欧美激情 | 国产白拍| 午夜av影视 | 免费一级特黄特色大片 | av片免费在线 | 久久夜色精品国产噜噜亚洲av | 日本 奴役 捆绑 受虐狂xxxx | 色老头av | 国模精品一区二区三区 | 日韩一区在线免费观看 | 精品国产乱码一区二区三区99 | 一区二区三区视频在线 | 竹菊影视日韩一区二区 | 波多野结衣在线免费观看视频 | 亚洲欧美变态另类丝袜第一区 | 自拍偷拍在线播放 | 成年人视频在线观看免费 | av女优一区| 小草av在线| 国产福利一区二区三区 | 国产精品丝袜视频 | 特级新鲜大片片 | 精品成人一区二区三区 | av白浆| 亚洲天堂久久久 | 日韩mv欧美mv国产网站 | 激情伦成人综合小说 | 在线成人福利 | av在线超碰 | 日韩一区二区三区四区五区六区 | 日韩午夜在线视频 | 亚洲精品国产91 | 91看片网站| 日韩福利社 | 亚州av片| 国产51视频 | 麻豆av网站 | 成人精品视频一区二区 | 欧美一区在线看 | 中国特级黄色片 | 免费一级做a爰片久久毛片潮 | 中国久久| 久久久久久香蕉 | 亚洲清色| 亚洲视频图片小说 | 青春草免费视频 | 亚洲成人天堂 | 内射中出日韩无国产剧情 | 成人国产一区二区三区 | 国产黄色免费大片 | 二区久久 | 五月天黄色网址 | 激情区 | 欧美色综合 | 亚洲网站在线免费观看 | 99激情视频| 国产资源在线看 | 日韩成人av一区 | 中文字幕在线日亚洲9 | 精品99久久久久成人网站免费 | 操人视频在线观看 | 亚州av影院 | 欧美a级片在线观看 | 国产夜夜夜 | 操操操操操操操 | 午夜日韩 | 91精品国产色综合久久不卡粉嫩 | 色综合视频在线 | 久久偷看各类女兵18女厕嘘嘘 | 日本爱爱网址 | 国产成人精品一区在线播放 | 国产97在线 | 亚洲 | 粉嫩av一区二区夜夜嗨 | 天堂av最新网址 | 就要操av| 国产一区二区免费在线 | 国产www免费 | 天天操综合网 | av香蕉网 | 国产真实交换夫妇视频 | 在线观看中文字幕亚洲 | 在线看成人 | 精品视频91| 嫩草视频一区二区三区 | 欧美freesex黑人又粗又大 | 久久综合激的五月天 |