MLX90640 紅外熱成像傳感器測溫模塊開發(fā)筆記(三)
MLX90640 紅外熱成像儀測溫模塊開發(fā)筆記(三)工作流程和操作MLX90640 的一般步驟?

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