ADPD188BI 是完整的光電式測量系統(tǒng),適合采用光學雙波長技術的煙霧檢測應用。 該模塊集成了高效率光電式測量前端、藍光和紅外(IR)發(fā)光二極管(LED)以及一個光電二極管,這些元件包含在定制封裝中,光線必須先進入煙霧檢測室,而無法直接從LED到達光電二極管 。 ADPD188BI與EVAL-CHAMBER煙霧室配合使用,可創(chuàng)建一套完整的光學煙霧檢測解決方案,適用于住宅和工業(yè)煙霧探測器。 EVAL-CHAMBER可通過訂購EVAL-ADPD188BIZ-S2購買。
本應用筆記說明如何使用已寫入片內非易失性存儲器(NVM)的校準系數(shù)來校準ADPD188BI,從而將器件之間的差異降低至±10%以下。
對于特定的LED驅動器設置和測試/應用環(huán)境,ADPD188BI的LED響應會表現(xiàn)出器件間差異。 LED響應的斜率(增益)和截距(失調)隨器件而異,導致不同器件對同一環(huán)境的響應存在差異,這可以利用增益和失調校準系數(shù)進行校準。 這種校準的主要應用是可以對最終應用中實例化的多個器件的輸出進行更有效的比較。 此校準可顯著減少器件之間的光學變化帶來的測量差異,并簡化對應用環(huán)境特定的變化的觀測。
校準ADPD188BI
測試方法
每對LED/驅動器會有多個LED電流進入反射器,反射器的響應由ADPD188BI模塊內部的光電二極管測量。 針對每對LED/驅動器計算響應的斜率,截距從線性回歸得出。 然后計算校準系數(shù),并將其存儲在片內NVM(也稱為eFuse寄存器)中,以供以后在最終應用中使用。 校準系數(shù)基于特定器件的每脈沖測量值計算,歸一化為從不同器件收集到的大量數(shù)據(jù)分布的平均值。 這種歸一化確保了大量器件中器件間的差異較小。
讀取eFuse寄存器
失調和增益校準系數(shù)存儲在片內eFuse寄存器中。 增益校準系數(shù)LED1_GAIN_ COEFF和LED3_GAIN_COEFF分別存儲在寄存器0×71和0×72中。 失調校準系數(shù)LED1_INT_COEFF和LED3_INT_COEFF分別存儲在寄存器0×73和寄存器0×74中。
要訪問eFuse寄存器,請執(zhí)行以下步驟:
- 設置寄存器0×4B的位7 = 1以使能32 kHz振蕩器。
- 將0×1寫入寄存器0×10以強制器件進入編程(空閑)模式。
- 將0×1寫入寄存器0×5F以使能32 MHz先進先出(FIFO)時鐘。
- 將0×7寫入寄存器0×57以使能對eFuse寄存器的訪問。
- 當寄存器0×67 = 0×04時,eFuse寄存器的刷新完成,可以隨時對其進行讀取。
- 應用校準系數(shù)之前,須對eFuse數(shù)據(jù)應用糾錯碼(ECC)函數(shù)(參閱使用ECC檢測和校正EFUSE值的錯誤部分)。
- 確認模塊ID 30、模塊ID 31、模塊ID 33或以上的寄存器0×70的內容分別為0×1E、0×1F、0×21或更大。
- 讀取所需LED/驅動器對的增益和失調校準系數(shù)。 使用eFuse寄存器的內容,按照“計算校準系數(shù)”部分中所述計算最終增益校準系數(shù)。 得出最終增益校準系數(shù)后,將其載入用戶可訪問的存儲器中以備將來使用。
- 完成對eFuse寄存器的讀取后,按照以下方式禁用eFuse寄存器:
- 將0×0寫入寄存器0×57以禁用對eFuse寄存器的訪問。
- 將0×0寫入寄存器0×5F以禁用32 MHz FIFO時鐘。
計算模塊ID 30和模塊ID 31的校準系數(shù)
最終校準系數(shù)必須使用寄存器0x71至寄存器0x74的內容來計算,如下式所示:
GAIN_CAL_X = DEVICE_SCALAR/NOMINAL_SCALAR
其中:
DEVICE_SCALAR = x_GAIN × LEDx + x_INTERCEPT。
x_GAIN對于藍光通道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驅動電流; 例如,若驅動電流 = 200 mA,則輸入200。 LEDx對于藍光LED通道為LED1,對于IR LED通道為LED3
x_INTERCEPT對于藍光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對于藍光LED通道為17,對于IR LED通道為34。
x_MEAN_INTERCEPT對于藍光LED通道為622,對于IR LED通道為128。
表1.模塊ID 30和ID 31的eFuse寄存器的內容| 地址 | 名稱 | 位 | 描述 |
| ------------------------ | ------ | ---- | ------ |
| 0×70 | MODULE_ID | [7:0] | 模塊 ID = 30 或 31 |
| 0×71 | LED1_GAIN_COEFF | [7:0] | 藍光LED增益系數(shù) |
| 0×72 | LED3_GAIN_COEFF | [7:0] | IR LED增益系數(shù) |
| 0×73 | LED1_INT_COEFF | [7:0] | 藍光LED截距系數(shù) |
| 0×74 | LED3_INT_COEFF | [7:0] | IR LED截距系數(shù) |
| 0×7E | 等 | [7:0] | 等 |
計算模塊ID 33的校準系數(shù)
最終校準系數(shù)必須使用寄存器0x71至寄存器0x74的內容來計算,如下式所示:
GAIN_CAL_X = DEVICE_SCALAR/NOMINAL_SCALAR
其中:
DEVICE_SCALAR = x_GAIN × LEDx + x_INTERCEPT。
x_GAIN對于藍光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是以毫安為單位的驅動電流; 例如,若驅動電流 = 200 mA,則輸入200。 LEDx對于藍光LED通道為LED1,對于IR LED通道為 LED3 。
x_INTERCEPT對于藍光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對于藍光LED通道為21,對于IR LED通道為42。
x_MEAN_INTERCEPT對于藍光LED通道為753,對于IR LED通道為156。
校準32 kHz和32 kHz振蕩器以獲得出色的系統(tǒng)性能
校準32 kHz和32 MHz片內振蕩器以獲得出色的性能。 32 kHz振蕩器確定ADPD188BI的整體采樣速率,32 MHz振蕩器則影響ADPD188BI的總增益。 對于模塊ID = 33的器件,讀取eFuse寄存器(寄存器0×77和寄存器0×78),并將這些值分別寫入器件寄存器0×4B和寄存器0×4D。 或者,用戶也可按照ADPD188BI數(shù)據(jù)手冊中所述的32 kHz和32 MHz時鐘校準程序手動確定最優(yōu)設置。
A基于模塊ID應用正確的方程
為實現(xiàn)優(yōu)質操作,讀取eFuse寄存器0×70以確定模塊ID并應用合適的方程。 下面是用戶軟件一部分的條件語句示例。
檢查模塊 ID 案例(模塊 ID
):
對于ID 30和31案例30,31
:
GAIN_CAL_BLUE =(使用計算模塊 ID 30 和模塊 ID 31 的校準系數(shù)中顯示的方程式)GAIN_CAL_IR =(使用計算模塊 ID 30 和模塊 ID 31 的校準系數(shù)中顯示的方程式)
對于 ID 33
案例 33:
GAIN_CAL_BLUE =(使用計算模塊 ID 33 的校準系數(shù)中顯示的公式) GAIN_CAL_IR =(使用計算模塊 ID 33 的校準系數(shù)中顯示的公式)
案例待定 1:離開以備將來擴展 案例待定 2:離開以備將來擴展
默認值:引發(fā)錯誤
表2.模塊ID 33的eFuse寄存器的內容| 地址 | 名稱 | 位 | 描述 |
| ------------------------ | ------ | ---- | ------ |
| 0×70 | MODULE_ID | [7:0] | 模塊ID = 33 |
| 0×71 | LED1_GAIN_COEFF | [7:0] | 藍光LED增益系數(shù) |
| 0×72 | LED3_GAIN_COEFF | [7:0] | IR LED增益系數(shù) |
| 0×73 | LED1_INT_COEFF | [7:0] | 藍光LED截距系數(shù) |
| 0×74 | LED3_INT_COEFF | [7:0] | IR LED截距系數(shù) |
| 0×77 | 32kHz_OSC_OPT_ADJUST | [7:0] | 32 kHz振蕩器最優(yōu)調整設置 |
| 0×78 | 32MHz_OSC_OPT_ADJUST | [7:0] | 32 MHz振蕩器最優(yōu)調整設置 |
| 0×7E | 等 | [7:0] | 等 |
應用校準系數(shù)
要在最終應用中應用校準系數(shù),請執(zhí)行以下步驟:
- 根據(jù)需要配置ADPD188BI器件。
- 將0x2寫入地址0x10以開始正常采樣操作。
- 在所需LED的電平下進行測量并執(zhí)行以下計算:
歸一化輸出(LSBs) = AFE_OUT/GAIN_CAL_x
其中:
AFE_OUT = LED亮起時的原始輸出測量值。
GAIN_CAL_x對于藍光LED通道為GAIN_CAL_BLUE,對于IR LED通道為GAIN_CAL_IR。
應用校準系數(shù)可大大減小器件之間的差異。 圖1和圖2顯示了校準前后藍光LED和IR LED的直方圖。 圖1和圖2說明,在兩種情況下,器件間差異的分布范圍縮小到±10%以下。
圖2.校準前后的IR LED響應
eFuse內容對器件正常操作的影響
寫入ADPD188BI eFuse寄存器的校準系數(shù)不會改變器件性能或規(guī)格。 所有數(shù)據(jù)手冊規(guī)格和器件性能本質上不受eFuse寄存器編程的影響。
校準系數(shù)旨在用于采樣數(shù)據(jù)的后處理,以便校準器件之間的光學特性差異。 無論對eFuse寄存器進行編程與否,ADPD188BI的性能都沒有差異。 在eFuse寄存器寫有校準系數(shù)的情況下,只有在軟件中對采樣數(shù)據(jù)實施后處理校準程序時,eFuse寄存器中存儲的數(shù)據(jù)才會對最終數(shù)據(jù)產生影響。
使用ECC檢測并校正eFuse值的錯誤
“ECC的C代碼”部分中顯示的C代碼包含了使用漢明碼檢測和校正存儲的eFuse寄存器值中錯誤的例程。 這些函數(shù)使用傳統(tǒng)的127120海明碼,截斷為119112。 其中添加了一個額外的全局奇偶校驗位,以實現(xiàn)2位故障檢測以及1位校正。 最終形式是120,112,它將8位奇偶校驗碼添加到每個112位(14字節(jié))塊中。
此代碼可100%檢測并修復每個數(shù)據(jù)塊中的1位錯誤,并能100%檢測到每個數(shù)據(jù)塊中的2位故障。
方法如下:將eFuse數(shù)據(jù)和奇偶校驗字節(jié)讀入本地存儲器。 用戶必須讀取寄存器0×70至寄存器0×7E。 寄存器至寄存器0×7D與輸入指針和數(shù)據(jù)相關聯(lián),必須將其讀入數(shù)據(jù)數(shù)組。 寄存器與輸入指針和奇偶校驗相關聯(lián),必須作為奇偶校驗值讀入。 使用命令驗證該塊。 此函數(shù)會在原位修復單個損壞的位。 如果fix_hamm_parity命令返回錯誤,則將器件標記為已損壞。
此過程可修復所有1位故障,檢測到所有2位故障和約6%的3位故障,并檢測到大多數(shù)偶數(shù)故障。
回流焊對校準系數(shù)的影響
在氧含量不受控制的回流爐中進行回流焊時,可能導致光電二極管對藍光LED的響應降低。 平均而言,每次回流,光電二極管對藍光LED的響應會有約7%的偏移。 校準系數(shù)是在最終測試時寫入的,先于ADPD188BI的任何回流。 因此,如果ADPD188BI在含氧量不受控制的爐中進行回流焊,藍光系數(shù)便不再準確。
圖3顯示了在氧含量不受控制的烤箱中回流后的原始藍光響應和校準后的響應。 這組器件經(jīng)過了三次回流。 數(shù)據(jù)包括每次回流后的測試數(shù)據(jù)。 從數(shù)據(jù)中可以看出,每次回流后,藍光LED響應約有7%的偏移。
圖3.回流焊期間,不受控制的氧含量引起的藍光LED響應的偏移
為避免響應偏移,應使用通過氮氣降低爐中氧含量的回流爐。 當使用氮氣控制的回流爐將氧含量控制在1000 ppm以下時,藍光LED響應不會因為回流焊發(fā)生偏移。
圖4中的數(shù)據(jù)顯示了已在爐中回流三次的器件的原始藍光LED響應值和校準后的響應值,該爐使用氮氣吹掃,氧含量降低至1000 ppm以下。 數(shù)據(jù)包括每次回流后的測試數(shù)據(jù)。 如圖所示,在這些情況下,響應沒有因回流而發(fā)生偏移。
無論爐中的氧含量是否受到控制,IR響應都不受回流影響。
!
圖4回流焊期間,通過氮氣吹掃控制氧含量的情況下藍光LED響應的偏移
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<
-
探測器
+關注
關注
14文章
2609瀏覽量
72845 -
測量系統(tǒng)
+關注
關注
2文章
532瀏覽量
41333 -
光電二極管
+關注
關注
10文章
398瀏覽量
35881
發(fā)布評論請先 登錄
相關推薦
評論