ADPD188BI 是完整的光電式測量系統(tǒng),適合采用光學(xué)雙波長技術(shù)的煙霧檢測應(yīng)用。 該模塊集成了高效率光電式測量前端、藍(lán)光和紅外(IR)發(fā)光二極管(LED)以及一個光電二極管,這些元件包含在定制封裝中,光線必須先進(jìn)入煙霧檢測室,而無法直接從LED到達(dá)光電二極管 。 ADPD188BI與EVAL-CHAMBER煙霧室配合使用,可創(chuàng)建一套完整的光學(xué)煙霧檢測解決方案,適用于住宅和工業(yè)煙霧探測器。 EVAL-CHAMBER可通過訂購EVAL-ADPD188BIZ-S2購買。
本應(yīng)用筆記說明如何使用已寫入片內(nèi)非易失性存儲器(NVM)的校準(zhǔn)系數(shù)來校準(zhǔn)ADPD188BI,從而將器件之間的差異降低至±10%以下。
對于特定的LED驅(qū)動器設(shè)置和測試/應(yīng)用環(huán)境,ADPD188BI的LED響應(yīng)會表現(xiàn)出器件間差異。 LED響應(yīng)的斜率(增益)和截距(失調(diào))隨器件而異,導(dǎo)致不同器件對同一環(huán)境的響應(yīng)存在差異,這可以利用增益和失調(diào)校準(zhǔn)系數(shù)進(jìn)行校準(zhǔn)。 這種校準(zhǔn)的主要應(yīng)用是可以對最終應(yīng)用中實例化的多個器件的輸出進(jìn)行更有效的比較。 此校準(zhǔn)可顯著減少器件之間的光學(xué)變化帶來的測量差異,并簡化對應(yīng)用環(huán)境特定的變化的觀測。
校準(zhǔn)ADPD188BI
測試方法
每對LED/驅(qū)動器會有多個LED電流進(jìn)入反射器,反射器的響應(yīng)由ADPD188BI模塊內(nèi)部的光電二極管測量。 針對每對LED/驅(qū)動器計算響應(yīng)的斜率,截距從線性回歸得出。 然后計算校準(zhǔn)系數(shù),并將其存儲在片內(nèi)NVM(也稱為eFuse寄存器)中,以供以后在最終應(yīng)用中使用。 校準(zhǔn)系數(shù)基于特定器件的每脈沖測量值計算,歸一化為從不同器件收集到的大量數(shù)據(jù)分布的平均值。 這種歸一化確保了大量器件中器件間的差異較小。
讀取eFuse寄存器
失調(diào)和增益校準(zhǔn)系數(shù)存儲在片內(nèi)eFuse寄存器中。 增益校準(zhǔn)系數(shù)LED1_GAIN_ COEFF和LED3_GAIN_COEFF分別存儲在寄存器0×71和0×72中。 失調(diào)校準(zhǔn)系數(shù)LED1_INT_COEFF和LED3_INT_COEFF分別存儲在寄存器0×73和寄存器0×74中。
要訪問eFuse寄存器,請執(zhí)行以下步驟:
- 設(shè)置寄存器0×4B的位7 = 1以使能32 kHz振蕩器。
- 將0×1寫入寄存器0×10以強(qiáng)制器件進(jìn)入編程(空閑)模式。
- 將0×1寫入寄存器0×5F以使能32 MHz先進(jìn)先出(FIFO)時鐘。
- 將0×7寫入寄存器0×57以使能對eFuse寄存器的訪問。
- 當(dāng)寄存器0×67 = 0×04時,eFuse寄存器的刷新完成,可以隨時對其進(jìn)行讀取。
- 應(yīng)用校準(zhǔn)系數(shù)之前,須對eFuse數(shù)據(jù)應(yīng)用糾錯碼(ECC)函數(shù)(參閱使用ECC檢測和校正EFUSE值的錯誤部分)。
- 確認(rèn)模塊ID 30、模塊ID 31、模塊ID 33或以上的寄存器0×70的內(nèi)容分別為0×1E、0×1F、0×21或更大。
- 讀取所需LED/驅(qū)動器對的增益和失調(diào)校準(zhǔn)系數(shù)。 使用eFuse寄存器的內(nèi)容,按照“計算校準(zhǔn)系數(shù)”部分中所述計算最終增益校準(zhǔn)系數(shù)。 得出最終增益校準(zhǔn)系數(shù)后,將其載入用戶可訪問的存儲器中以備將來使用。
- 完成對eFuse寄存器的讀取后,按照以下方式禁用eFuse寄存器:
- 將0×0寫入寄存器0×57以禁用對eFuse寄存器的訪問。
- 將0×0寫入寄存器0×5F以禁用32 MHz FIFO時鐘。
計算模塊ID 30和模塊ID 31的校準(zhǔn)系數(shù)
最終校準(zhǔn)系數(shù)必須使用寄存器0x71至寄存器0x74的內(nèi)容來計算,如下式所示:
GAIN_CAL_X = DEVICE_SCALAR/NOMINAL_SCALAR
其中:
DEVICE_SCALAR = x_GAIN × LEDx + x_INTERCEPT。
x_GAIN對于藍(lán)光通道LED為BLUE_GAIN,對于IR LED通道為IR_GAIN。
BLUE_GAIN = (17/256)(LED1_GAIN_COEFF ? 112) + 17。
IR_GAIN = (34/256)(LED3_GAIN_COEFF ? 112) + 34。
LEDx是以毫安為單位的LED驅(qū)動電流; 例如,若驅(qū)動電流 = 200 mA,則輸入200。 LEDx對于藍(lán)光LED通道為LED1,對于IR LED通道為LED3
x_INTERCEPT對于藍(lán)光LEDBLUE_INTERCEPT,對于IR_INTERCEPT通道為IR_INTERCEPT。
BLUE_INTERCEPT = 8(LED1_INT_COEFF ? 128)。
IR_INTERCEPT = 5(LED3_INT_COEFF ? 128)。
NOMINAL_SCALAR = x_MEAN_GAIN × LEDx + x_MEAN_INTERCEPT。
x_MEAN_GAIN對于藍(lán)光LED通道為17,對于IR LED通道為34。
x_MEAN_INTERCEPT對于藍(lán)光LED通道為622,對于IR LED通道為128。
表1.模塊ID 30和ID 31的eFuse寄存器的內(nèi)容| 地址 | 名稱 | 位 | 描述 |
| ------------------------ | ------ | ---- | ------ |
| 0×70 | MODULE_ID | [7:0] | 模塊 ID = 30 或 31 |
| 0×71 | LED1_GAIN_COEFF | [7:0] | 藍(lán)光LED增益系數(shù) |
| 0×72 | LED3_GAIN_COEFF | [7:0] | IR LED增益系數(shù) |
| 0×73 | LED1_INT_COEFF | [7:0] | 藍(lán)光LED截距系數(shù) |
| 0×74 | LED3_INT_COEFF | [7:0] | IR LED截距系數(shù) |
| 0×7E | 等 | [7:0] | 等 |
計算模塊ID 33的校準(zhǔn)系數(shù)
最終校準(zhǔn)系數(shù)必須使用寄存器0x71至寄存器0x74的內(nèi)容來計算,如下式所示:
GAIN_CAL_X = DEVICE_SCALAR/NOMINAL_SCALAR
其中:
DEVICE_SCALAR = x_GAIN × LEDx + x_INTERCEPT。
x_GAIN對于藍(lán)光LED通道為BLUE_GAIN,對于IR LED通道為IR_GAIN。
BLUE_GAIN = (21/256)(LED1_GAIN_COEFF ? 112) + 21。
IR_GAIN = (42/256)(LED3_GAIN_COEFF ? 112) + 42。
LEDx是以毫安為單位的驅(qū)動電流; 例如,若驅(qū)動電流 = 200 mA,則輸入200。 LEDx對于藍(lán)光LED通道為LED1,對于IR LED通道為 LED3 。
x_INTERCEPT對于藍(lán)光LED通道為BLUE_INTERCEPT,對于IR LED通道為IR_INTERCEPT。
BLUE_INTERCEPT = 8(LED1_INT_COEFF ? 80)。
IR_INTERCEPT = 5(LED3_INT_COEFF ? 80)。
NOMINAL_SCALAR = x_MEAN_GAIN × LEDx + x_MEAN_INTERCEPT。
x_MEAN_GAIN對于藍(lán)光LED通道為21,對于IR LED通道為42。
x_MEAN_INTERCEPT對于藍(lán)光LED通道為753,對于IR LED通道為156。
校準(zhǔn)32 kHz和32 kHz振蕩器以獲得出色的系統(tǒng)性能
校準(zhǔn)32 kHz和32 MHz片內(nèi)振蕩器以獲得出色的性能。 32 kHz振蕩器確定ADPD188BI的整體采樣速率,32 MHz振蕩器則影響ADPD188BI的總增益。 對于模塊ID = 33的器件,讀取eFuse寄存器(寄存器0×77和寄存器0×78),并將這些值分別寫入器件寄存器0×4B和寄存器0×4D。 或者,用戶也可按照ADPD188BI數(shù)據(jù)手冊中所述的32 kHz和32 MHz時鐘校準(zhǔn)程序手動確定最優(yōu)設(shè)置。
A基于模塊ID應(yīng)用正確的方程
為實現(xiàn)優(yōu)質(zhì)操作,讀取eFuse寄存器0×70以確定模塊ID并應(yīng)用合適的方程。 下面是用戶軟件一部分的條件語句示例。
檢查模塊 ID 案例(模塊 ID
):
對于ID 30和31案例30,31
:
GAIN_CAL_BLUE =(使用計算模塊 ID 30 和模塊 ID 31 的校準(zhǔn)系數(shù)中顯示的方程式)GAIN_CAL_IR =(使用計算模塊 ID 30 和模塊 ID 31 的校準(zhǔn)系數(shù)中顯示的方程式)
對于 ID 33
案例 33:
GAIN_CAL_BLUE =(使用計算模塊 ID 33 的校準(zhǔn)系數(shù)中顯示的公式) GAIN_CAL_IR =(使用計算模塊 ID 33 的校準(zhǔn)系數(shù)中顯示的公式)
案例待定 1:離開以備將來擴(kuò)展 案例待定 2:離開以備將來擴(kuò)展
默認(rèn)值:引發(fā)錯誤
表2.模塊ID 33的eFuse寄存器的內(nèi)容| 地址 | 名稱 | 位 | 描述 |
| ------------------------ | ------ | ---- | ------ |
| 0×70 | MODULE_ID | [7:0] | 模塊ID = 33 |
| 0×71 | LED1_GAIN_COEFF | [7:0] | 藍(lán)光LED增益系數(shù) |
| 0×72 | LED3_GAIN_COEFF | [7:0] | IR LED增益系數(shù) |
| 0×73 | LED1_INT_COEFF | [7:0] | 藍(lán)光LED截距系數(shù) |
| 0×74 | LED3_INT_COEFF | [7:0] | IR LED截距系數(shù) |
| 0×77 | 32kHz_OSC_OPT_ADJUST | [7:0] | 32 kHz振蕩器最優(yōu)調(diào)整設(shè)置 |
| 0×78 | 32MHz_OSC_OPT_ADJUST | [7:0] | 32 MHz振蕩器最優(yōu)調(diào)整設(shè)置 |
| 0×7E | 等 | [7:0] | 等 |
應(yīng)用校準(zhǔn)系數(shù)
要在最終應(yīng)用中應(yīng)用校準(zhǔn)系數(shù),請執(zhí)行以下步驟:
- 根據(jù)需要配置ADPD188BI器件。
- 將0x2寫入地址0x10以開始正常采樣操作。
- 在所需LED的電平下進(jìn)行測量并執(zhí)行以下計算:
歸一化輸出(LSBs) = AFE_OUT/GAIN_CAL_x
其中:
AFE_OUT = LED亮起時的原始輸出測量值。
GAIN_CAL_x對于藍(lán)光LED通道為GAIN_CAL_BLUE,對于IR LED通道為GAIN_CAL_IR。
應(yīng)用校準(zhǔn)系數(shù)可大大減小器件之間的差異。 圖1和圖2顯示了校準(zhǔn)前后藍(lán)光LED和IR LED的直方圖。 圖1和圖2說明,在兩種情況下,器件間差異的分布范圍縮小到±10%以下。
圖2.校準(zhǔn)前后的IR LED響應(yīng)
eFuse內(nèi)容對器件正常操作的影響
寫入ADPD188BI eFuse寄存器的校準(zhǔn)系數(shù)不會改變器件性能或規(guī)格。 所有數(shù)據(jù)手冊規(guī)格和器件性能本質(zhì)上不受eFuse寄存器編程的影響。
校準(zhǔn)系數(shù)旨在用于采樣數(shù)據(jù)的后處理,以便校準(zhǔn)器件之間的光學(xué)特性差異。 無論對eFuse寄存器進(jìn)行編程與否,ADPD188BI的性能都沒有差異。 在eFuse寄存器寫有校準(zhǔn)系數(shù)的情況下,只有在軟件中對采樣數(shù)據(jù)實施后處理校準(zhǔn)程序時,eFuse寄存器中存儲的數(shù)據(jù)才會對最終數(shù)據(jù)產(chǎn)生影響。
使用ECC檢測并校正eFuse值的錯誤
“ECC的C代碼”部分中顯示的C代碼包含了使用漢明碼檢測和校正存儲的eFuse寄存器值中錯誤的例程。 這些函數(shù)使用傳統(tǒng)的127120海明碼,截斷為119112。 其中添加了一個額外的全局奇偶校驗位,以實現(xiàn)2位故障檢測以及1位校正。 最終形式是120,112,它將8位奇偶校驗碼添加到每個112位(14字節(jié))塊中。
此代碼可100%檢測并修復(fù)每個數(shù)據(jù)塊中的1位錯誤,并能100%檢測到每個數(shù)據(jù)塊中的2位故障。
方法如下:將eFuse數(shù)據(jù)和奇偶校驗字節(jié)讀入本地存儲器。 用戶必須讀取寄存器0×70至寄存器0×7E。 寄存器至寄存器0×7D與輸入指針和數(shù)據(jù)相關(guān)聯(lián),必須將其讀入數(shù)據(jù)數(shù)組。 寄存器與輸入指針和奇偶校驗相關(guān)聯(lián),必須作為奇偶校驗值讀入。 使用命令驗證該塊。 此函數(shù)會在原位修復(fù)單個損壞的位。 如果fix_hamm_parity命令返回錯誤,則將器件標(biāo)記為已損壞。
此過程可修復(fù)所有1位故障,檢測到所有2位故障和約6%的3位故障,并檢測到大多數(shù)偶數(shù)故障。
回流焊對校準(zhǔn)系數(shù)的影響
在氧含量不受控制的回流爐中進(jìn)行回流焊時,可能導(dǎo)致光電二極管對藍(lán)光LED的響應(yīng)降低。 平均而言,每次回流,光電二極管對藍(lán)光LED的響應(yīng)會有約7%的偏移。 校準(zhǔn)系數(shù)是在最終測試時寫入的,先于ADPD188BI的任何回流。 因此,如果ADPD188BI在含氧量不受控制的爐中進(jìn)行回流焊,藍(lán)光系數(shù)便不再準(zhǔn)確。
圖3顯示了在氧含量不受控制的烤箱中回流后的原始藍(lán)光響應(yīng)和校準(zhǔn)后的響應(yīng)。 這組器件經(jīng)過了三次回流。 數(shù)據(jù)包括每次回流后的測試數(shù)據(jù)。 從數(shù)據(jù)中可以看出,每次回流后,藍(lán)光LED響應(yīng)約有7%的偏移。
圖3.回流焊期間,不受控制的氧含量引起的藍(lán)光LED響應(yīng)的偏移
為避免響應(yīng)偏移,應(yīng)使用通過氮氣降低爐中氧含量的回流爐。 當(dāng)使用氮氣控制的回流爐將氧含量控制在1000 ppm以下時,藍(lán)光LED響應(yīng)不會因為回流焊發(fā)生偏移。
圖4中的數(shù)據(jù)顯示了已在爐中回流三次的器件的原始藍(lán)光LED響應(yīng)值和校準(zhǔn)后的響應(yīng)值,該爐使用氮氣吹掃,氧含量降低至1000 ppm以下。 數(shù)據(jù)包括每次回流后的測試數(shù)據(jù)。 如圖所示,在這些情況下,響應(yīng)沒有因回流而發(fā)生偏移。
無論爐中的氧含量是否受到控制,IR響應(yīng)都不受回流影響。
!
圖4回流焊期間,通過氮氣吹掃控制氧含量的情況下藍(lán)光LED響應(yīng)的偏移
ECC的C代碼
int generate_hamm_block_parity( data )
int data[ ];
{
// Define parity mapping for parity byte generation/testing
// traditional hamming coding for 127,120 truncated to 120,112
// plus extra parity to make 120,112 code for SECDED.
//
// this table determines which parity bits are involved in each data bit.
// MSB is global "all data parity"
// this function does not include the parity bits in the global bit
// so it can be added differently in the generate_hamm_parity
// and generate_hamm_syndrome functions as needed
const int paritymap [112]={
131, 133, 134, 135, 137, 138, 139, 140, 141, 142,
143, 145, 146, 147, 148, 149, 150, 151, 152, 153,
154, 155, 156, 157, 158, 159, 161, 162, 163, 164,
165, 166, 167, 168, 169, 170, 171, 172, 173, 174,
175, 176, 177, 178, 179, 180, 181, 182, 183, 184,
185, 186, 187, 188, 189, 190, 191, 193, 194, 195,
196, 197, 198, 199, 200, 201, 202, 203, 204, 205,
206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
216, 217, 218, 219, 220, 221, 222, 223, 224, 225,
226, 227, 228, 229, 230, 231, 232, 233, 234, 235,
236, 237, 238, 239, 240, 241, 242, 243, 244, 245,
246, 247 };
//
int bit,byte; // pointers
int h; // parity byte
h=0; // init parity byte
// calculate parity for the 112 data bits according to map
for (byte=0; byte < 14; byte++) {
for (bit=0x0; bit < 8 ; bit++) {
if( (data[byte] & (1< } } } int data[ ],*parity_in; { h=generate_hamm_block_parity(data); // get parity byte for 112 bits // add the parity of the 7 input parity bits into the global if ((*parity_in&(1< } int data[ ]; int *parity; { int calculated_parity; calculated_parity=generate_hamm_syndrome(data,parity); if (syn==0) return(0); // no errors (no fix needed) else return(3); // double error (can't fix) } if (syn>=120) return(3); // also double error // if it gets here there is a single bit data error syn = byte = syn >> 3; } } } 審核編輯:郭婷
return(h); // return the parity byte for the 112bit block only
}
//
//
int generate_hamm_syndrome( data, parity_in )
//
// generate final hamm parity using two steps
// - generate parity for 112 bit data block
// - include input parity into global parity bit
//
int bit; // pointer
int h; // parity byte
for(bit=0;bit<6;bit++) {
return(h); // return the final parity
}
//
// This function checks the data and parity byte
// for consistency and corrects single bit problems
// Return Values:
// - 0 if the data/parity is correct. (NO REPAIR DONE)
// - 1 if there is a single bit error in the data region (REPAIRED)
// - 2 if there is a single bit error in the parity byte (REPAIRED)
// - 3 if there are multiple errors (NO REPAIR DONE)
//
int fix_hamm_parity (data, parity)
int syn, glob;
int bit, byte;
syn=(*parity^calculated_parity)&0x7f;
glob=(*parity^calculated_parity)&0x80;
if(glob==0) {
else {
switch (syn) { // error in lower parity (fix the bit)
case 0: *parity=*parity ^ 0x80; return(2);
case 1: *parity=*parity ^ 0x01; return(2);
case 2: *parity=*parity ^ 0x02; return(2);
case 4: *parity=*parity ^ 0x04; return(2);
case 8: *parity=*parity ^ 0x08; return(2);
case 16: *parity=*parity ^ 0x10; return(2);
case 32: *parity=*parity ^ 0x20; return(2);
case 64: *parity=*parity ^ 0x40; return(2);
default: // error in data block (fix it)
// first adjust the address to account for the
// parity bits being outside the data region
(syn>64) ? syn - 8 :
(syn>32) ? syn - 7 :
(syn>16) ? syn - 6 :
(syn>8) ? syn - 5 :
(syn>4) ? syn - 4 : 0;
bit = syn & 0x7;
data[byte]=data[byte]^(1<
-
探測器
+關(guān)注
關(guān)注
14文章
2631瀏覽量
73001 -
測量系統(tǒng)
+關(guān)注
關(guān)注
2文章
537瀏覽量
41386 -
光電二極管
+關(guān)注
關(guān)注
10文章
402瀏覽量
35931
發(fā)布評論請先 登錄
相關(guān)推薦
評論