0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CW32模塊使用 MLX90614無接觸測(cè)溫傳感器

CW32生態(tài)社區(qū) ? 來源:CW32生態(tài)社區(qū) ? 作者:CW32生態(tài)社區(qū) ? 2024-11-14 17:50 ? 次閱讀

MLX90614 系列模塊是一組通用的紅外測(cè)溫模塊。在出廠前該模塊已進(jìn)行校驗(yàn)及線性化,具有非接觸、體積小、精度高,成本低等優(yōu)點(diǎn)。被測(cè)目標(biāo)溫度和環(huán)境溫度能通過單通道輸出,并有兩種輸出接口,適合于汽車空調(diào)、室內(nèi)暖氣、家用電器、手持設(shè)備以及醫(yī)療設(shè)備應(yīng)用等。測(cè)溫方式可分為接觸式和非接觸式,接觸式測(cè)溫只能測(cè)量被測(cè)物體與測(cè)溫傳感器達(dá)到熱平衡后的溫度,所以響應(yīng)時(shí)間長(zhǎng),且極易受環(huán)境溫度的影響;而紅外測(cè)溫是根據(jù)被測(cè)物體的紅外輻射能量來確定物體的溫度,不與被測(cè)物體接觸,具有影響動(dòng)被測(cè)物體溫度分布場(chǎng),溫度分辨率高、響應(yīng)速度快、測(cè)溫范圍廣、不受測(cè)溫上限的限制、穩(wěn)定性好等特點(diǎn),所以我們選擇mlx90614來作為紅外測(cè)溫模塊。

單片機(jī)與mlx90614紅外測(cè)溫模塊之間通信的方式是“類IIC”通信,意思就是通信方式跟IIC通信方式很像但又不是IIC,它有另外一個(gè)名字叫做SMBus。SMBus (System Management Bus)是 1995 年由 intel 公司提出的一種高效同步串行總線,SMBus 只有兩根信號(hào)線:雙向數(shù)據(jù)線和時(shí)鐘信號(hào)線,容許 CPU 與各種外圍接口器件以串行方式進(jìn)行通信、交換信息,即可以提高傳輸速度也可以減小器件的資源占用,另外即使在沒有SMBus 接口的單片機(jī)上也可利用軟件進(jìn)行模擬。

1、模塊來源

模塊實(shí)物展示:

wKgaomc1x9WAD7yOAAATWJHUNuA281.jpg


資料下載鏈接:
https://pan.baidu.com/s/1AsEBvVCiNAvTKqTeGSA60w
提取碼:g06n

2、規(guī)格參數(shù)

工作電壓:4.5~5.5V

工作電流:1.3~2.5mA

以上信息見廠家資料文件

3、移植過程

我們的目標(biāo)是將例程移植至CW32F030C8T6開發(fā)板上【能夠測(cè)量物體溫度和環(huán)境溫度的功能】。首先要獲取資料,查看數(shù)據(jù)手冊(cè)應(yīng)如何實(shí)現(xiàn)讀取數(shù)據(jù),再移植至我們的工程。

3.1查看資料

MLX90614中有兩個(gè)存儲(chǔ)器,分別為EEPROMRAM

MLX90614中共有32個(gè)字長(zhǎng)為16位的EEPROM存儲(chǔ)單元,其地址為000H—01FH。EEPROM中所有的寄存器都是可以通過SMBus進(jìn)行讀取,但只有部分寄存器是可以進(jìn)行改寫的(地址為0x00, 0x01, 0x02, 0x03, 0x04, 0x05*,0x0E, 0x0F, 0x19)。可改寫部分如下圖所示。因在出廠前模塊已進(jìn)行校驗(yàn)及線性化,所以我們直接使用默認(rèn)參數(shù),不需要修改。

wKgZomc1x9WAUAqgAABQPNXj6Y0849.jpg

wKgZomc1x9uAd0YwAAB93v_WcoI622.jpg

MLX90614中總共有32個(gè)17位的RAM存儲(chǔ)單元,用戶不能通過RAM來寫入數(shù)據(jù),只能讀取RAM中的部分存儲(chǔ)單元讀取16位存儲(chǔ)數(shù)據(jù)。其采集的環(huán)境溫度數(shù)據(jù)保存在地址06H存儲(chǔ)單元中,采集的被測(cè)物體溫度數(shù)據(jù)存儲(chǔ)在07H存儲(chǔ)單元中。因此運(yùn)用存儲(chǔ)在RAM地址中的數(shù)據(jù),通過公式的計(jì)算,可以得到環(huán)境溫度Ta及被測(cè)物體溫度數(shù)據(jù)To。

wKgaomc1x9uAaSjmAABKEBGcpjY365.jpg

需要注意的是數(shù)據(jù)的低8位在前面,高8位在后。

wKgZomc1x9yAB3CCAAB_qI9TIAc675.jpg

器件地址(Slave Address)在數(shù)據(jù)手冊(cè)中有說明,默認(rèn)器件地址為0X5A;

wKgaomc1x9yAPE0eAADMBBBZtO8770.jpg

命令(Command)是根據(jù)要控制的是RAM還是eeprom來決定一個(gè)字節(jié)中的BIT7~BIT5。剩余的BIT4~BIT0由要操控的地址決定。

wKgZomc1x92APrCdAABa1tudC4g239.jpg

例如,我要讀取RAM的Ta溫度數(shù)據(jù),則命令組成見下表。其中RAM地址為000x_xxxx,Ta溫度數(shù)據(jù)地址為0x06=0000_0110,只取低5位則為xxx0_0110。

wKgaomc1x92AB0A5AAAkLHuI5Y0186.jpg

PEC是一個(gè)多項(xiàng)式為X8+X2+X1+1的CRC-8校驗(yàn)數(shù)據(jù)。

在數(shù)據(jù)手冊(cè)中舉了兩個(gè)例子。其中0xB4為器件地址左移一位后的值。

wKgaomc1x-OAEwYQAACdgLSntN8230.jpg

得到溫度的原始數(shù)據(jù)后,根據(jù)數(shù)據(jù)手冊(cè)的說明進(jìn)行換算即可得到溫度。

wKgZomc1x-OAICLdAABV6ovySeo755.jpg

以上是手冊(cè)中舉了一個(gè)例子,如果讀取到的溫度數(shù)據(jù)是0X3AF7,其10進(jìn)制為15095,將10進(jìn)制數(shù) 除以50或者乘以0.02得到301.9,再減去273.15即可得到實(shí)際溫度。

溫度 = 溫度原始數(shù)據(jù) * 0.02 - 273.15

該溫度換算公式對(duì)To和Ta都適用。

3.2引腳選擇

wKgaomc1x-SAaWaKAAFuGlZ6O0o874.jpg

模塊接線圖

3.3移植至工程

工程模板參考入門手冊(cè)的工程模板

移植步驟中的導(dǎo)入.c和.h文件與【CW32模塊使用】DHT11溫濕度傳感器相同,只是將.c和.h文件更改為bsp_mlx90614.c與bsp_mlx90614.h。這里不再過多講述,移植完成后面修改相關(guān)代碼。

在文件bsp_mlx90614.c中,編寫如下代碼。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-ALP    first version
 */

#include "bsp_mlx90614.h"
#include "stdio.h"


/******************************************************************
 * 函 數(shù) 名 稱:MLX90614_GPIO_Init
 * 函 數(shù) 說 明:MLX90614的引腳初始化
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:MLX90614是5V,而且開發(fā)板開發(fā)板的引腳輸出是3.3V,
 *             故設(shè)置引腳模式時(shí),必須設(shè)置為開漏模式
******************************************************************/
void MLX90614_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結(jié)構(gòu)體

    RCC_MLX90614_ENABLE();        // 使能GPIO時(shí)鐘

    GPIO_InitStruct.Pins = GPIO_SCL|GPIO_SDA;             // GPIO引腳
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;           // 開漏輸出
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;              // 輸出速度高
    GPIO_Init(PORT_MLX90614, &GPIO_InitStruct);              // 初始化
}


/******************************************************************
 * 函 數(shù) 名 稱:IIC_Start
 * 函 數(shù) 說 明:IIC起始時(shí)序
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void IIC_Start(void)
{
        SDA_OUT();

        SDA(1);
        delay_us(5);
        SCL(1);
        delay_us(5);

        SDA(0);
        delay_us(5);
        SCL(0);
        delay_us(5);

}
/******************************************************************
 * 函 數(shù) 名 稱:IIC_Stop
 * 函 數(shù) 說 明:IIC停止信號(hào)
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void IIC_Stop(void)
{
        SDA_OUT();
        SCL(0);
        SDA(0);

        SCL(1);
        delay_us(5);
        SDA(1);
        delay_us(5);

}

/******************************************************************
 * 函 數(shù) 名 稱:IIC_Send_Ack
 * 函 數(shù) 說 明:主機(jī)發(fā)送應(yīng)答或者非應(yīng)答信號(hào)
 * 函 數(shù) 形 參:0發(fā)送應(yīng)答  1發(fā)送非應(yīng)答
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void IIC_Send_Ack(unsigned char ack)
{
        SDA_OUT();
        SCL(0);
        SDA(0);
        delay_us(5);
        if(!ack) SDA(0);
        else     SDA(1);
        SCL(1);
        delay_us(5);
        SCL(0);
        SDA(1);
}


/******************************************************************
 * 函 數(shù) 名 稱:I2C_WaitAck
 * 函 數(shù) 說 明:等待從機(jī)應(yīng)答
 * 函 數(shù) 形 參:無
 * 函 數(shù) 返 回:0有應(yīng)答  1超時(shí)無應(yīng)答
 * 作       者:LC
 * 備       注:無
******************************************************************/
unsigned char I2C_WaitAck(void)
{
        char ack = 0;
        unsigned char ack_flag = 10;
        SCL(0);
        SDA(1);
        SDA_IN();
        delay_us(5);
        SCL(1);
        delay_us(5);

        while( (SDA_GET()==1) && ( ack_flag ) )
        {
                        ack_flag--;
                        delay_us(5);
        }

        if( ack_flag <= 0 )
        {
                        IIC_Stop();
                        return 1;
        }
        else
        {
                        SCL(0);
                        SDA_OUT();
        }
        return ack;
}

/******************************************************************
 * 函 數(shù) 名 稱:Send_Byte
 * 函 數(shù) 說 明:寫入一個(gè)字節(jié)
 * 函 數(shù) 形 參:dat要寫人的數(shù)據(jù)
 * 函 數(shù) 返 回:無
 * 作       者:LC
 * 備       注:無
******************************************************************/
void Send_Byte(uint8_t dat)
{
        int i = 0;
        SDA_OUT();
        SCL(0);//拉低時(shí)鐘開始數(shù)據(jù)傳輸

        for( i = 0; i < 8; i++ )
        {
                SDA( (dat & 0x80) >> 7 );
                delay_us(1);
                SCL(1);
                delay_us(5);
                SCL(0);
                delay_us(5);
                dat

在文件bsp_mlx90614.h中,編寫如下代碼。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-ALP    first version
 */

#ifndef _BSP_MLX90614_H_
#define _BSP_MLX90614_H_

#include "board.h"

//端口移植
#define RCC_MLX90614_ENABLE()   __RCC_GPIOA_CLK_ENABLE()
#define PORT_MLX90614               CW_GPIOA


#define GPIO_SDA                    GPIO_PIN_1
#define GPIO_SCL                    GPIO_PIN_0

//設(shè)置SDA輸出模式
#define SDA_OUT()   {        
                        GPIO_InitTypeDef GPIO_InitStruct;                
                        GPIO_InitStruct.Pins = GPIO_SDA;                 
                        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;      
                        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;         
                        GPIO_Init(PORT_MLX90614, &GPIO_InitStruct);         
                     }
//設(shè)置SDA輸入模式
#define SDA_IN()    {        
                        GPIO_InitTypeDef GPIO_InitStruct;                
                        GPIO_InitStruct.Pins = GPIO_SDA;                 
                        GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;   
                        GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;         
                        GPIO_Init(PORT_MLX90614, &GPIO_InitStruct);         
                    }
//獲取SDA引腳的電平變化
#define SDA_GET()       GPIO_ReadPin(PORT_MLX90614, GPIO_SDA)
//SDA與SCL輸出
#define SDA(x)          GPIO_WritePin(PORT_MLX90614, GPIO_SDA, (x?GPIO_Pin_SET:GPIO_Pin_RESET) )
#define SCL(x)          GPIO_WritePin(PORT_MLX90614, GPIO_SCL, (x?GPIO_Pin_SET:GPIO_Pin_RESET) )



void MLX90614_GPIO_Init(void);
float MLX90614_Read(unsigned char SlaveAddr, unsigned char RegAddr);

void IIC_Stop(void);
#endif

4、移植驗(yàn)證

在自己工程中的main主函數(shù)中,編寫如下。

/*
 * Change Logs:
 * Date           Author       Notes
 * 2024-06-20     LCKFB-ALP    first version
 */
#include "board.h"
#include "stdio.h"
#include "bsp_uart.h"
#include "bsp_mlx90614.h"

int32_t main(void)
{
    board_init();        // 開發(fā)板初始化

    uart1_init(115200);        // 串口1波特率115200

    MLX90614_GPIO_Init();
    printf("Startrn");
    while(1)
    {
        float t = MLX90614_Read(0X5A, 0X07);
        if( t != 0)
        {
            printf("temperature = %.2frn", t);
        }
        delay_ms(1000);
    }
}

移植現(xiàn)象:測(cè)量手心溫度為36℃左右。

wKgZomc1x-SAP8VhAAC7wnooxI0678.jpg

模塊移植成功案例代碼:

鏈接:https://pan.baidu.com/s/1Ts1A7Eqng7yCa2YabmI6_A?pwd=LCKF

提取碼:LCKF

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2551

    文章

    51099

    瀏覽量

    753568
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    203

    瀏覽量

    641
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    MLX90614紅外溫度傳感器的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

    紅外溫度傳感器一般用于非接觸式的溫度檢測(cè)。在我們的系統(tǒng)中經(jīng)常會(huì)有這樣的需求。所以我們將其設(shè)計(jì)為通用的驅(qū)動(dòng)庫以備復(fù)用。這一篇我們將講述MLX90614紅外溫度傳感器驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)。
    發(fā)表于 12-12 14:53 ?7494次閱讀
    <b class='flag-5'>MLX90614</b>紅外溫度<b class='flag-5'>傳感器</b>的驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

    基于MLX90614的非接觸式體溫測(cè)量系統(tǒng)設(shè)計(jì)

    根據(jù)輻射測(cè)溫原理設(shè)計(jì)制作溫度測(cè)量系統(tǒng)。采用Melexis公司的MLX90614接觸測(cè)量的紅外溫度傳感器,通過SMBus協(xié)議與AT89S51單片機(jī)通訊,并通過單片機(jī)系統(tǒng)驅(qū)動(dòng)液晶顯示
    發(fā)表于 03-08 14:37

    紅外測(cè)溫傳感器MLX90614測(cè)溫的響應(yīng)時(shí)間是多少??????

    紅外測(cè)溫傳感器MLX90614測(cè)溫的響應(yīng)時(shí)間是多少??????
    發(fā)表于 05-16 20:59

    怎樣去設(shè)計(jì)一種基于MLX90614和OpenMV-H7的溫度傳感器

    MLX90614系列模塊是什么?OpenMV-H7又是什么?怎樣去設(shè)計(jì)一種基于MLX90614和OpenMV-H7的溫度傳感器呢?
    發(fā)表于 11-10 07:49

    為什么無法使用MSP430進(jìn)行調(diào)試MLX90614紅外測(cè)溫傳感器

    在用MSP430G2553調(diào)試MLX90614紅外測(cè)溫傳感器時(shí),輸出的值始終為-273.1,我認(rèn)為應(yīng)該是讀取寄存內(nèi)容為0所致,我的程序使用STM32程序修改后進(jìn)行調(diào)試的,原32程序輸
    發(fā)表于 11-29 06:08

    MLX90614簡(jiǎn)介

    1.MLX90614簡(jiǎn)介MLX90614是一款價(jià)格昂貴的非接觸式紅外溫度傳感器,尤其在疫情的影響下,其價(jià)格更是高不可攀,該傳感器主要用于不能
    發(fā)表于 12-08 06:51

    mlx90614進(jìn)行紅外測(cè)溫的方法

    做項(xiàng)目使用了NRF51822,要用mlx90614進(jìn)行紅外測(cè)溫,分享一下相關(guān)的使用。mlx90614是一款紅外非接觸溫度計(jì),有多個(gè)型號(hào),BAA、DCI等,不同封裝的
    發(fā)表于 01-10 08:17

    MLX90614醫(yī)用級(jí)紅外溫度傳感器的驅(qū)動(dòng)程序編寫

    咚咚咚————【封裝驅(qū)動(dòng)】MLX90614醫(yī)用級(jí)紅外溫度傳感器,自己編寫封裝的驅(qū)動(dòng)程序。/********************************************主控芯片:STM32
    發(fā)表于 01-25 07:09

    MLX90614系列傳感器搭配DM小板完成精準(zhǔn)測(cè)溫

    。小板搭載我邁萊芯MLX90614全系列傳感器及我司定制的DM801DH傳感器,使用方便。模組通信方式為串口TTL通信,并且人體溫度數(shù)據(jù) 我司已轉(zhuǎn)換為十進(jìn)制,也可以通過串口調(diào)試工具在電腦上安裝調(diào)試助手查看
    發(fā)表于 11-22 13:37

    如何使用 MLX90614 紅外測(cè)溫儀實(shí)現(xiàn) SMBus 通信

    本文檔介紹了 PIC 微控制中的 MLX90614 紅外溫度計(jì) SMBus 通信。本文檔還介紹了紅外測(cè)溫儀的應(yīng)用,以及典型電路示例和所用開發(fā)工具的匯編程序和 C 示例。 范圍 本應(yīng)用筆記介紹了如
    的頭像 發(fā)表于 06-21 17:47 ?8196次閱讀
    如何使用 <b class='flag-5'>MLX90614</b> 紅外<b class='flag-5'>測(cè)溫</b>儀實(shí)現(xiàn) SMBus 通信

    使用STM8S和MLX90614手持非接觸紅外測(cè)溫槍設(shè)計(jì)的工程文件和程序

    基于STM8S手持非接觸紅外測(cè)溫MLX90614 額溫槍設(shè)計(jì),包含原理圖、PCB、源程序等
    發(fā)表于 02-04 08:00 ?0次下載
    使用STM8S和<b class='flag-5'>MLX90614</b>手持非<b class='flag-5'>接觸</b>紅外<b class='flag-5'>測(cè)溫</b>槍設(shè)計(jì)的工程文件和程序

    溫度傳感器MLX90614的STM32驅(qū)動(dòng)實(shí)現(xiàn)

    1.MLX90614簡(jiǎn)介MLX90614是一款價(jià)格昂貴的非接觸式紅外溫度傳感器,尤其在疫情的影響下,其價(jià)格更是高不可攀,該傳感器主要用于不能
    發(fā)表于 11-25 20:06 ?67次下載
    溫度<b class='flag-5'>傳感器</b><b class='flag-5'>MLX90614</b>的STM32驅(qū)動(dòng)實(shí)現(xiàn)

    基于STM32的MLX90614人體紅外測(cè)溫

      今天分享一個(gè)項(xiàng)目是做一個(gè)紅外測(cè)溫的。這個(gè)東西網(wǎng)上都有現(xiàn)成的資料和代碼,做起來不難。關(guān)于紅外測(cè)溫用的芯片是mlx90614。...
    發(fā)表于 01-26 19:06 ?85次下載
    基于STM32的<b class='flag-5'>MLX90614</b>人體紅外<b class='flag-5'>測(cè)溫</b>槍

    使用mlx90614 ir進(jìn)行非接觸式溫度測(cè)量

    電子發(fā)燒友網(wǎng)站提供《使用mlx90614 ir進(jìn)行非接觸式溫度測(cè)量.zip》資料免費(fèi)下載
    發(fā)表于 10-31 11:19 ?1次下載
    使用<b class='flag-5'>mlx90614</b> ir進(jìn)行非<b class='flag-5'>接觸</b>式溫度測(cè)量

    使用MLX90614紅外非接觸式溫度傳感器

    電子發(fā)燒友網(wǎng)站提供《使用MLX90614紅外非接觸式溫度傳感器.zip》資料免費(fèi)下載
    發(fā)表于 11-11 15:21 ?8次下載
    使用<b class='flag-5'>MLX90614</b>紅外非<b class='flag-5'>接觸</b>式溫度<b class='flag-5'>傳感器</b>