1.MLX90614簡介
MX90614是一款由邁來芯公司提供的低成本,無接觸溫度計。輸出數據和物體溫度呈線性比例,具有高精度和高分辨率。TO-39金屬封裝里同時集成了紅外感應熱電堆探測器芯片MLX81101(溫度是通過PTC或是PTAT元件測量)和信號處理專用集成芯片MLX90302,專門用于處理紅外傳感器輸出信號。用以阻礙可見光和近紅外光輻射的光學濾波器(可傳播長波)集成在封裝內提供對環境和日光的免疫。濾波器的波長通帶為5.5到14μm。由于集成了低噪聲放大器、17位模數轉換器和強大的數字信號處理芯片 MLX90302,使得高精度和高分辨度的溫度計得以實現。一個附加的片上溫度傳感器用來測量芯片的溫度。測量完兩個傳感器的輸出后,對應的環境溫度和物體溫度被計算出。計算所得物體溫度和環境溫度存儲在MLX90302的RAM單元,溫度分辨率為0.01℃,并可通過兩線 SMBus(系統管理總線)兼容協議接口(IIC與之兼容)(0.02℃分辨率)或是10位PWM(脈寬調制)輸出模式輸出。MLX90614出廠溫度范圍都進行過校準,傳感器測量的溫度為視場里所有物體溫度的平均值。
MLX90614 系列模塊是一組通用的紅外測溫模塊。 在出廠前該模塊已進行校驗及線性化,具有非接觸、體積小、精度高,成本低等優點。被測目標溫度和環境溫度能通過單通道輸出,并有兩種輸出接口,適合于汽車空調、室內暖氣、家用電器、手持設備以及醫療設備應用等。
MLX90614的出廠校準溫度范圍很廣:環境溫度-40 ~ 125 ?C,物體溫度-70 ~ 382.2 ?C。傳感器測量的溫度為視場里所有物體溫度的平均值。MLX90614 室溫下的標準精度為±0.5oC。醫療應用版本的傳感器可在人體溫度范圍內達到±0.1oC 的精度。
硬件接口:
引腳 |
說明 |
SCL |
|
SDA |
I2C數據線 |
VDD |
電源3.3~5V |
VSS |
數字地GND |
2 工作原理
MLX90614是由內部狀態機控制物體溫度和環境溫度的測量和計算,進行溫度后處理,并將結果通過PWM或是SMBus模式輸出。ASSP支持兩個IR傳感器。 (MLX90614xAx只有一個IR傳感器) IR傳感器的輸出通過增益可編程的低噪聲低失調電壓放大器放大,經過Sigma Delta調制器轉換為單一比特流并反饋給 DSP做后續的處理。信號通過可編程的(用 EEPROM 實現)FIR和IIR低通濾波器以進一步減低輸入信號的帶寬從而達到所需的噪聲特性和刷新率。IIR濾波器的輸出為測量結果并存于內部RAM中,其中三個單元可被用到:一個是片內溫度傳感器(片上PTAT或PTC),其余兩個為IR傳感器?;谝陨蠝y量結果,計算出對應的環境溫度Ta和物體溫度To,兩個溫度分辨率都為0.01℃。Ta和 To可通過兩種方式讀?。和ㄟ^兩線接口讀取RAM單元,(0.02℃分辨率,固定范圍)或者通過 PWM 數字模式輸出。(10位分辨率,范圍可配置)測量周期的最后一步為:測量所得Ta和To被重新調節為PWM所需的輸出分辨率,并且該數據存在PWM 狀態機的寄存器中,狀態機可以產生固定頻率和一定占空比來表示測量的數據。
3. 通訊協議
單片機與MLX90614紅外測溫模塊之間通信的方式是“類IIC”通信,意思就是通信方式跟IIC通信方式很像但又不是IIC,它有另外一個名字叫做SMBus。SMBus (System Management Bus)是1995年由 intel公司提出的一種高效同步串行總線,SMBus只有兩根信號線:雙向數據線和時鐘信號線,容許CPU與各種外圍接口器件以串行方式進行通信、交換信息,既可以提高傳輸速度也可以減小器件的資源占用,另外即使在沒有SMBus 接口的單片機上也可利用軟件進行模擬。。MLX90614 SMBus時鐘的最大頻率為100KHz,最小為 10KHz。
S 是起始信號,Sr是重發起始信號。
Rd讀使能,Wr寫使能。
A是應答,0為應答1為非應答(發送數據和讀取數據都需要應答)。
P 是停止信號。
PEC是CRC-8的多項式 a X8+X2+X1+1。每個字節的最高有效位首先傳送。
3.1 起始信號和停止信號
//發送起始信號
//時鐘為高電平時,數據由高電平變為低電平。
static void I2C1_Start(void)
{
I2C1_SDAout_Mode();//輸出模式
I2C1_SDAout(1);
I2C1_SCL(1);
Delay_Us(2);
I2C1_SDAout(0);
Delay_Us(2);
I2C1_SCL(0);//方便后續數據收發
Delay_Us(1);
}
//停止信號
//時鐘線為高電平時,數據線由低變高。
static void I2C1_Stop(void)
{
I2C1_SDAout_Mode();//輸出模式
I2C1_SCL(0);
I2C1_SDAout(0);
Delay_Us(5);
I2C1_SCL(1);
Delay_Us(5);
I2C1_SDAout(1);
}
3.2 數據傳輸時序
時鐘線為高時讀取數據。應答信號本身就是一位數據。
(1)獲取應答示例
//獲取應答信號
static u8 I2C1_Wait_Ack(void)
{
u8 cnt=0;
I2C1_SDAIN_Mode();//配置為輸入模式
I2C1_SDAout(1);
I2C1_SCL(0);//告訴從機,主機需要獲取數據
Delay_Us(5);
I2C1_SCL(1);//從機數據發送完成,主機開始讀取數據
while(I2C1_SDAin)
{
cnt++;
Delay_Us(5);
if(cnt>=100)return 1;
}
Delay_Us(5);
I2C1_SCL(0);//方便下一次數據收發
return 0;
}
(2)讀取一字節數據示例
//讀取一個字節數據
static u8 I2C1_Read_Byte(void)
{
u8 i=0;
u8 data=0;
I2C1_SDAIN_Mode();//配置為輸入模式
for(i=0;i<8;i++)
{
I2C1_SCL(0);//告訴從機,主機需要獲取數據
Delay_Us(5);
I2C1_SCL(1);//開始讀取數據
data<<=1;//默認收到0
if(I2C1_SDAin)data|=0x01;
Delay_Us(5);
}
I2C1_SCL(0);
return data;
}
時鐘線為低電平時發送數據。應答信號本身就是一位數據。
(3)發送應答示例
/***********發送應答信號**************************
**
**形參:u8 ack -- 0應答,1非應答
**
***************************************************/
static void I2C1_SendAck(u8 ack)
{
I2C1_SDAout_Mode();//輸出模式
I2C1_SCL(0);//告訴從機,主機開始發送數據
if(ack&0x01)
{
I2C1_SDAout(1);
}
else I2C1_SDAout(0);
Delay_Us(5);
I2C1_SCL(1);//告訴從機,主機數據發送完成
//方便下一次數據收發
Delay_Us(5);
I2C1_SCL(0);
}
(4)發送一字節數據示例
//發送一個字節數據
static void I2C1_Send_Byte(u8 data)
{
u8 i=0;
I2C1_SDAout_Mode();//輸出模式
for(i=0;i<8;i++)
{
I2C1_SCL(0);//告訴從機,主機開始發送數據
if(data&0x80)I2C1_SDAout(1);
else I2C1_SDAout(0);
Delay_Us(5);
I2C1_SCL(1);//主機數據發送完成
data<<=1;
Delay_Us(5);
}
I2C1_SCL(0);//方便下一次數據收發
}
3.3 讀取溫度數據示例
對該模塊操作主要是看懂幾個圖。模塊里有EEPROM和RAM兩塊,EEPROM里只有限定數目的地址是允許客戶改寫的。整個 EEPROM可通過SMBus接口讀和寫。
RAM中不能寫入數據,只能進行讀取,并且只有有限數目是客戶感興趣的。
TA是環境溫度地址,Tobj1是物體溫度低8位,Tobj2是物體溫度高8位。
讀取數據流程如下:設備地址為0x0
①發送起始信號-->②設備地址+寫使能(0x0)+獲取應答-->③發送讀取溫度命令(0x07)+獲取應答-->④發送起始信號-->⑤設備地址+讀使能(0x1)+獲取應答-->⑥讀取溫度低8位+發送應答-->⑦讀取溫度高8位+發送應答-->⑧發送停止信號;
//讀內存
uint16_t MLX906_ReadMemory(void)
{
uint8_t Pec,PecReg,ErrorCounter;
uint8_t TempL=0;
uint8_t TempH=0;
uint8_t arr[6];
ErrorCounter=0;
do
{
ErrorCounter++;
if(ErrorCounter==10)
{
return 0;
}
I2C1_Start();//起始信號
I2C1_Send_Byte(0x00);//發送MLX90614地址
I2C1_Wait_Ack();
I2C1_Send_Byte(0x07);//發送讀MLX90614 RAM地址
I2C1_Wait_Ack();
I2C1_Start();//重新啟動
I2C1_Send_Byte(0x01);//發送數據采集命令
I2C1_Wait_Ack();
TempL=I2C1_Read_Byte();//讀取地位數據
I2C1_SendAck(0);
TempH=I2C1_Read_Byte();//讀取高位數據
I2C1_SendAck(0);
Pec=I2C1_Read_Byte();//讀取校驗位
I2C1_SendAck(0);
I2C1_Stop();//停止信號
arr[5]= 0x00;
arr[4]= 0x07;
arr[3]= 0x01;
arr[2]= TempL;
arr[1]= TempH;
arr[0]= 0;
PecReg=CRC_Calculation(arr);//計算CRC校驗
}while(PecReg!=Pec);
return (uint16_t)((TempH<<8)|TempL);
}
2.2.4 CRC-8的多項式X8+X2+X1+1計算示例
//crc校驗
uint8_t CRC_Calculation(uint8_t pec[])
{
uint8_t crc[6];//存放多項式
uint8_t BitPosition = 47;
uint8_t shift;
uint8_t i,j,temp;
do
{
crc[5]=0;
crc[4]=0;
crc[3]=0;
crc[2]=0;
crc[1]=0x01;
crc[0]=0x07;
BitPosition = 47;
shift = 0;
i=5;
j=0;
while((pec[i]&(0x80>>j))==0 && i>0)
{
BitPosition--;
if(j<7)
{
j++;
}
else
{
j= 0x00;
i--;
}
}
shift= BitPosition-8;
while(shift)
{
for(i=5;i<0xFF;i--)
{
if((crc[i-1]&0x80)&&(i>0))
{
temp=1;
}
else
{
temp=0;
}
crc[i]<<=1;
crc[i]+=temp;
}
shift--;
}
for(i=0;i<=5;i++)
{
pec[i]^=crc[i];
}
}while(BitPosition>8);
return pec[0];
}
3.5 溫度轉換示例
- 環境溫度Ta
傳感器芯片溫度是通過PTC或是PTAT元件測量的,傳感器所有的狀態和數據處理都是在片內進行的,處理好的線性傳感器溫度Ta存于芯片內存里。計算好的溫度輸出分辨率為 0.02 ?C,傳感器的出廠校準范圍為40…+125 ?C。在RAM單元地址006h中,2DE4h對應-38.2 ?C (線性輸出最低限度) ,4DC4h (19908d)對應 125 ?C。通過下式將RAM內容轉換為實際的Ta溫度,結果是開爾文為單位。
環境溫度:
Ta[°K]=Targe*0.02;
物體溫度:
To[°K]=Targe*0.02;
轉換為攝氏度計算方法為:
Temp=Targe*0.02-273.5;
//讀溫度
float MLX906_Read_Temp(void)
{
return (float )MLX906_ReadMemory()*0.02-273.15;
}
-
濾波器
+關注
關注
161文章
7860瀏覽量
178928 -
STM32
+關注
關注
2272文章
10923瀏覽量
357556 -
I2C
+關注
關注
28文章
1495瀏覽量
124551 -
開發板
+關注
關注
25文章
5121瀏覽量
98193 -
紅外測溫
+關注
關注
2文章
200瀏覽量
15065
發布評論請先 登錄
相關推薦
評論