教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 初中教育 >

基于STM32F103的MLX90614驱动

来源:网络收集 时间:2026-05-26
导读: 可以直接在STM32F103上面运行的驱动程序 $MLX90614.C /** ****************************************************************************** * *基于STM32F103的MLX90614红外温度传感器驱动程序 * *******************************************************

可以直接在STM32F103上面运行的驱动程序

$MLX90614.C

/** ****************************************************************************** * *基于STM32F103的MLX90614红外温度传感器驱动程序 * ****************************************************************************** *//* Includes ------------------------------------------------------------------*/#include"stdlib.h"#include"stm32f10x.h"//===============================================================================//#include"MLX90614.H"//-- IO Operate -#define SetBit_SDA GPIO_SetBits(GPIOB,GPIO_Pin_10)#define ClrBit_SDA GPIO_ResetBits(GPIOB,GPIO_Pin_10)#define SetBit_SCK GPIO_SetBits(GPIOB,GPIO_Pin_11)#define ClrBit_SCK GPIO_ResetBits(GPIOB,GPIO_Pin_11)#define STA_SDA GPIOB->IDR& GPIO_Pin_10#define STA_SCL GPIOB->IDR& GPIO_Pin_11//-- MLX90614 Command Mode -#define RAM#define EEPROM#define MODE#define EXITMODE#define READFLAG#define SLEEP#define RD#define WR//-- MLX90614 RAM Address -#define AMBITEMPADDR#define IR1ADDR#define IR2ADDR#define ENVITEMPADDR#define OBJ1TEMPADDR -70.01~ 382.19度#define OBJ2TEMPADDR -70.01~ 382.19度

0x00 0x20 0x60 0x61 0xf0 0xff 0x01 0x00

//对RAM进行操作//对EEPROM进行操作//进入命令模式//退出命令模式//读标志//进入睡眠模式//读操作//写操作

0x03 0x04 0x05 0x06 0x07 0x08

//周围温度//////环境温度 -40~ 125度//目标1温度,检测到的红外温度//目标2温度,检测到的红外温度

//-- MLX90614 EEPROM Address -#define TOBJMAXADDR 0x00#define TOBJMINADDR 0x01#define PWMCTRLADDR 0x02#define TARANGEADDR 0x03#define KEADDR 0x04#define CONFIGADDR 0x05#define SMBUSADDR 0x0e#define RES1ADDR 0x0f#define RES2ADDR 0x19#define ID1ADDR 0x1c#define ID2ADDR 0x1d#define ID3ADDR 0x1e

//测量温度上限设定//测量温度下限设定//PWM设定//环境温度设定//频率修正系数//配置寄存器//器件地址设定//保留//保留//ID地址1//ID地址2//ID地址3

可以直接在STM32F103上面运行的驱动程序

$MLX90614.C

#define

ID4ADDR

0x1f

//ID地址4

//-- Special Define -#define ACK_SUCCESS#define ACK_FAIL

0x01 0x00

//成功接收到应答信号//没有收到应答信号

#define

N

5

//以上宏定义可以放在头文件里面//============================================================================/** *@功能 I2C通信状态改变后的延时 *@说明无 *@参数无 *@返回值无 */ void I2C_Delay(void){ Delay_us(2);}/** *@功能产生通讯开始信号 *@说明 MLX90614在SCK=1时,检测到SDA由1到0表示通信开始 *@参数无 *@返回值无 */ void I2C_Start(void){ SetBit_SDA; SetBit_SCK; I2C_Delay(); ClrBit_SDA; I2C_Delay(); ClrBit_SCK; I2C_Delay();}/** *@功能产生通讯停止信号 *@说明 MLX90614在SCK=1时,检测到SDA由0到1表示通信结束 *@参数无 *@返回值无 */ void I2C_Stop(void){ ClrBit_SDA; ClrBit_SCK; I2C_Delay(); SetBit_SCK; I2C_Delay(); SetBit_SDA; I2C_Delay();}

可以直接在STM32F103上面运行的驱动程序

$MLX90614.C

/** *@功能将MLX90614的工作模式从PWM模式切换

到SMBus模式 *@说明从PWM模式切换到SMBus的方法是将SCL保持至少1.44ms以上的低电平 *如果PWM没有使能就不需要发送请求命令 *@参数无 *@返回值无 */ void PwmToSMBus(void){ ClrBit_SCK; Delay_us(1500);//大于1.44ms SetBit_SCK;}/** *@功能退出睡眠模式 *@说明保持SCK高电平后,SDA持续至少33ms低电平, *在退出睡眠模式后需要间隔250ms(典型值)才输出数据。 *@参数无 *@返回值无 */ void Eixt_Sleep(void){ SetBit_SCK; SetBit_SDA; I2C_Delay(); ClrBit_SDA; Delay_ms(35);//大于33ms退出睡眠模式 SetBit_SDA; Delay_ms(260);//大于250ms开始输出数据}/** *@功能从RAM/EEPROM中读取一个字节数据 *@说明从MLX90614中的指定地址读取一个字节数据,高位在前,低位在后 *@参数 ack_nack:主机应答信号 *@返回值 dat:读取的数据 */ uint8_t I2C_ReadByte(uint8_t ack_nack){ uint8_t i=0; uint8_t dat=0; ClrBit_SCK; Delay_us(5); for(i=0;i<8;i++){ dat= dat<<1; ClrBit_SCK; Delay_us(5*N); SetBit_SCK; Delay_us(5*N); if(STA_SDA){ dat= dat| 0x01;

可以直接在STM32F103上面运行的驱动程序

$MLX90614.C

}} ClrBit_SCK; Delay_us(3*N); if(!ack_nack) ClrBit_SDA; else SetBit_SDA; Delay_us(3*N); SetBit_SCK; Delay_us(4*N); ClrBit_SCK; Delay_us(4*N); return dat;}/** *@功能向EEPROM写一个字节数据 *@说明在写完一个字节后检测MLX6014是否发送了应答信号 *@参数 dat:需要发送的字节 *@返回值 s_ack:应答信号状态 */ uint8_t I2C_WriteByte(uint8_t dat){ uint8_t i=0; uint8_t s_ack=0; ClrBit_SCK; ClrBit_SDA; I2C_Delay(); for(i=0;i<8;i++){ ClrBit_SCK; Delay_us(3*N); if(dat&0x80){ SetBit_SDA;} else{ ClrBit_SDA;} dat= dat<<1; Delay_us(4*N); SetBit_SCK; Delay_us(4*N);}//第8个时钟下降沿

//在第9个时钟上升沿,主机发送应答信号//在第9个时钟上升沿,主机发送应答信号

//改变SDA状态

//SCK上升沿写入数据

ClrBit_SCK;//第8个下降沿开始,MLX90614将SDA置为低电平供主机检测是否正确接收 SetBit_SDA; Delay_us(2*N); SetBit_SCK;//第9个上升沿后,主机检测SDA状态 if(STA_SDA)//高电平表示正确接收数据

可以直接在STM32F103上面运行的驱动程序

$MLX90614.C

{ s_ack= ACK_FAIL;} else{ s_ack= ACK_SUCCESS;} Delay_us(2*N); ClrBit_SCK; Delay_us(4*N); return s_ack;}

/** *@功能读MLX90614的RAM中内容 *@说明主要读取三个,环境温度,物体温度1,物体温度2 *器件从地址可以通过向EEPROM的SMBus地址0x0E中写入来进行设定。 *@参数 saddr:从机地址,7位地址,任何MLX90614都会对0x00地址作出反应 * cmd:存放温度的寄存器地址 *@返回值 Data:读取出来的数值 */ uint16_t I2C_ReadRAM(uint8_t saddr,uint8_t cmd){ uint16_t Data; uint8_t DataL;//接收数据低字节 uint8_t DataH;//接收数据高字节 uint8_t PEC; uint8_t retry= 10;//失败重复次数 uint8_t s_ack= 0; uint8_t Pecreg;//计算的PEC值 uint8_t buf[6];//存储已接收数据的缓存 ClrBit_SCK; while(retry--){ I2C_Start();//发送起

始位 s_ack= I2C_WriteByte((saddr<<1)|WR);//发送从机地址和Wr位 if(s_ack== ACK_SUCCESS){ s_ack= 0; s_ack= I2C_WriteByte(RAM|cmd);//发送命令,8位,RAM表示对RAM操作,cmd表示操作RAM的地址 if(s_ack== ACK_SUCCESS){ s_ack= 0; I2C_Start();//重新发送起始位 s_ack= I2C_WriteByte((saddr<<1)+1);//发送从机地址和Rd位 if(s_ack== ACK_SUCCESS){ s_ack= 0; DataL= I2C_ReadByte(1);//读数据低字节 DataH= I2C_ReadByte(1);//读数据高字节 PEC= I2C_ReadByte( …… 此处隐藏:5138字,全部文档内容请下载后查看。喜欢就下载吧 ……

基于STM32F103的MLX90614驱动.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/47838.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)