工作流程和操作MLX90640 的一般步驟 ![]()
默認參數(shù)時 MLX90640 的工作流程 (1) 上電,內部初始化(約 40ms) (2) 讀取工作參數(shù)到控制和狀態(tài)寄存器 (3) 開始以 2Hz 的速率測量實時數(shù)據并更新到 RAM,自動更新狀態(tài)寄存器。 測量幀解釋 MLX90640 共有 768 個測量像素點,每次測量其中的一半,稱為 1 幀,故此完成 768 像 素需要測量 2 幀,用幀 0 和幀 1 來表示。即:所謂的 1 幀數(shù)據其實是完整像素的一半。 可以修改的參數(shù) 可以修改的參數(shù)有以下幾個方面: ? 自動測量:默認為自動測量,即自動循環(huán)測量幀 0 和幀 1 更新到RAM 中。與其對應的是手動測量,即:用指令來控制測量幀 0 還是幀 1。手動測量已經在官方的數(shù)據手冊中被刪除,看來 MLX 也不喜歡別人用,所以我們也就別用了。自動測量保持默認值,不要改就好。 ? 幀分布:前面已經說了,1 幀實際上是測量完成了一半的像素點,這一半像素有兩種分布模式,手冊上稱為 TV 模式和 Chess 模式,TV 模式以行為單位,是指每幀只測量奇數(shù)行或者偶數(shù)行,Chess 模式是指以像素為單位,每次交錯著像素測 384 個像素點。我們可以稱之為“行交錯模式”和“像素交錯模式”。 在這方面,手冊上又說了,出廠時是以 Chess 模式校準的,具有最好的精度(言下之意就是說如果修改為了 TV 模式時會不準),鑒于此,這個參數(shù)也不要動。 ? 測量分辨率:可選的有 16~19 位 AD 轉換精度,默認是 18 位,轉換位數(shù)當然是越 高越好了,但 18 和 19 位經過測試也沒有發(fā)現(xiàn)有什么實際區(qū)別,這個參數(shù)可改可不改。 ? 測量速率:每秒測量幾幀數(shù)據,這個參數(shù)很有用處,畢竟我們希望成像后是連續(xù)的 動畫,每秒 2 次一定是不好的,我們可以調用 API 將這個參數(shù)修改為 8Hz 或者 16Hz 甚至 32Hz,64Hz 是不建議的,因為測量速率太快時噪聲特別大,圖像特別亂。普通相機的刷新速率也就 15Hz 左右,所以建議最高設置為 16Hz 吧。 所以,雖然數(shù)據手冊上寫的感覺好像可修改的參數(shù)挺多,這么一分析,其實只有 1 個測量速率是有用處的,其它都是浮云(雞肋)。 參數(shù)修改方法討論: 有兩種修改方法,修改寄存器和修改 EEPROM。 (1) 修改寄存器(推薦) 傳感器上電后會自動從 EEPROM 讀取參數(shù)到寄存器,寄存器內的參數(shù)值是運行時實際執(zhí)行的參數(shù),直接通過 I2C 修改寄存器值即可,隨用隨改、立即生效。寄存器的值是掉電遺失的, 所以每次上電后都要修改一次。 (2) 修改 EEPROM EEPROM 是掉電不丟失的,所以修改 EEPROM 內的運行參數(shù)只需要一次,下次啟動生效。但 EEPROM 內存儲的不僅只是同步到運行寄存器的幾個參數(shù),大部分的是 768 個像素的校準參數(shù),這些參數(shù)是出廠時寫入的,特別重要,所以我的建議還是不要對 EEPROM 有任何的寫操作,以免發(fā)生意外,EEPROM 里的像素校正參數(shù)一旦被意外修改就再也找不回來了。 MLX90640 底層驅動Keil 項目(STC 單片機)下載 建議的操作流程 unsigned short EE[832]; unsigned short Frame[834]; paramsMLX90640 MLXPars; float Vdd,Ta,Tr; float Temp[768]; IIC_Init(); //I2C 初始化 MLX90640_I2CInit(); //MLX 傳感器初始化 Delay_ms(50); //預留一點時間讓 MLX 傳感器完成自己的初始化 MLX90640_SetRefreshRate(0); //測量速率 1Hz(0~7 對應 0.5,1,2,4,8,16,32,64Hz) MLX90640_I2CRead(0x2400, 832, EE); //讀取像素校正參數(shù)MLX90640_ExtractParameters(EE, &MLXPars); //解析校正參數(shù)(計算溫度時需要) while (1) { Delay_ms(5); if (MLX90640_GetFrameData(Frame)==0) //有轉換完成的幀 { Vdd=MLX90640_GetVdd(Frame, MLXPars); //計算 Vdd(這句可有可無) Ta=MLX90640_GetTa(Frame, MLXPars); //計算實時外殼溫度 Tr=Ta-8.0; //計算環(huán)境溫度用于溫度補償 //手冊上說的環(huán)境溫度可以用外殼溫度-8℃ MLX90640_CalculateTo(Frame, MLXPars, 0.95, Tr, Temp); //計算像素點溫度 /* Temp 數(shù)組內即是轉換完成的實時溫度值,單位℃ 可以在這里對得到的 32*24=768 個溫度值進行處理、轉換為顏色值、顯示關于溫度轉顏色方法,在后續(xù)的文章中會有專門介紹 */ } } 一點疑問 校正參數(shù)存儲于傳感器內部的 EEPROM,實時數(shù)據也來自傳感器,如何利用實時數(shù)據和校正 參數(shù)計算溫度的方法也是事先規(guī)定好的,MLX 為什么不直接在內部完成這個溫度計算讓用戶直接讀取溫度值?為了體現(xiàn)這個傳感器的復雜性或者是讓用戶有成就感嗎? 本來可以在傳感器內部解決的問題被廠家要求在外部完成,對 MCU 的性能要求是特別高的, 大量的浮點運算,大量的RAM 消耗,較低的效率。 ![]() |
|
來自: 河北穩(wěn)控科技 > 《工程監(jiān)測》