目錄
1. 什么是光敏傳感器、光敏電阻
2. 硬件分析
3. 實驗程序
3.1 main.c
3.2 ADC3.c
3.3 ADC3.h
3.4 Lightsensor.c
3.5 Lightsensor.h
1. 什么是光敏傳感器、光敏電阻
光敏傳感器也稱為光電傳感器。是利用光電器件把光信號轉換成電信號的一種傳感器。它的敏感波長在可見光波長附近,包括紅外線波長和紫外線波長。光傳感器不只局限于對光的探測,它還可以作為探測元件組成其他傳感器,對許多非電量進行檢測,只要將這些非電量轉換為光信號的變化即可。
光敏傳感器是最常見的傳感器之一,它的種類繁多,主要有:光電管、光電倍增管、光敏電阻、光敏三極管、太陽能電池、紅外線傳感器、紫外線傳感器、CCD和CMOS圖像傳感器等。光傳感器是目前產量最多、應用最廣的傳感器之一,它在自動控制和非電量電測技術中占有非常重要的地位。
光敏電阻是一種由半導體材料制成的沒有極性的純電阻,光敏電阻是一種對光敏感的光電器件。
光敏電阻的主要參數(shù):
- 暗電阻和暗電流:通常把光敏電阻未受到光照射時的電阻稱作暗電阻,在沒有光照射時流過的電流稱作暗電流。
- 亮電阻和亮電流:亮對應于暗,通常將光敏電阻在受到光照射時的電阻稱作亮電阻,在有光照射時通過的電流稱作亮電流。
光敏電阻的主要特性:
- 伏安特性:在一定的光照強度下,光敏電阻兩端所加的電壓與電流成正比,阻值只和照射的入光強度有關,與加在兩端的電流或者電壓無關。
- 光譜特性:我們只要光存在不同的波長,則不同波長的光對光敏電阻的靈敏度是不一樣的。
- 溫度特性:光敏電阻受溫度的影響較大,當溫度升高時,暗電阻和靈敏度都隨之下降。
工作原理:
? ? ? ? 光敏電阻串聯(lián)在電流中,在光敏電阻的兩端,通常加上合適的電壓,在沒有光照的條件下,光敏電阻的阻值接近于無窮大,相當于斷路,當在一定的光照強度下, 光敏電阻的阻值減少,電流對應增大,足夠的光照強度使得光敏電阻所在的支路相當于短路。
實際應用:
? ? ? ? 通過STM32F4的ADC去測量電壓值
- ? ? ? ? 首先需要確定ADC的位數(shù),也可以說是分辨率,最大數(shù)值是多少。比如說一個16位的ADC,最大值就是0xFFFF,對應于=65536;
- ? ? ? ? 確定最大值時對應的參考電壓值,STM32F4的開發(fā)板對應的最大值為3.3V。
- ? ? ? ? 計算電壓值,需要把ADC的數(shù)值除剛才的確定的最大數(shù)值(也就是)再乘以參考電壓值,
? ? ? ? 比如說是ADC*(3.3/65536)
2. 硬件分析
????????STM32F4板載了一個光敏二極管(光敏電阻),作為開發(fā)板的光敏傳感器,它對光的變化非常敏感。光敏二極管也叫作光電二極管。光敏二極管和半導體二極管類似,其管芯是一個具有光敏特性的PN結,PN結具有單向導電性,因此工作時需要加反向電壓。無光照條件時,有很小的飽和反向漏電流,也就是上面提到的暗電流,此時光敏二極管截止。當受到光照時,飽和反向漏電流大大增加,形成光電流,此時這個值隨著入射光的光照強度變化而變化。當光線照射PN結時,可以在PN結中產生電子---空穴對,使得少數(shù)的載流子的密度增加。這些載流子在反向電壓下產生漂移,使得反向電流增加。因此可以利用光照強度來改變電路中的電流。
????????利用PN結中電流的變化,串聯(lián)一個電阻,就可以轉換成電壓的變化,通過ADC讀取電壓值。
?圖中,LSI?就是光敏二極管,R58為其提供反向電壓,當環(huán)境光線變化時,LSI 兩端的電壓也會隨之變化,通過ADC3_IN5通道,讀取LIGHT_SENSOR上面的電壓;光線越強,電壓越低,光線越暗,電壓越高。
3. 實驗程序
本實驗利用ADC3的通道5(PF7)來讀取光敏二極管的電壓變化。
文章來源:http://www.zghlxwxcb.cn/news/detail-445716.html
光敏二極管位于開發(fā)板的左下角,如上圖PCB圖所示;可以用強光照射該處,觀察光敏電阻的變化;文章來源地址http://www.zghlxwxcb.cn/news/detail-445716.html
3.1 main.c
#include "stm32f4xx.h"
#include "delay.h"
#include "usart.h"
#include "LED.h"
#include "lcd.h"
#include "usmart.h"
#include "ADC3.h"
#include "Lightsensor.h"
//LCD狀態(tài)設置函數(shù)
void led_set(u8 sta)//只要工程目錄下有usmart調試函數(shù),主函數(shù)就必須調用這兩個函數(shù)
{
LED1=sta;
}
//函數(shù)參數(shù)調用測試函數(shù)
void test_fun(void(*ledset)(u8),u8 sta)
{
led_set(sta);
}
int main(void)
{
u8 adcx;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(115200);
LED_Init();
LCD_Init();
LightSensor_Init();
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");
LCD_ShowString(30,70,200,16,16,"Lightsensor Test");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2023/20/23");
POINT_COLOR=BLUE;
LCD_ShowString(30,130,200,16,16,"Lightsensor:");
while(1)
{
adcx=LightSensor_Get_Val();
LCD_ShowxNum(30+12*8,130,adcx,3,16,0);
LED0=!LED0;
delay_ms(250);
}
}
3.2 ADC3.c
#include "stm32f4xx.h"
#include "ADC3.h"
void Adc3_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3,ENABLE); //使能ADC3時鐘
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE); //ADC3復位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE); //復位結束
//初始化CCR寄存器
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled; //DMA不使能,DMA通常用于多通道的轉移
ADC_CommonInitStructure.ADC_Mode=ADC_Mode_Independent; //獨立模式
ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4; //預分頻4分頻
ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles; //兩個采樣階段之間延遲5個時鐘
ADC_CommonInit(&ADC_CommonInitStructure);
//初始化ADC
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE; //關閉連續(xù)轉換
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //右對齊
ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;//禁止觸發(fā)檢測,使用軟件觸發(fā)
ADC_InitStructure.ADC_NbrOfConversion=1; //1個轉換在規(guī)則序列中
ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b; //12位模式分辨率
ADC_InitStructure.ADC_ScanConvMode=DISABLE; //非掃描模式
ADC_Init(ADC3,&ADC_InitStructure);
ADC_Cmd(ADC3,ENABLE); //開啟AD轉換器
}
//獲得ADC的值
//ch:通道值0~16 ADC_Channel_0~ADC_Channel_16
//返回值:轉換的結果
u16 Get_Adc3(u8 ch)
{
ADC_RegularChannelConfig(ADC3,ch,1,ADC_SampleTime_480Cycles); //設置ADC規(guī)則組通道,1個序列 采樣時間
ADC_SoftwareStartConv(ADC3);//使能指定的ADC3的軟件轉換啟動功能
while(!ADC_GetFlagStatus(ADC3,ADC_FLAG_EOC));//等待狀態(tài)寄存器轉換標志位結束
return ADC_GetConversionValue(ADC3); //返回轉換的結果
}
3.3 ADC3.h
#ifndef _ADC3__H_
#define _ADC3__H_
u16 Get_Adc3(u8 ch);
void Adc3_Init(void);
#endif
3.4 Lightsensor.c
#include "stm32f4xx.h"
#include "Lightsensor.h"
#include "ADC3.h"
#include "delay.h"
void LightSensor_Init(void) //初始化光敏傳感器
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //初始化GPIOF時鐘
//初始化GPIOF PF7通道
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; //模式為模擬輸入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //不帶上下拉
GPIO_Init(GPIOF,&GPIO_InitStructure);
Adc3_Init(); //初始化ADC3
}
//讀取光敏電阻Light Sensor的值
//0~100 0最暗,100最亮
u8 LightSensor_Get_Val(void)
{
u32 temp_val=0;
u8 t;
for(t=0;t<LSENS_READ_TIMES;t++)
{
temp_val=Get_Adc3(ADC_Channel_5)+temp_val;// 取多次讀取的總和加在一起
delay_ms(5);
}
temp_val=temp_val/LSENS_READ_TIMES; //得到平均值
if(temp_val>4000)
temp_val=4000;
return (u8)(100-(temp_val/40));
}
3.5 Lightsensor.h
#ifndef _LIGHTSENSOR__H_
#define _LIGHTSENSOR__H_
#define LSENS_READ_TIMES 10
u8 LightSensor_Get_Val(void);
void LightSensor_Init(void);
#endif
到了這里,關于STM32F4_光敏傳感器的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!