STM32F1读取MLX90614ESF非接触式温度传感器

MLX90614简介

迈来芯 MLX90614 是一款用于非接触式温度测量的红外温度计。IR 敏感型热电堆检测器芯片和信号调节 ASIC 都集成在同一 TO-39 罐封装中。MLX90614 集成有低噪声放大器、17 位 ADC 和强大的 DSP 单元,因此温度计兼具高精度和高分辨率。 该温度计出厂前已经过校准,可通过数字 SMBus 输出提供整个温度范围内的测量温度(分辨率为 0.02°C)。 用户可以将数字输出配置为脉宽调制 (PWM)。标准情况下,将 10 位 PWM 配置为以 0.14°C 的分辨率连续传输介于 -20 和 120°C 之间的测量温度。

使用STM32F1单片机操作MLX90614

  • MLX90614.c文件内容:
/*******************************************************************************
*   Filename:       bsp_mlx90614.c
*   Revised:        All copyrights reserved to Roger.
*   Date:           2020-10-17
*   Revision:       v1.0
*   Writer:	        Roger-WY.
*
*   Description:    非接触式红外温度传感器模块驱动(数字式)
*                   
*
*   Notes:          https://www.melexis.com/zh/product/MLX90614/MLX90614
*   All copyrights reserved to Roger-WY
*******************************************************************************/
#include "bsp_mlx90614.h"


//----------------------------------------------------------------------------//
#define MLX90614_I2C_SCL_RCC     RCC_APB2Periph_GPIOC
#define MLX90614_I2C_SCL_PIN	 GPIO_Pin_4			/* 连接到SCL时钟线的GPIO */
#define MLX90614_I2C_SCL_PORT    GPIOC

#define MLX90614_I2C_SDA_RCC     RCC_APB2Periph_GPIOC
#define MLX90614_I2C_SDA_PIN	 GPIO_Pin_5			/* 连接到SDA数据线的GPIO */
#define MLX90614_I2C_SDA_PORT    GPIOC


/* 定义读写SCL和SDA的宏 */
#define MLX90614_I2C_SCL_1()     MLX90614_I2C_SCL_PORT->BSRR = MLX90614_I2C_SCL_PIN			/* SCL = 1 */
#define MLX90614_I2C_SCL_0()     MLX90614_I2C_SCL_PORT->BRR  = MLX90614_I2C_SCL_PIN			/* SCL = 0 */

#define MLX90614_I2C_SDA_1()     MLX90614_I2C_SDA_PORT->BSRR = MLX90614_I2C_SDA_PIN			/* SDA = 1 */
#define MLX90614_I2C_SDA_0()     MLX90614_I2C_SDA_PORT->BRR  = MLX90614_I2C_SDA_PIN			/* SDA = 0 */

#define MLX90614_I2C_SDA_READ()  ((MLX90614_I2C_SDA_PORT->IDR & MLX90614_I2C_SDA_PIN) != 0)	/* 读SDA口线状态 */
#define MLX90614_I2C_SCL_READ()  ((MLX90614_I2C_SCL_PORT->IDR & MLX90614_I2C_SCL_PIN) != 0)	/* 读SCL口线状态 */


//----------------------------------------------------------------------------//



//============================================================================//


/*
********************************************************************************
*	函 数 名: Mlx90614_i2c_Delay
*	功能说明: I2C总线位延迟,最快400KHz
*	形    参:  无
*	返 回 值: 无
********************************************************************************
*/
static void Mlx90614_i2c_Delay(void)
{
    volatile uint8_t i;

	for (i = 0; i < 50; i++);
}


static void Mlx90614_i2c_Start(void)
{
	/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
	MLX90614_I2C_SDA_1();
	Mlx90614_i2c_Delay();
	MLX90614_I2C_SCL_1();
	Mlx90614_i2c_Delay();

	MLX90614_I2C_SDA_0();
	Mlx90614_i2c_Delay();
	MLX90614_I2C_SCL_0();
//	Mlx90614_i2c_Delay();
}

/*******************************************************************************
 * 名    称: i2c_Stop
 * 功    能: CPU发起I2C总线停止信号
 * 入口参数: 无
 * 出口参数: 无
 * 作  者: Roger-WY
 * 创建日期: 2018-05-20
 * 修    改:
 * 修改日期:
 * 备    注: 停止时序
 *            SCL _____/ˉˉˉˉˉˉˉ
 *            SDA _________/ˉˉˉˉˉ
 *                       |   |
 *                       STOP
 *******************************************************************************/
static void Mlx90614_i2c_Stop(void)
{
	/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */

	MLX90614_I2C_SCL_0();
	Mlx90614_i2c_Delay();
    MLX90614_I2C_SDA_0();
    Mlx90614_i2c_Delay();

	MLX90614_I2C_SCL_1();
	Mlx90614_i2c_Delay();
	MLX90614_I2C_SDA_1();
//	Mlx90614_i2c_Delay();
}

/*******************************************************************************
 * 名    称: i2c_WaitAck
 * 功    能: CPU产生一个时钟,并读取器件的ACK应答信号
 * 入口参数: 无
 * 出口参数: 返回0表示正确应答,1表示无器件响应
 * 作  者: Roger-WY
 * 创建日期: 2018-05-20
 * 修    改:
 * 修改日期:
 * 备    注:
 *******************************************************************************/
static uint8_t Mlx90614_i2c_WaitAck(void)
{
	uint8_t re;
    uint8_t TimeOutCnt = 20;  /* 超时计数器 */

	MLX90614_I2C_SDA_1();	/* CPU释放SDA总线 */
	Mlx90614_i2c_Delay();
	MLX90614_I2C_SCL_1();	/* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
	Mlx90614_i2c_Delay();

    while(TimeOutCnt -- ) {
        if (MLX90614_I2C_SDA_READ())	{/* CPU读取SDA口线状态 */
            re = 1;
        } else {
            re = 0;
        }
    }
	MLX90614_I2C_SCL_0();
	Mlx90614_i2c_Delay();
	return re;
}

/*******************************************************************************
 * 名    称: i2c_Ack
 * 功    能: CPU产生一个ACK信号
 * 入口参数: 无
 * 出口参数: 无
 * 作  者: Roger-WY
 * 创建日期: 2018-05-20
 * 修    改:
 * 修改日期:
 * 备    注:
 *******************************************************************************/
static void Mlx90614_i2c_Ack(void)
{
	MLX90614_I2C_SDA_0();	/* CPU驱动SDA = 0 */
	Mlx90614_i2c_Delay();
	MLX90614_I2C_SCL_1();	/* CPU产生1个时钟 */
	Mlx90614_i2c_Delay();
	MLX90614_I2C_SCL_0();
	Mlx90614_i2c_Delay();
	MLX90614_I2C_SDA_1();	/* CPU释放SDA总线 */
}

/*******************************************************************************
 * 名    称: i2c_NAck
 * 功    能: CPU产生1个NACK信号
 * 入口参数: 无
 * 出口参数: 无
 * 作  者: Roger-WY
 * 创建日期: 2018-05-20
 * 修    改:
 * 修改日期:
 * 备    注:
 *******************************************************************************/
static void Mlx90614_i2c_NAck(void)
{
	MLX90614_I2C_SDA_1();	/* CPU驱动SDA = 1 */
	Mlx90614_i2c_Delay();
	MLX90614_I2C_SCL_1();	/* CPU产生1个时钟 */
	Mlx90614_i2c_Delay();
	MLX90614_I2C_SCL_0();
	Mlx90614_i2c_Delay();
}

/*******************************************************************************
* 名    称: bsp_InitI2C
* 功    能: 配置I2C总线的GPIO,采用模拟IO的方式实现
* 入口参数: 无
* 出口参数: 无
* 作  者: Roger-WY
* 创建日期: 2018-06-29
* 修    改:
* 修改日期:
* 备    注:
*******************************************************************************/
static void Mlx90614_InitI2C(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(MLX90614_I2C_SCL_RCC | MLX90614_I2C_SDA_RCC, ENABLE);	/* 打开GPIO时钟 */

	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_OD;	        /* 开漏输出模式 */

	GPIO_InitStructure.GPIO_Pin = MLX90614_I2C_SCL_PIN;
	GPIO_Init(MLX90614_I2C_SCL_PORT, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = MLX90614_I2C_SDA_PIN;
	GPIO_Init(MLX90614_I2C_SDA_PORT, &GPIO_InitStructure);

	/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */
	Mlx90614_i2c_Stop();
}

/*******************************************************************************
 * 名    称: i2c_SendByte
 * 功    能: CPU向I2C总线设备发送8bit数据
 * 入口参数: _ucByte : 等待发送的字节
 * 出口参数: 无
 * 作  者: Roger-WY
 * 创建日期: 2018-05-20
 * 修    改:
 * 修改日期:
 * 备    注:
 *******************************************************************************/
static void Mlx90614_i2c_SendByte(uint8_t _ucByte)
{
	uint8_t i;

	/* 先发送字节的高位bit7 */
	for (i = 0; i < 8; i++) {
        MLX90614_I2C_SCL_0();
		Mlx90614_i2c_Delay();

		if (_ucByte & 0x80) {
			MLX90614_I2C_SDA_1();
		} else {
			MLX90614_I2C_SDA_0();
		}

        _ucByte <<= 1;	/* 左移一个bit */

		Mlx90614_i2c_Delay();

		MLX90614_I2C_SCL_1();
		Mlx90614_i2c_Delay();
	}
    MLX90614_I2C_SCL_0();
	Mlx90614_i2c_Delay();

}

/*******************************************************************************
 * 名    称: Mlx90614_i2c_ReadByte
 * 功    能: CPU从I2C总线设备读取8bit数据
 * 入口参数: 无
 * 出口参数: 读到的数据
 * 作  者: Roger-WY
 * 创建日期: 2018-05-20
 * 修    改:
 * 修改日期:
 * 备    注:
 *******************************************************************************/
static uint8_t Mlx90614_i2c_ReadByte(void)
{
	uint8_t i;
	uint8_t value;

	/* 读到第1个bit为数据的bit7 */
	value = 0;
	for (i = 0; i < 8; i++) {
		value <<= 1;
		MLX90614_I2C_SCL_0();
		Mlx90614_i2c_Delay();
        MLX90614_I2C_SCL_1();
		Mlx90614_i2c_Delay();

		if (MLX90614_I2C_SDA_READ()) {
			value++;
		}
	}
    MLX90614_I2C_SCL_0();
	Mlx90614_i2c_Delay();

	return value;
}

/*******************************************************************************
 * 名    称: bsp_Mlx90614ScanDevice
 * 功    能: 检测I2C总线设备,CPU向发送设备地址,然后读取设备应答来判断该设备是否存在
 * 入口参数:  _Address:设备的I2C总线地址
 * 出口参数: 返回值 0 表示正确, 返回1表示未探测到
 * 作  者: Roger-WY
 * 创建日期: 2018-05-20
 * 修    改:
 * 修改日期:
 * 备    注:
 *******************************************************************************/
int8_t bsp_Mlx90614ScanDevice(uint8_t *pSlaveAddr)
{
	uint8_t ucAck;
    
    Mlx90614_InitI2C();
	if (MLX90614_I2C_SDA_READ() && MLX90614_I2C_SCL_READ()) {
        
        for(uint8_t i = 0; i < 128; i++)
        {
            Mlx90614_i2c_Start();		/* 发送启动信号 */
            Mlx90614_i2c_SendByte(i << 1);
            ucAck = Mlx90614_i2c_WaitAck();	/* 检测设备的ACK应答 */
            Mlx90614_i2c_Stop();			/* 发送停止信号 */
            if(ucAck == 0)
            {
                *pSlaveAddr = i;    //找到设备并获取从机地址
                return 0;
            }
        }
        return -1;          //没有找到设备

	}
	return -2;	            /* I2C总线异常 */
}

//============================================================================//
static const uint8_t crc_table[] = {
    0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15, 0x38, 0x3f, 0x36, 0x31,
    0x24, 0x23, 0x2a, 0x2d, 0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65,
    0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d, 0xe0, 0xe7, 0xee, 0xe9,
    0xfc, 0xfb, 0xf2, 0xf5, 0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd,
    0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85, 0xa8, 0xaf, 0xa6, 0xa1,
    0xb4, 0xb3, 0xba, 0xbd, 0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2,
    0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea, 0xb7, 0xb0, 0xb9, 0xbe,
    0xab, 0xac, 0xa5, 0xa2, 0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a,
    0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32, 0x1f, 0x18, 0x11, 0x16,
    0x03, 0x04, 0x0d, 0x0a, 0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42,
    0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a, 0x89, 0x8e, 0x87, 0x80,
    0x95, 0x92, 0x9b, 0x9c, 0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4,
    0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec, 0xc1, 0xc6, 0xcf, 0xc8,
    0xdd, 0xda, 0xd3, 0xd4, 0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c,
    0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44, 0x19, 0x1e, 0x17, 0x10,
    0x05, 0x02, 0x0b, 0x0c, 0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34,
    0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b, 0x76, 0x71, 0x78, 0x7f,
    0x6a, 0x6d, 0x64, 0x63, 0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b,
    0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13, 0xae, 0xa9, 0xa0, 0xa7,
    0xb2, 0xb5, 0xbc, 0xbb, 0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8d, 0x84, 0x83,
    0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb, 0xe6, 0xe1, 0xe8, 0xef,
    0xfa, 0xfd, 0xf4, 0xf3
};

uint8_t CRC8_Calc (uint8_t *p, uint8_t len) 
{
    uint16_t i;
    uint16_t crc = 0x0;

    while (len--) {
            i = (crc ^ *p++) & 0xFF;
            crc = (crc_table[i] ^ (crc << 8)) & 0xFF;
    }

    return (crc & 0xFF);
}

/*******************************************************************************
* 名    称: bsp_Mlx90614Init
* 功    能: Mlx90614传感器的初始化
* 入口参数: 无
* 出口参数: 无
* 作  者: Roger-WY.
* 创建日期: 2018-08-08
* 修    改:
* 修改日期:
* 备    注:
*******************************************************************************/
int8_t bsp_Mlx90614Init(void)
{
    int8_t ucError      = 0;

    Mlx90614_InitI2C();

    return (ucError);

}

int8_t bsp_Mlx90614WriteReg(uint8_t devAddr, uint8_t regAddr, uint16_t data) 
{
    uint8_t ucAck = 0;
    uint8_t crcSendBuffer[5] = {0x00,0x00,0x00,0x00,0x00}; //used to save the data to send
   
    crcSendBuffer[0] = devAddr << 1;
    crcSendBuffer[1] = regAddr;
    crcSendBuffer[2] =  (uint8_t)data;
    crcSendBuffer[3] =  (uint8_t)(data >> 8);
    crcSendBuffer[4] = CRC8_Calc(crcSendBuffer,4);
    
    Mlx90614_i2c_Start();
    Mlx90614_i2c_SendByte(crcSendBuffer[0]);
    ucAck = Mlx90614_i2c_WaitAck();
    if(ucAck) {         /* 如果Mlx90614,没有应答 */
        goto cmd_fail;	/* 器件无应答 */
    }
    Mlx90614_i2c_SendByte(crcSendBuffer[1]);
    ucAck = Mlx90614_i2c_WaitAck();
    if(ucAck) {         /* 如果Mlx90614,没有应答 */
        goto cmd_fail;	/* 器件无应答 */
    }

    Mlx90614_i2c_SendByte(crcSendBuffer[2]);    //先发送低字节
    ucAck = Mlx90614_i2c_WaitAck();
    if(ucAck) {         /* 如果Mlx90614,没有应答 */
        goto cmd_fail;	/* 器件无应答 */
    }
    Mlx90614_i2c_SendByte(crcSendBuffer[3]);    //再发送高字节
    ucAck = Mlx90614_i2c_WaitAck();
    if(ucAck) {         /* 如果Mlx90614,没有应答 */
        goto cmd_fail;	/* 器件无应答 */
    }
    Mlx90614_i2c_SendByte(crcSendBuffer[4]);    //再发送PEC 
    ucAck = Mlx90614_i2c_WaitAck();
    if(ucAck) {         /* 如果Mlx90614,没有应答 */
        goto cmd_fail;	/* 器件无应答 */
    }
	/* 发送I2C总线停止信号 */
	Mlx90614_i2c_Stop();
	return 0;	/* 执行成功 */

cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */
	/* 发送I2C总线停止信号 */
	Mlx90614_i2c_Stop();
	return -1;

}

int8_t bsp_Mlx90614ReadReg(uint8_t devAddr, uint8_t regAddr,uint16_t *pReadData)
{
    uint8_t ucAck = 0;
    uint8_t ValBuf[6] = {0};
    uint8_t prcRegVal = 0;
    
    ValBuf[0] = devAddr << 1;
    ValBuf[1] = regAddr;
    ValBuf[2] = (devAddr << 1) | 0x01;
    

    Mlx90614_i2c_Start();
    Mlx90614_i2c_SendByte(ValBuf[0]);
    ucAck = Mlx90614_i2c_WaitAck();
    if(ucAck) {         /* 如果LM75X,没有应答 */
        goto cmd_fail;	/* 器件无应答 */
    }
    Mlx90614_i2c_SendByte(ValBuf[1]);
    ucAck = Mlx90614_i2c_WaitAck();
    if(ucAck) {         /* 如果LM75X,没有应答 */
        goto cmd_fail;	/* 器件无应答 */
    }    
    //------------------------------------------------------------------------//
    Mlx90614_i2c_Start();
    Mlx90614_i2c_SendByte(ValBuf[2]);
    ucAck = Mlx90614_i2c_WaitAck();
    if(ucAck) {         /* 如果LM75X,没有应答 */
        goto cmd_fail;	/* 器件无应答 */
    }

    ValBuf[3] = Mlx90614_i2c_ReadByte();
    Mlx90614_i2c_Ack();
    ValBuf[4] = Mlx90614_i2c_ReadByte();
    Mlx90614_i2c_Ack();
    ValBuf[5] = Mlx90614_i2c_ReadByte();
    Mlx90614_i2c_Ack();

	/* 发送I2C总线停止信号 */
	Mlx90614_i2c_Stop();

    prcRegVal = CRC8_Calc(ValBuf,5);
    if(prcRegVal == ValBuf[5])
    {
        *pReadData = (ValBuf[4] << 8) + ValBuf[3];
        return 0;	/* 执行成功 */
    }
    else
    {
        return -2;  //校验不正确
    }

cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 */
	/* 发送I2C总线停止信号 */
	Mlx90614_i2c_Stop();
	return -1;
}

float bsp_Mlx90614ReadTemp(uint8_t devAddr) 
{
	float temp;
	uint16_t data;

	if( 0 == bsp_Mlx90614ReadReg(devAddr,MLX90614_TOBJ1,&data))
    {
        temp = (data * 0.02) - 273.15;
    }
    else
    {
        temp = MLX90614_TEMP_READ_ERR_CODE;
    }

	return temp;
}


/***************************** (END OF FILE) **********************************/

  • MLX90614.h文件内容:
/*******************************************************************************
*   Filename:       bsp_mlx90614.h
*   Revised:        All copyrights reserved to Roger.
*   Date:           2020-10-17
*   Revision:       v1.0
*   Writer:	        Roger-WY.
*
*   Description:    非接触式红外温度传感器模块驱动(数字式)  头文件
*******************************************************************************/
#ifndef __BSP_MLX90614_H__
#define __BSP_MLX90614_H__

#include "stm32f10x.h"
#include "bsp_timer.h"

#define MLX90614_TEMP_READ_ERR_CODE -99

/* MLX90614 内部寄存器地址定义 */
/* Private defines -----------------------------------------------------------*/
/* DEFAULT SLAVE ADDRESS */
#define MLX90614_ADDR       0x5A
#define MLX90614_ADDR_WR   (MLX90614_ADDR << 1)

/* OPCODE DEFINES */
#define MLX90614_OP_RAM		0x00
#define MLX90614_OP_EEPROM	0x20
#define MLX90614_OP_SLEEP	0xFF

/* RAM offsets with 16-bit data, MSB first */
#define MLX90614_RAW1		(MLX90614_OP_RAM | 0x04) /* raw data IR channel 1 */
#define MLX90614_RAW2		(MLX90614_OP_RAM | 0x05) /* raw data IR channel 2 */
#define MLX90614_TAMB 		(MLX90614_OP_RAM | 0x06) /* ambient temperature */
#define MLX90614_TOBJ1 		(MLX90614_OP_RAM | 0x07) /* object 1 temperature */
#define MLX90614_TOBJ2 		(MLX90614_OP_RAM | 0x08) /* object 2 temperature */
/* EEPROM offsets with 16-bit data, MSB first */
#define MLX90614_TOMIN 		(MLX90614_OP_EEPROM | 0x00) /* object temperature min register */
#define MLX90614_TOMAX 		(MLX90614_OP_EEPROM | 0x01) /* object temperature max register */
#define MLX90614_PWMCTRL 	(MLX90614_OP_EEPROM | 0x02) /* pwm configuration register */
#define MLX90614_TARANGE 	(MLX90614_OP_EEPROM | 0x03) /* ambient temperature register */
#define MLX90614_EMISSIVITY (MLX90614_OP_EEPROM | 0x04) /* emissivity correction register */
#define MLX90614_CFG1 		(MLX90614_OP_EEPROM | 0x05) /* configuration register */
#define MLX90614_SA 		(MLX90614_OP_EEPROM | 0x0E) /* slave address register */
#define MLX90614_ID1 		(MLX90614_OP_EEPROM | 0x1C) /*[read-only] 1 ID register */
#define MLX90614_ID2 		(MLX90614_OP_EEPROM | 0x1D) /*[read-only] 2 ID register */
#define MLX90614_ID3 		(MLX90614_OP_EEPROM | 0x1E) /*[read-only] 3 ID register */
#define MLX90614_ID4 		(MLX90614_OP_EEPROM | 0x1F) /*[read-only] 4 ID register */

#define MLX90614_DBG_OFF    0
#define MLX90614_DBG_ON     1
#define MLX90614_DBG_MSG_W  0
#define MLX90614_DBG_MSG_R  1


/* MLX90614 供外部调用函数 */
int8_t bsp_Mlx90614Init(void);
int8_t bsp_Mlx90614ScanDevice(uint8_t *pSlaveAddr);
float bsp_Mlx90614ReadTemp(uint8_t devAddr);


#endif
/***************************** (END OF FILE) **********************************/

完整的工程

STM32F1 使用标准库函数读取MLX90614ESF非接触式温度传感器的完整工程可点击此处下载

PS:没有积分的小伙伴,可留言,我单独将工程发给您.

结束语

如果觉得文章对您有帮助,请关注点赞,谢谢!

版权声明:本文为CSDN博主「荻夜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012121390/article/details/112133291

生成海报
点赞 0

荻夜

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

4路红外循迹模块使用教程

4路红外循迹模块使用教程 个人原创博客:点击浏览模块详细信息: 工作电压:DC 3.3V~5V 工作电流:尽量选择1A以上电源供电 工作温度:-10℃~50℃ 安装孔

九轴运动传感器--BMX160,硬件开发与程序设计

九轴运动传感器–BMX160,硬件开发与程序设计 前言 和之前OPT3001传感器一块板子上的九轴传感器的代码我写完啦,和大家分享一下 硬件部分介绍 BMX160介绍 BMX160是博世的九轴运动传感器&#xff

STM32CubeMx hal 驱动sg90舵机

一、舵机的控制原理 舵机通过接收PWM信号,使其进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。即给舵机一个