红外测温之MLX90614教程

红外测温之MLX90614教程MLX90614
1 概述
MLX90614 是⼀款红外⾮接触温度计。TO-39 ⾦属封装⾥同
时集成了红外感应热电堆探测器芯⽚和信号处理专⽤集成芯
低温油墨⽚。
由于集成了低噪声放⼤器、17 位模数转换器和强⼤的数字信
号处理单元,使得⾼精度和⾼分辨度的温度计得以实现。
温度计具备出⼚校准化,有数字 PWM 和 SMBus(系统管理
总线)输出模式。
作为标准,配置为 10 位的 PWM 输出格式⽤于连续传送温
度范围为-20…120 ˚C 的物体温度,其分辨率为 0.14 ˚C。
POR 默认模式是 SMBus 输出格式。
2硬件电路图
在这⾥插⼊图⽚描述
PS:硬件判定脚位技巧:使⽤万⽤表利⽤外壳到GND,在结合脚位顺序就可以确定IO准确性了。
3 程序
源⽂件
#include "mlx90614.h"
#include "intrins.h"
/*******************************************************************************
/*******************************************************************************
* 函数名: MLX90614  硬件GPIO初始化
* 功能: MLX90614 完成GPIO端⼝初始化
* Input          : None
* Output        : None
* Return        : None
*******************************************************************************/
void MLX90614_Init( void ){
__BANK_SFRB =0;
P0 = 0xff; //1000 0000
P0OE = 0xff;
P0IE = 0x00;
P0PU = 0xff;
SMBUS_SCK_H;
SMBUS_SDA_H;
}
/
*******************************************************************************
* 函数名: MLX90614 发起始位 SMBus_StartBit
冰雕模具
* 功能: MLX90614 发起始位产⽣起始位
* Input          : None
* Output        : None
* Return        : None
*******************************************************************************/
void SMBus_StartBit( void ){
SMBUS_SDA_OUTPUT();
SMBUS_SDA_H;
SMBUS_DELAY_5US;
SMBUS_SCK_H;
SMBUS_DELAY_5US;
SMBUS_SDA_L;
SMBUS_DELAY_5US;
SMBUS_SCK_L;
SMBUS_DELAY_5US;
}
/*******************************************************************************
* 函数名: SMBus_StopBit
* 功能: MLX90614 发停⽌位 STOP condition on SMBus
* Input          : None
* Output        : None
* Return        : None
*******************************************************************************/
void SMBus_StopBit( void ){
SMBUS_SDA_OUTPUT();
SMBUS_SCK_L;        // Clear SCL line
SMBUS_DELAY_5US;  // Wait a few microseconds
SMBUS_SDA_L;        // Clear SDA line
SMBUS_DELAY_5US;  // Wait a few microseconds
SMBUS_SCK_H;        // Set SCL line
SMBUS_DELAY_5US;  // Stop condition setup time(Tsu:sto=4.0us min)    SMBUS_SDA_H;        // Set SDA line
}
/*******************************************************************************
* 函数名: SMBus_SendByte
* 功能: MLX90614 发送⼀个字节 Send a byte on SMBus
* Input          : Tx_buffer
* Output        : None
* Return        : None
*******************************************************************************/ unsigned char SMBus_SendByte( unsigned char Tx_buffer ){
unsigned char  Bit_counter;
unsigned char  Ack_bit;
unsigned char  bit_out;
for(Bit_counter=8; Bit_counter; Bit_counter-- ){
if( Tx_buffer&0x80 ){ //如果最⾼位为1
bit_out=1;  // 把最⾼位置1
}else{ //如果最⾼位为0
bit_out=0;  // 把最⾼位置0
}
SMBus_SendBit( bit_out ); // 把最⾼位发送出去
Tx_buffer<<=1;// 左移⼀位把最⾼位移出去等待下⼀个最⾼位,循环8次,每次都发最⾼位,就可把⼀个字节发出去了}
Ack_bit=SMBus_ReceiveBit();
return  Ack_bit;
}
/*******************************************************************************
* 函数名: SMBus_SendBit
* 功能: MLX90614 发送⼀个位 Send a bit on SMBus 82.5kHz
* Input          : bit_out
* Output        : None
* Return        : None
*******************************************************************************/
void SMBus_SendBit( unsigned char bit_out ){
SMBUS_SDA_OUTPUT();
if(bit_out==0){
SMBUS_SDA_L;
}else{
SMBUS_SDA_H;
}
SMBUS_DELAY_2US;
SMBUS_SCK_H;                    // Set SCL line
SMBUS_DELAY_6US;
SMBUS_SCK_L;                    // Clear SCL line
SMBUS_DELAY_3US;
return;
}
/*******************************************************************************
生铁冶炼
* Function Name  : SMBus_ReceiveBit
* Description    : Receive a bit on SMBus
* Input          : None
* Output        : None
* Return        : Ack_bit
*******************************************************************************/
unsigned char SMBus_ReceiveBit( void ){
unsigned char Ack_bit;简易信号发生器
SMBUS_SDA_H;          //引脚靠外部电阻上拉,当作输⼊
SMBUS_SDA_INPUT();
SMBUS_DELAY_2US;
SMBUS_SCK_H;            // Set SCL line
SMBUS_DELAY_5US;
if( SMBUS_SDA_PIN ){
Ack_bit=1;
}else{
Ack_bit=0;
}
SMBUS_SCK_L;            // Clear SCL line
SMBUS_DELAY_3US;
return  Ack_bit;
}
/
*******************************************************************************
* 函数名: SMBus_ReceiveByte
* 功能: Receive a byte on SMBus 从SMBus中接受⼀个字节的数据
* Input          : ack_nack
* Output        : None
* Return        : RX_buffer
*******************************************************************************/
unsigned char SMBus_ReceiveByte( unsigned char ack_nack ){
unsigned char  RX_buffer;
unsigned char  Bit_Counter;
for(Bit_Counter=8; Bit_Counter; Bit_Counter-- ){
if( SMBus_ReceiveBit()){ // Get a bit from the SDA line
RX_buffer <<=1;// If the bit is HIGH save 1in RX_buffer
RX_buffer |=0x01;//如果Ack_bit=1,把收到应答信号1与0000 0001 进⾏或运算,确保为1
}else{
RX_buffer <<=1;// If the bit is LOW save 0in RX_buffer
RX_buffer &=0xfe;//如果Ack_bit=1,把收到应答信号0与1111 1110进⾏与运算,确保为0
}
}
SMBus_SendBit( ack_nack ); // Sends acknowledgment bit 把应答信号发出去,如果1,就进⾏下⼀次通信,如果为0、,就拜拜了return RX_buffer;
}
/*******************************************************************************
* 函数名: SMBus_Delay
* 功能: 延时⼀次循环约1us
* Input          :time
* Output        : None
* Return        : None
*******************************************************************************/
void SMBus_Delay( unsigned int time){
//  unsigned int i, j;
unsigned  j;
//    for(i=0; i<4; i++)
//    {
/
/        for(j=0; j<time; j++);
//    }
for(j=0; j<time; j++ ){
_nop_();
_nop_();//_nop_();_nop_();
}
//while(time--);
//  _nop_();
//  _nop_();_nop_();
}
/*******************************************************************************
* 函数名: SMBus_Init
* 功能: SMBus初始化
* Input          : None
* Output        : None
* Return        : None
*******************************************************************************/
void MLX90614_SMBus_Init( void ){
MLX90614_Init();
}
/*******************************************************************************
* 函数名: SMBus_ReadMemory
* 功能: READ _data FROM RAM/EEPROM  从RAM和EEPROM中读取数据
* Input          : slaveAddress, command
* Return        : _data
* SMBus_ReadMemory(0x00, 0x07) 0x00 表⽰IIC设备的从地址从0x07这个寄存器开始读取
*******************************************************************************/
unsigned int SMBus_ReadMemory( unsigned char slaveAddress, unsigned char command){差分编码器
unsigned short _data;        // _data storage (_dataH:_dataL)
unsigned char Pec;              // PEC byte storage
unsigned char _dataL=0;        // Low _data byte storage
unsigned char _dataH=0;        // High _data byte storage
unsigned char arr[6];          // Buffer for the sent bytes
unsigned char PecReg;          // Calculated PEC byte storage
unsigned char ErrorCounter; // Defines the number of the attempts for communication with MLX90614 ErrorCounter=0x00;  // Initialising of ErrorCounter
slaveAddress <<=1; //2-7位表⽰从机地址从机地址左移⼀位,把读写位空出来
do{
repeat:
SMBus_StopBit();                //If slave send NACK stop comunication
--ErrorCounter;                //Pre-decrement ErrorCounter
if(!ErrorCounter ){          //ErrorCounter=0?毛细管数
break;                      //Yes,go out from do-while{}
}
SMBus_StartBit();              //Start condition
if( SMBus_SendByte( slaveAddress )){ //Send SlaveAddress 最低位Wr=0表⽰接下来写命令
goto    repeat;            //Repeat comunication again
}
if( SMBus_SendByte(command)){ //Send command
goto    repeat;            //Repeat comunication again
}
SMBus_StartBit();                  //Repeated Start condition
if( SMBus_SendByte( slaveAddress+1 )){ //Send SlaveAddress 最低位Rd=1表⽰接下来读数据
goto    repeat;                //Repeat comunication again
}
_dataL = SMBus_ReceiveByte( ACK );  //Read low _data,master must send ACK
_dataH = SMBus_ReceiveByte( ACK ); //Read high _data,master must send ACK
Pec = SMBus_ReceiveByte( NACK ); //Read PEC byte, master must send NACK
SMBus_StopBit();                //Stop condition
arr[5]= slaveAddress;      //
arr[4]=command;          //
arr[3]= slaveAddress+1;    //Load array arr
arr[2]= _dataL;                //
arr[1]= _dataH;                //
arr[0]=0;                //
PecReg=PEC_Calculation( arr ); //Calculate CRC 数据校验
} while( PecReg != Pec ); //If received and calculated CRC are equal go out from do-while{}
_data =( _dataH<<8)| _dataL; //_data=_dataH:_dataL
//return 15500;
return _data;
}
/*******************************************************************************
* 函数名: PEC_calculation
* 功能:数据校验
* Input          : pec[]
* Output        : None
* Return        : pec[0]-this byte contains calculated crc value
*******************************************************************************/
unsigned char PEC_Calculation( unsigned char pec[]){
unsigned char  crc[6];//存放多项式
unsigned char  BitPosition=47;//存放所有数据最⾼位,6*8=48最⾼位就是47位
unsigned char  shift;
unsigned char  i;
unsigned char  j;
unsigned char  temp;
do{
/*Load pattern value 0x00 00 00 00 01 07*/
crc[5]=0;
crc[4]=0;
crc[3]=0;
crc[2]=0;
crc[1]=0x01;
crc[0]=0x07;
/*Set maximum bit position at 47( six byte0,MSbit=47)*/
BitPosition=47;
/*Set shift position at 0*/

本文发布于:2024-09-21 22:37:45,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/99456.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:温度计   脚位   地址
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议