外設驅動庫開發筆記37:S1336-5BQ光敏二極體作為光度計驅動
光敏二極體能夠實現很多應用,用於光度檢測即是其一。我們在一些產品中就曾使用S1336-5BQ光敏二極體進行光度值檢測。所以在本篇中,我們將討論如何設計並實現S1336-5BQ光敏二極體用於光度檢測的驅動。
1、功能概述
根據相關的資料,光電二極體S1336-5BQ的光譜響應範圍為:190~1100nm範圍,最靈敏的波長是960nm。而且光電二極體S1336-5BQ每100lx的光照對應有5μA的電流。於是我們可以據此設計一個電路,將電流的變化改變為電壓變化,具體原理圖設計如下:
上圖中R5是取樣電阻,其阻值決定測量範圍,電源VCC,預設採用5V標準電源。我們可以知道輸出電壓與光度值的函式關係為:
其中lux為光度值,Vo為輸出電壓,Vf為參考電壓。所以我們可以看到光度值與輸出電壓是線性關係,我們檢測到輸出電壓就可以得到光度值。
2、驅動設計與實現
我們明白了使用光電二極體S1336-5BQ檢測光強的原理,接下來我們需要根據這一原理實現程式碼。
2.1、物件定義
在使用之前我們要定義一個LUX物件,因此需要LUX物件型別。我們根據測量原理抽象可得:
/* 定義光度檢測物件型別 */
typedef struct LuxObject {
float isc100lux; //每100個光度變化所對應的電流變化
float rnf; //取樣電阻的值
float vref; //參考電壓
float lux; //光度值
}LuxObjectType;
有了物件我們還不能夠立即使用,必須將物件初始化後方可使用。所以我們根據物件編寫其初始化函式:
/* 光度檢測物件初始化 */
void LuxInitialization(LuxObjectType *lm,float isc,float vref,float rnf)
{
if(lm==NULL)
{
return;
}
lm->lux=0.0;
lm->isc100lux=isc;
lm->rnf=rnf;
lm->vref=vref;
}
2.2、物件操作
我們已經有了物件並對其進行了初始化。接下來我們就可以操作物件得到光度值。根據前面的測量原理我們可以得到光度值的計算公式:
我們就按此公式計算光度值:
/*計算光照強度*/
float CalcLxIllumination(LuxObjectType *lm,float mVoltage)
{
float lux=0.0;
lux=(mVoltage-lm->vref)*100/(lm->rnf*lm->isc100lux);
lm->lux=lux;
return lux;
}
而輸入的電壓值就是通過採集電路得到的輸出電壓。
3、驅動的使用
在我們的應用中,我們的光源波長則在254nm最顯著,包括其它600nm以內的光波,這個正好處於S1336-5BQ光電二極體190~1100nm範圍測量範圍之內。
前面測量電路的輸出作為輸入訊號接入到ADC中。在ADC前端加一些必要的保護,但不對訊號進行處理,具體如下圖所示:
當然如果需要也可以作放大縮小等處理,從而符合ADC輸入的要求。但不會改變光度值的檢測範圍。
同樣的我們先使用LuxObjectType定義物件變數並初始化。當然,如果有多個也可以使用陣列處理。這裡只以單個物件為例:
LuxObjectType lm;
LuxInitialization(&lm,0.000005,2.5,10000.0);
定義並初始化物件完成之後,我們就可以呼叫CalcLxIllumination函式計算光度值:
CalcLxIllumination(&lm,2.738);
可得到結果:lux=476。
4、應用總結
使用S1336-5BQ光電二極體進行光度測量的原理比較簡單。我們在臭氧發生器中,使用其檢測紫外光的強度也取得了預期的效果。
對於檢測光強的範圍完全由取樣電阻決定。在我們的裝置中我們可以檢測0~5000lux的光強。如果想採用不同的範圍則可以通過調整取樣電阻的值來實現。
歡迎關注:
如果閱讀這篇文章讓您略有所得,還請點選下方的【好文要頂】按鈕。
當然,如果您想及時瞭解我的部落格更新,不妨點選下方的【關注我】按鈕。
如果您希望更方便且及時的閱讀相關文章,也可以掃描上方二維碼關注我的微信公眾號【木南創智】