【STM32】光敏传感器示例
00. 目錄
文章目錄
- 00. 目錄
- 01. 光敏傳感器簡(jiǎn)介
- 02. 硬件模塊
- 03. 程序設(shè)計(jì)
- 04. 結(jié)果驗(yàn)證
- 05. 預(yù)留
- 06. 附錄
- 07. 聲明
01. 光敏傳感器簡(jiǎn)介
光敏傳感器是最常見的傳感器之一,它的種類繁多,主要有:光電管、光電倍增管、光敏電阻、光敏三極管、太陽(yáng)能電池、紅外線傳感器、紫外線傳感器、光纖式光電傳感器、色彩傳感器、CCD 和 CMOS 圖像傳感器等。光傳感器是目前產(chǎn)量最多、應(yīng)用最廣的傳感器之一,它在自動(dòng)控制和非電量電測(cè)技術(shù)中占有非常重要的地位。
光敏傳感器是利用光敏元件將光信號(hào)轉(zhuǎn)換為電信號(hào)的傳感器,它的敏感波長(zhǎng)在可見光波長(zhǎng)附近,包括紅外線波長(zhǎng)和紫外線波長(zhǎng)。光傳感器不只局限于對(duì)光的探測(cè),它還可以作為探測(cè)元件組成其他傳感器,對(duì)許多非電量進(jìn)行檢測(cè),只要將這些非電量轉(zhuǎn)換為光信號(hào)的變化即可。
探索者 STM32F4 開發(fā)板板載了一個(gè)光敏二極管(光敏電阻),作為光敏傳感器,它對(duì)光的變化非常敏感。光敏二極管也叫光電二極管。光敏二極管與半導(dǎo)體二極管在結(jié)構(gòu)上是類似的,其管芯是一個(gè)具有光敏特征的 PN 結(jié),具有單向?qū)щ娦?#xff0c;因此工作時(shí)需加上反向電壓。無光照時(shí),有很小的飽和反向漏電流,即暗電流,此時(shí)光敏二極管截止。當(dāng)受到光照時(shí),飽和反向漏電流大大增加,形成光電流,它隨入射光強(qiáng)度的變化而變化。當(dāng)光線照射 PN 結(jié)時(shí),可以使 PN 結(jié)中產(chǎn)生電子一空穴對(duì),使少數(shù)載流子的密度增加。這些載流子在反向電壓下漂移,使反向電流增加。因此可以利用光照強(qiáng)弱來改變電路中的電流。
利用這個(gè)電流變化,我們串接一個(gè)電阻,就可以轉(zhuǎn)換成電壓的變化,從而通過 ADC 讀取電壓值,判斷外部光線的強(qiáng)弱。
02. 硬件模塊
用到的硬件資源有:
1) 指示燈 DS0
2) TFTLCD 模塊
3) ADC
4) 光敏傳感器
LS1 是光敏二極管(實(shí)物在開發(fā)板攝像頭接口右側(cè)),R58 為其提供反向電壓,當(dāng)環(huán)境光線變化時(shí),LS1 兩端的電壓也會(huì)隨之改變,從而通過 ADC3_IN5 通道,讀取LIGHT_SENSOR(PF7)上面的電壓,即可得到環(huán)境光線的強(qiáng)弱。光線越強(qiáng),電壓越低,光線越暗,電壓越高。
03. 程序設(shè)計(jì)
adc.h文件
//----------------------------------- //ADC3通道初始化 void ADC3_Init(void); //獲取ADC3某個(gè)通道的值 u16 Get_Adc3(u8 ch); //獲取某個(gè)通道給定次數(shù)采樣的平均值 u16 Get_Adc3_Average(u8 ch, u8 times);adc.c文件
//-------------------------ADC3------------------------ //ADC3通道初始化 void ADC3_Init(void) {GPIO_InitTypeDef GPIO_InitStructure;ADC_CommonInitTypeDef ADC_CommonInitStructure;ADC_InitTypeDef ADC_InitStructure;//開啟GPIO時(shí)鐘 PA5RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //開啟ADC1時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); //GPIO初始化 初始化為模擬功能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(GPIOF, &GPIO_InitStructure);RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE); //ADC1復(fù)位RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE); //復(fù)位結(jié)束 //初始化ADC_CCR寄存器ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;ADC_CommonInit(&ADC_CommonInitStructure);//初始化ADC1ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;ADC_InitStructure.ADC_ScanConvMode = DISABLE;ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;ADC_InitStructure.ADC_NbrOfConversion = 1;ADC_Init(ADC3, &ADC_InitStructure);//設(shè)置ADC規(guī)則組通道 一個(gè)序列 采樣時(shí)間//ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_480Cycles);//使能ADCADC_Cmd(ADC3, ENABLE);}//獲取ADC3某個(gè)通道的值 u16 Get_Adc3(u8 ch) {//設(shè)置ADC規(guī)則組通道 一個(gè)序列 采樣時(shí)間ADC_RegularChannelConfig(ADC3, ch, 1, ADC_SampleTime_480Cycles);//開啟ADC3的軟件轉(zhuǎn)換啟動(dòng)功能ADC_SoftwareStartConv(ADC3);//等待轉(zhuǎn)換結(jié)束while(ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC) == RESET);//讀取ADC的值return ADC_GetConversionValue(ADC3);}//獲取某個(gè)通道給定次數(shù)采樣的平均值 u16 Get_Adc3_Average(u8 ch, u8 times) {u32 tmp = 0;u8 i = 0;for (i = 0; i < times; i++){tmp += Get_Adc3(ch);delay_ms(5);}//得到平均值tmp /= times;if (tmp > 4000){tmp = 4000;}return (u16)(100 - (tmp / 40)); }main.c文件
#include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "beep.h" #include "key.h" #include "usmart.h" #include "lcd.h" #include "rtc.h" #include "rng.h" #include "key.h" #include "wkup.h" #include "adc.h"int main(void) { //u16 value = 0;u16 temp = 0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級(jí)分組2delay_init(168);uart_init(115200);//usmart_dev.init(84);LED_Init();LCD_Init();ADC3_Init();POINT_COLOR = RED;LCD_ShowString(30,50,200,16,16,"Explorer STM32F4"); LCD_ShowString(30,70,200,16,16,"LSENS TEST"); LCD_ShowString(30,90,200,16,16,"ATOM@tom");LCD_ShowString(30,110,200,16,16,"2020/09/15"); //設(shè)置字體為藍(lán)色POINT_COLOR = BLUE; LCD_ShowString(30,140,200,16,16,"LSENS VAL:"); while(1){//得到溫度值temp = Get_Adc3_Average(ADC_Channel_5, 10);LCD_ShowxNum(30+10*8,130,temp,3,16,0);//顯示ADC的值printf("Light: %d\r\n", temp);LED1 = !LED1;delay_ms(250);} }04. 結(jié)果驗(yàn)證
伴隨 DS0 的不停閃爍,提示程序在運(yùn)行。此時(shí),我們可以通過給 LS1 不同的光照強(qiáng)度,來觀察 LSENS_VAL 值的變化,光照越強(qiáng),該值越大,光照越弱,該值越小。
05. 預(yù)留
06. 附錄
6.1 【STM32】STM32系列教程匯總
網(wǎng)址:【STM32】STM32系列教程匯總
07. 聲明
該教程參考了正點(diǎn)原子的《STM32 F4 開發(fā)指南》
總結(jié)
以上是生活随笔為你收集整理的【STM32】光敏传感器示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM32】待机唤醒程序示例
- 下一篇: 【STM32】DAC相关函数和类型