日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【STM32】光敏传感器示例

發布時間:2024/4/24 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【STM32】光敏传感器示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. 光敏傳感器簡介
    • 02. 硬件模塊
    • 03. 程序設計
    • 04. 結果驗證
    • 05. 預留
    • 06. 附錄
    • 07. 聲明

01. 光敏傳感器簡介

光敏傳感器是最常見的傳感器之一,它的種類繁多,主要有:光電管、光電倍增管、光敏電阻、光敏三極管、太陽能電池、紅外線傳感器、紫外線傳感器、光纖式光電傳感器、色彩傳感器、CCD 和 CMOS 圖像傳感器等。光傳感器是目前產量最多、應用最廣的傳感器之一,它在自動控制和非電量電測技術中占有非常重要的地位。

光敏傳感器是利用光敏元件將光信號轉換為電信號的傳感器,它的敏感波長在可見光波長附近,包括紅外線波長和紫外線波長。光傳感器不只局限于對光的探測,它還可以作為探測元件組成其他傳感器,對許多非電量進行檢測,只要將這些非電量轉換為光信號的變化即可。

探索者 STM32F4 開發板板載了一個光敏二極管(光敏電阻),作為光敏傳感器,它對光的變化非常敏感。光敏二極管也叫光電二極管。光敏二極管與半導體二極管在結構上是類似的,其管芯是一個具有光敏特征的 PN 結,具有單向導電性,因此工作時需加上反向電壓。無光照時,有很小的飽和反向漏電流,即暗電流,此時光敏二極管截止。當受到光照時,飽和反向漏電流大大增加,形成光電流,它隨入射光強度的變化而變化。當光線照射 PN 結時,可以使 PN 結中產生電子一空穴對,使少數載流子的密度增加。這些載流子在反向電壓下漂移,使反向電流增加。因此可以利用光照強弱來改變電路中的電流。

利用這個電流變化,我們串接一個電阻,就可以轉換成電壓的變化,從而通過 ADC 讀取電壓值,判斷外部光線的強弱。

02. 硬件模塊

用到的硬件資源有:
1) 指示燈 DS0
2) TFTLCD 模塊
3) ADC
4) 光敏傳感器

LS1 是光敏二極管(實物在開發板攝像頭接口右側),R58 為其提供反向電壓,當環境光線變化時,LS1 兩端的電壓也會隨之改變,從而通過 ADC3_IN5 通道,讀取LIGHT_SENSOR(PF7)上面的電壓,即可得到環境光線的強弱。光線越強,電壓越低,光線越暗,電壓越高。

03. 程序設計

adc.h文件

//----------------------------------- //ADC3通道初始化 void ADC3_Init(void); //獲取ADC3某個通道的值 u16 Get_Adc3(u8 ch); //獲取某個通道給定次數采樣的平均值 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時鐘 PA5RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //開啟ADC1時鐘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復位RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE); //復位結束 //初始化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);//設置ADC規則組通道 一個序列 采樣時間//ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 1, ADC_SampleTime_480Cycles);//使能ADCADC_Cmd(ADC3, ENABLE);}//獲取ADC3某個通道的值 u16 Get_Adc3(u8 ch) {//設置ADC規則組通道 一個序列 采樣時間ADC_RegularChannelConfig(ADC3, ch, 1, ADC_SampleTime_480Cycles);//開啟ADC3的軟件轉換啟動功能ADC_SoftwareStartConv(ADC3);//等待轉換結束while(ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC) == RESET);//讀取ADC的值return ADC_GetConversionValue(ADC3);}//獲取某個通道給定次數采樣的平均值 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);//設置系統中斷優先級分組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"); //設置字體為藍色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. 結果驗證

伴隨 DS0 的不停閃爍,提示程序在運行。此時,我們可以通過給 LS1 不同的光照強度,來觀察 LSENS_VAL 值的變化,光照越強,該值越大,光照越弱,該值越小。

05. 預留

06. 附錄

6.1 【STM32】STM32系列教程匯總

網址:【STM32】STM32系列教程匯總

07. 聲明

該教程參考了正點原子的《STM32 F4 開發指南》

總結

以上是生活随笔為你收集整理的【STM32】光敏传感器示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。