1. 程式人生 > 其它 >外設驅動庫開發筆記37:S1336-5BQ光敏二極體作為光度計驅動

外設驅動庫開發筆記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的光強。如果想採用不同的範圍則可以通過調整取樣電阻的值來實現。

歡迎關注:

如果閱讀這篇文章讓您略有所得,還請點選下方的【好文要頂】按鈕。

當然,如果您想及時瞭解我的部落格更新,不妨點選下方的【關注我】按鈕。

如果您希望更方便且及時的閱讀相關文章,也可以掃描上方二維碼關注我的微信公眾號【木南創智