学习GY906(GY906

您所在的位置:网站首页 od模块红色 学习GY906(GY906

学习GY906(GY906

2023-06-03 16:04| 来源: 网络整理| 查看: 265

目录

模块介绍

工作原理:

代码介绍:

1.一些宏定义:

2.起始条件与终止条件:

3.发送一个字节:

4.发送一位:

5.接收一个字节:

6.接收一位:

7.初始化

8. 读取数据:

9.计算接收字节:

10,计算并返回温度值:

11.主函数:

演示:​

模块介绍

GY906是一款红外热像仪传感器模块,可测量目标物体的温度,常用于非接触式温度测量和温度控制,GY906采用了MLX90614红外热敏传感器芯片和SMBus数字接口协议。

可以测量的温度范围是-40℃至85℃

而答主我学习的模块是GY906-DCI,采用了I2C数字接口协议通信,所以学习该模块的时候可以与IIC进行比较学习。

引脚:

VCC: 供电引脚,输入电压范围为3.3-5V。

GND: 地线引脚,连接地线。

SDA: 数据引脚,用于传输数据。

SCL: 时钟引脚,用于同步数据传输。

工作原理:

GY906红外温度模块是一种基于热电偶原理的红外温度测量模块。它可以快速测量目标物体离开模块一定距离处的温度。

该模块内置了一个MLX90614型红外温度传感器,该传感器由杜邦公司生产。MLX90614利用红外线向目标物体发射电磁辐射,然后快速测量被测目标的温度。电磁辐射通过一个双电荷制电磁感应元件(DPP)进入传感器,该元件检测红外能量,并产生一个电荷,该电荷随后被放大并转换为数字输出。MLX90614还集成了一些其他的芯片和组件,如温度补偿电路、电源调节器、EEPROM等,能够提供更加准确和稳定的测量结果。

GY906红外温度模块利用STM32等微处理器,通过I2C/SMBus接口与MLX90614进行通信,可以读取基础温度、环境温度和目标温度等信息。

代码介绍:

为了方便与IIC比较学习,每个代码我会借用江科大的IIC的时序图,以下有关IIC时序的图片皆来自江科大

1.一些宏定义: #include "mlx90614.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define ACK 0 //应答 #define NACK 1 //无应答 #define SA 0x00 //Slave address 单个MLX90614时地址为0x00,多个时地址默认为0x5a #define RAM_ACCESS 0x00 //RAM access command RAM存取命令 #define EEPROM_ACCESS 0x20 //EEPROM access command EEPROM存取命令 #define RAM_TOBJ1 0x07 //To1 address in the eeprom 目标1温度,检测到的红外温度 -70.01 ~ 382.19度 #define SMBUS_PORT GPIOB //PB端口(端口和下面的两个针脚可自定义) #define SMBUS_SCK GPIO_Pin_6 //PB6:SCL #define SMBUS_SDA GPIO_Pin_7 //PB7:SDA #define RCC_APB2Periph_SMBUS_PORT RCC_APB2Periph_GPIOB #define SMBUS_SCK_H() SMBUS_PORT->BSRR = SMBUS_SCK //置高电平 #define SMBUS_SCK_L() SMBUS_PORT->BRR = SMBUS_SCK //置低电平 #define SMBUS_SDA_H() SMBUS_PORT->BSRR = SMBUS_SDA #define SMBUS_SDA_L() SMBUS_PORT->BRR = SMBUS_SDA #define SMBUS_SDA_PIN() SMBUS_PORT->IDR & SMBUS_SDA //读取引脚电平 2.起始条件与终止条件:

/******************************************************************************* *函数名称:SMBus_StartBit *说明:在SMBus上生成START起始条件 *输入:无 *输出:无 *返回:无 *******************************************************************************/ void SMBus_StartBit(void) { SMBUS_SDA_H(); //释放SDA,将其拉高 SMBus_Delay(5); // 等待几微秒 SMBUS_SCK_H(); // 释放SCL,将其拉高 SMBus_Delay(5); //在Stop信号之间生成总线空闲时间 SMBUS_SDA_L(); // 拉低SDA SMBus_Delay(5); // Hold time after (Repeated) Start // 条件:在此周期后,生成第一个时钟。 //(Thd:sta=4.0us min)在SCK=1时,检测到SDA由1到0表示通信开始(下降沿) SMBUS_SCK_L(); // 拉低SCL SMBus_Delay(5); //等待几微秒 } /******************************************************************************* *函数名称:SMBus_StopBit *描述:在SMBus上产生停止条件 *输入:无 *输出:无 *返回值:无 *******************************************************************************/ void SMBus_StopBit(void) { /***先拉低SDA再释放SCL和SDA***/ SMBUS_SCK_L(); SMBus_Delay(5); SMBUS_SDA_L(); SMBus_Delay(5); SMBUS_SCK_H(); SMBus_Delay(5); SMBUS_SDA_H();// Set SDA line在SCK=1时,检测到SDA由0到1表示通信结束(上升沿) } 3.发送一个字节:

/******************************************************************************* *函数名称:SMBus_SendByte *描述:在SMBus上发送一个字节 *输入:Tx_buffer(要发送的字节) *输出:无 *返回值:无 *******************************************************************************/ u8 SMBus_SendByte(u8 Tx_buffer) { u8 Bit_counter; u8 Ack_bit; u8 bit_out; for(Bit_counter=8; Bit_counter; Bit_counter--) { if (Tx_buffer&0x80)//与10000000。就是最高跟1与 { bit_out=1; // I如果Tx_buffer当前位为1,则将bit_out设置为1,否则将其设置为0。 } else { bit_out=0; // 否则将bit_out清零 } SMBus_SendBit(bit_out); // 发送SDA上的当前位 Tx_buffer


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3