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