简介
MLX90614 是一款红外非接触温度计。TO-39 金属封装里同时集成了红外感应热电堆探测器芯片和信号处理专用集成芯片。由于集成了低噪声放大器、17 位模数转换器和强大的数字信号处理单元,使得高精度和高分辨度的温度计得以实现。温度计具备出厂校准化,有数字 PWM 和 SMBus(系统管理总线)输出模式。作为标准,配置为 10 位的 PWM 输出格式用于连续传送温度范围为-20…120 ˚C 的物体温度,其分辨率为 0.14 ˚C。POR默认模式是SMBus输出格式 。
模块默认是SMBus输出格式 ,这里就用IIC来驱动mlx90614模块,IIC原理默认大家已经知道不详细讲,IIC使用的是STM32正点原子官方的文件,myiic.c,基本有以下几个函数
//IO操作函数
#define IIC_SCL PBout(6) //SCL
#define IIC_SDA PBout(7) //SDA
#define READ_SDA PBin(7) //输入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信号
MLX90614
对该模块操作主要是看懂几个图。模块里有EEPROM和RAM两块,
EEPROM 里只有限定数目的地址是允许客户改写的。整个 EEPROM 可通过 SMBus 接口读和写
而RAM 中不能写入数据,只能进行读取,并且只有有限数目是客户感兴趣的。
TA是环境温度地址,Tobj1是物体温度低8位,Tobj2是物体温度高8位。
接下来就是总线协议,读写数据的操作流程图
读取数据取决于命令,根据你发送的命令,从EEPROM或RAM中读取数据,而写数据只能写入EEPROM,RAM是只读的。
以上两图还需结合下面图进行解读
所以一个基本的驱动流程就是
1.启动
2.主机发送mlx90614的地址
3.等待mlx90614响应
4.发送读取RAM还是EEPORM指令
5.重新启动
6.发送读取指令
7.等待mlx90614响应
8.接收mlx90614传回的低8位数据
9.主机接收完响应
10.接收mlx90614传回的高8位数据
11.主机接收完响应
12.接收mlx90614传回的校验位数据
13.主机接收完响应
14.停止
其中发送读取RAM还是EEPORM指令,有对应的操作码,前三位是命令,后5位是地址。
如发送0x07就是访问Tobj1的地址,从机会返回低8位数据。
数据获取与处理
了解了基本信息,基本的驱动流程后,就可以开始写驱动代码了,
几个基本的参数,mlx90614的地址默认位00h,读取RAM的地址0x07,采集参数指令0x01;代码如下
#include "mlx90614.h"
#include "IIc.h"
u8 MLX90614_Data_receive(u8 Data[3])
{
IIC_Start();//启动
IIC_Send_Byte(0x00);//发送mlx90614从机地址
if(IIC_Wait_Ack())//等待响应,响应返回0,程序继续往下执行,不响应返回1,终止程序
return 0;
IIC_Send_Byte(0x07);//发送读mlx90614Ram地址
if(IIC_Wait_Ack())//等待响应
return 0;
IIC_Start();//重新启动
IIC_Send_Byte(0x01);//发送数据采集指令
if(IIC_Wait_Ack())//等待响应
return 0;
Data[0] = IIC_Read_Byte(1);//读取低位数据
Data[1] = IIC_Read_Byte(1);//读取高位数据
Data[2] = IIC_Read_Byte(1); //读取校验数据
IIC_Stop();//停止
return 1;
}
u16 MLX90614_Data_Process(u8 Data[3])
{
u16 temp;
temp = (Data[1]<<8)+Data[0];//高位与低位结合
temp = temp*2-27315;//将数据扩大100倍
return temp;
}
完全跟具流程写逻辑。
最后简单的将处理的数据显示在TFT液晶屏上。
#include "delay.h"
#include "IIC.h"
#include "lcd.h"
#include "usart.h"
#include "mlx90614.h"
int main()
{
u8 Data[3] = {0};
u16 temp;
u8 buff[20];
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
IIC_Init();
LCD_Init();
POINT_COLOR=RED;//设置字体为红色
while(1)
{
if(MLX90614_Data_receive(Data))
printf("数据获取正确\r\n");
else
printf("数据出错\r\n");
temp = MLX90614_Data_Process(Data);
sprintf((char*)buff,"LOW:%d",Data[0]);
LCD_ShowString(30,100,200,16,16,buff);
sprintf((char*)buff,"HIGH:%d",Data[1]);
LCD_ShowString(30,120,200,16,16,buff);
sprintf((char*)buff,"PEC:%d",Data[2]);
LCD_ShowString(30,140,200,16,16,buff);
sprintf((char*)buff,"temperature:%.2f",(float)temp/100);
LCD_ShowString(30,170,200,16,16,buff);
delay_ms(1000);
}
}
最后成果: