STM32、GD32等驱动AMG8833热成像传感器源码分享

一、AMG8833介绍

1简介

AMG8833是一种红外热像传感器,也被称为热感传感器。它可以用来检测和测量物体的热辐射,并将其转换为数字图像。AMG8833传感器可以感知的热源范围为-20°C到100°C,并能提供8x8的像素分辨率。它通过I2C接口与微控制器或单片机进行通信,并可提供实时温度图像数据。AMG8833传感器被广泛用于热成像、人体检测、温度测量等应用领域。

2、引脚图

在这里插入图片描述

二、原理图

在这里插入图片描述

三、源码

1、iic.h

#ifndef _MYIIC_H
#define _MYIIC_H
#include "sys.h"//IO方向设置
#define SDA_IN()  {GPIOG->MODER&=~(3<<(12*2));GPIOG->MODER|=0<<12*2;}	//PH5输入模式
#define SDA_OUT() {GPIOG->MODER&=~(3<<(12*2));GPIOG->MODER|=1<<12*2;}  //PH5输出模式
//IO操作
#define IIC_SCL(n)  (n?HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOG,GPIO_PIN_11,GPIO_PIN_RESET)) //SCL
#define IIC_SDA(n)  (n?HAL_GPIO_WritePin(GPIOG,GPIO_PIN_12,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOG,GPIO_PIN_12,GPIO_PIN_RESET)) //SDA
#define READ_SDA    HAL_GPIO_ReadPin(GPIOG,GPIO_PIN_12)  //输入SDA//IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口				 
void IIC_Start(void);				//发送IIC开始信号
void IIC_Stop(void);	  			//发送IIC停止信号
void IIC_Send_Byte(u8 txd);			//IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void); 				//IIC等待ACK信号
void IIC_Ack(void);					//IIC发送ACK信号
void IIC_NAck(void);				//IIC不发送ACK信号void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);	 
#endif

2、iic.c

#include "iic.h"
#include "delay.h"//IIC初始化
void IIC_Init(void)
{GPIO_InitTypeDef GPIO_Initure;__HAL_RCC_GPIOG_CLK_ENABLE();   //使能GPIOH时钟//PH4,5初始化设置GPIO_Initure.Pin=GPIO_PIN_11|GPIO_PIN_12;GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出GPIO_Initure.Pull=GPIO_PULLUP;          //上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;    //快速HAL_GPIO_Init(GPIOG,&GPIO_Initure);IIC_SDA(1);IIC_SCL(1);  
}//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT();     //sda线输出IIC_SDA(1);	  	  IIC_SCL(1);delay_us(4);IIC_SDA(0);//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL(0);//钳住I2C总线,准备发送或接收数据 
}	  
//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL(0);IIC_SDA(0);//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL(1); IIC_SDA(1);//发送I2C总线结束信号delay_us(4);							   	
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN();      //SDA设置为输入  IIC_SDA(1);delay_us(1);	   IIC_SCL(1);delay_us(1);	 while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL(0);//时钟输出0 	   return 0;  
} 
//产生ACK应答
void IIC_Ack(void)
{IIC_SCL(0);SDA_OUT();IIC_SDA(0);delay_us(2);IIC_SCL(1);delay_us(2);IIC_SCL(0);
}
//不产生ACK应答		    
void IIC_NAck(void)
{IIC_SCL(0);SDA_OUT();IIC_SDA(1);delay_us(2);IIC_SCL(1);delay_us(2);IIC_SCL(0);
}					 				     
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答			  
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT(); 	    IIC_SCL(0);//拉低时钟开始数据传输for(t=0;t<8;t++){              IIC_SDA((txd&0x80)>>7);txd<<=1; 	  delay_us(2);   //对TEA5767这三个延时都是必须的IIC_SCL(1);delay_us(2); IIC_SCL(0);	delay_us(2);}	 
} 	    
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL(0); delay_us(2);IIC_SCL(1);receive<<=1;if(READ_SDA)receive++;   delay_us(1); }					 if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}

3、amg8833.h

#ifndef __AMG8833_H
#define __AMG8833_H
#include "sys.h"
#include "myiic.h"#define STATUS_OK       0x00
#define STATUS_FAIL     0x01#define AMG88xx_PIXEL_TEMP_CONVERSION 0.25f
#define AMG88xx_THERMISTOR_CONVERSION 0.0625fenum
{AMG88xx_PCTL = 0x00,AMG88xx_RST = 0x01,AMG88xx_FPSC = 0x02,AMG88xx_INTC = 0x03,AMG88xx_STAT = 0x04,AMG88xx_SCLR = 0x05,//0x06 reservedAMG88xx_AVE = 0x07,AMG88xx_INTHL = 0x08,AMG88xx_INTHH = 0x09,AMG88xx_INTLL = 0x0A,AMG88xx_INTLH = 0x0B,AMG88xx_IHYSL = 0x0C,AMG88xx_IHYSH = 0x0D,AMG88xx_TTHL = 0x0E,AMG88xx_TTHH = 0x0F,AMG88xx_INT_OFFSET = 0x010,AMG88xx_PIXEL_OFFSET = 0x80
};enum power_modes{AMG88xx_NORMAL_MODE = 0x00,AMG88xx_SLEEP_MODE = 0x01,AMG88xx_STAND_BY_60 = 0x20,AMG88xx_STAND_BY_10 = 0x21
};enum sw_resets {AMG88xx_FLAG_RESET = 0x30,AMG88xx_INITIAL_RESET = 0x3F
};enum frame_rates {AMG88xx_FPS_10 = 0x00,AMG88xx_FPS_1 = 0x01
};enum int_enables{AMG88xx_INT_DISABLED = 0x00,AMG88xx_INT_ENABLED = 0x01
};enum int_modes {AMG88xx_DIFFERENCE = 0x00,AMG88xx_ABSOLUTE_VALUE = 0x01
};void amg8833_init(uint8_t slaveAddress);
float amg8833_read_thermistor(uint8_t slaveAddress);
void amg8833_read_pixels(uint8_t slaveAddress,float *buf, uint8_t size);#endif

4、amg8833.c

#include "amg8833.h"
#include "delay.h"//IIC写一个字节数据
uint8_t amg8833_write_1byte(uint8_t slaveAddress, uint8_t reg,uint8_t data)
{IIC_Start();IIC_Send_Byte(slaveAddress<<1);if(IIC_Wait_Ack()){IIC_Stop();//释放总线return 1;//没应答则退出}IIC_Send_Byte(reg);IIC_Wait_Ack();	delay_us(5);IIC_Send_Byte(data);IIC_Wait_Ack();	IIC_Stop();return 0;
}//IIC读一个字节数据
uint8_t amg8833_read_1byte(uint8_t slaveAddress, uint8_t reg,uint8_t *data) 
{IIC_Start();IIC_Send_Byte(slaveAddress<<1);//发写命令if(IIC_Wait_Ack()){IIC_Stop();//释放总线return 1;//没应答则退出}		IIC_Send_Byte(reg);IIC_Wait_Ack();delay_us(5);IIC_Start(); IIC_Send_Byte((slaveAddress<<1)|0x01);//发读命令IIC_Wait_Ack();*data = IIC_Read_Byte(0);IIC_Stop();return 0;
}//I2C读多个字节数据
uint8_t amg8833_read_nbyte(uint8_t slaveAddress, uint8_t reg, uint8_t *buf, uint16_t len)
{IIC_Start();IIC_Send_Byte(slaveAddress<<1);//发写命令if(IIC_Wait_Ack()) {IIC_Stop();//释放总线return 1;//没应答则退出}IIC_Send_Byte(reg);IIC_Wait_Ack();delay_us(5);IIC_Start(); IIC_Send_Byte((slaveAddress<<1)|0x01);//发读命令IIC_Wait_Ack();while(len){if(1 == len){*buf = IIC_Read_Byte(0);}else{*buf = IIC_Read_Byte(1);}buf++;len--;}IIC_Stop();return STATUS_OK;
}//I2C写多个字节数据
uint8_t amg8833_write_nbyte(uint8_t slaveAddress, uint8_t reg, uint8_t *buf, uint16_t len)
{IIC_Start();IIC_Send_Byte(slaveAddress<<1);//发写命令if(IIC_Wait_Ack()) {IIC_Stop();//释放总线return 1;//没应答则退出}IIC_Send_Byte(reg);IIC_Wait_Ack();while(len--){IIC_Send_Byte(*buf++);IIC_Wait_Ack();}IIC_Stop();return STATUS_OK;
}void amg8833_init(uint8_t slaveAddress)
{uint8_t read = 0xaa;//enter normal modeamg8833_write_1byte(slaveAddress,AMG88xx_PCTL,AMG88xx_NORMAL_MODE);//software resetamg8833_write_1byte(slaveAddress,AMG88xx_RST,AMG88xx_INITIAL_RESET);//set to 10 FPSamg8833_write_1byte(slaveAddress,AMG88xx_FPSC,AMG88xx_FPS_10);amg8833_read_1byte(slaveAddress, AMG88xx_FPSC,&read);printf("write = 0x%02x  read = 0x%02x\r\n", AMG88xx_FPS_10,read);
}float signed_mag12_to_float(uint16_t val)
{//take first 11 bits as absolute valuint16_t absVal = (val & 0x7FF);return (val & 0x800) ? 0 - (float)absVal : (float)absVal ;
}float amg8833_read_thermistor(uint8_t slaveAddress)
{uint8_t raw[2];uint16_t recast;amg8833_read_nbyte(slaveAddress,AMG88xx_TTHL, raw, 2);recast = ((uint16_t)raw[1] << 8) | ((uint16_t)raw[0]);return signed_mag12_to_float(recast) * AMG88xx_THERMISTOR_CONVERSION;
}void amg8833_read_pixels(uint8_t slaveAddress,float *buf, uint8_t size)
{uint16_t recast;float converted;uint8_t rawArray[128],i;amg8833_read_nbyte(slaveAddress,AMG88xx_PIXEL_OFFSET,rawArray,128);for(i=0; i<size; i++){uint8_t pos = i << 1;recast = ((uint16_t)rawArray[pos + 1] << 8) | ((uint16_t)rawArray[pos]);        converted = signed_mag12_to_float(recast) * AMG88xx_PIXEL_TEMP_CONVERSION;buf[i] = converted;}
}

四、使用方法

#include "sys.h" 
#include "usart.h" 
#include "delay.h" 
#include "led.h"
#include "mpu.h"
#include "amg8833.h"int main(void)
{uint8_t slaveAddress = 0x69;float pixTempture[8][8];uint8_t i,j;Cache_Enable();					//打开L1-CacheHAL_Init();				        //初始化HAL库Stm32_Clock_Init(160,5,2,4);	//设置时钟,400Mhzdelay_init(400);				//延时初始化uart_init(115200);				//串口初始化led_init();						//初始化LED时钟MPU_Memory_Protection();		//保护相关存储区域IIC_Init();amg8833_init(slaveAddress);while(1){amg8833_read_pixels(slaveAddress,&pixTempture[0][0], 64);for(i=0;i<8;i++){for(j=0;j<8;j++){printf("%.2f    ",pixTempture[i][j]);}printf("\r\n");}printf("\r\n");printf("\r\n");toggle_g_led();delay_ms(1000);		} 
}

五、工程源码

点击下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/651429.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[笔试训练](八)

目录 022&#xff1a;求最小公倍数 023&#xff1a;数组中的最长连续子序列 024&#xff1a;字母收集 022&#xff1a;求最小公倍数 求最小公倍数_牛客题霸_牛客网 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 求最小公倍数公式&#xff1a;lcm(a,b)a*b/gcd(a,b)&am…

ssrf漏洞基础

ssrf &#xff08; server-side request forgery &#xff09; 服务端请求伪造 , 由服务器发起请求&#xff0c;服务器提供了向其他服务器索取数据的功能&#xff0c;索取数据的服务器未 对索取主机、索取资源进行限制&#xff1b; 输入 url 访问站点 xxx.com------------ 》…

软件过程与项目管理期末复习

文章目录 1. 课程导论1) 什么是项目&#xff1f;具有什么特征&#xff1f;2) 项目管理的4阶段5过程的具体内容是什么&#xff1f;3) 项目管理的10大知识域是哪些&#xff1f;其中4个是核心知识域&#xff1f;4个核心知识域之间是什么关系&#xff1f;4) 什么是质量管理三角形&a…

【AMBA Bus ACE 总线 6 -- ACE cache maintenance 详细介绍】

文章目录 ACE cache maintenance什么叫 cache maintenance operations呢?ACE cache line statesACE cache maintenance 什么叫 cache maintenance operations呢? 比如ARM CPU 对自己的Icache 和 Dcache会有大量的transaction操作,也即maintenance操作,如果cache 是dirty 话…

U盘格式转换GPT格式转回DOS

当前格式 fdisk /dev/sdb# 在 fdisk 提示符下&#xff0c;输入以下命令删除分区&#xff1a; d # 选择要删除的分区编号&#xff08;如 1、2 等&#xff09; w开始转换 [rootnode-24 ~]# fdisk /dev/sdbWelcome to fdisk (util-linux 2.37.4). Changes will remain in memory o…

qt用信号与槽,发送自定义结构体,一定要先注册,注册元对象 Q_DECLARE_METATYPE(Student)

//1.定义结构体 struct Student {int m_id;int m_age;QString m_name; };//2.注册元对象 Q_DECLARE_METATYPE(Student)class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(QWidget *parent 0);~MainWindow(); private slots:void onSigSendS…

【Unity基础】TextMeshPro组件学习过程记录

目录 1.TextMeshPro组件渲染创建文本RTL Editor字体Font Asset字体加粗&#xff0c;下划线等字体大小控制字体颜色控制字体渐变控制字符间隔、单词间隔、行间距、段落间距控制WrappingUV映射控制代码 2.TextMeshPro组件AssetFace InfoGeneration Setting 3.使用Dynamic SDF Sys…

【Redis】哨兵

文章目录 一、哨兵作用二、Redis哨兵架构三、哨兵运行流程和选举原理3.1、哨兵运行流程3.2、领导者哨兵的选举原理--Raft算法 四、哨兵使用建议 哨兵巡查监控后台master主机是否故障&#xff0c;如果故障了根据投票数自动将某一个从库转换为新主库&#xff0c;从而继续提供服务…

Spring MVC系列之九大核心组件

概述 Spring MVC是面试必问知识点其一&#xff0c;Spring MVC知识体系庞杂&#xff0c;有以下九大核心组件&#xff1a; HandlerMappingHandlerAdapterHandlerExceptionResolverViewResolverRequestToViewNameTranslatorLocaleResolverThemeResolverMultipartResolverFlashMa…

AWTK MODBUS Client channel 模型

名称&#xff1a;modbus_client_channel 功能&#xff1a;通过 modbus 协议访问远程 slave 设备上的数据&#xff0c;需要配合 modbus_client模型一起使用。用于将 modbus client 中的 channel 包装成view_model或者view_model_array 一般来说不需要&#xff0c;直接使用modbus…

施耐德 Unity Pro 编程软件导入导出变量

适用范围 施耐德中高端PLC&#xff0c;使用的编程软件为 UnityPro &#xff08;最新版更名为 Ecostructure Control Expert&#xff09; 中端 PLC&#xff1a;Premium&#xff0c;M340高端 PLC&#xff1a;Quantum&#xff0c;M580 导出/导入变量 导出变量可导出【变量和 FB…

[Android14] SystemUI的启动

1. 什么是System UI SystemUI是Android系统级应用&#xff0c;负责反馈系统及应用状态并与用户保持大量的交互。业务主要涉及的组成部分包括状态栏(Status Bar)&#xff0c;通知栏(Notification Panel)&#xff0c;锁屏(Keyguard)&#xff0c;控制中心(Quick Setting)&#xff…