tft每日頭條

 > 科技

 > stm32 光照傳感器

stm32 光照傳感器

科技 更新时间:2024-06-29 22:46:27

stm32 光照傳感器(STM32之低成本的環境噪聲傳感器的使用)1

環境噪聲基本标準

較強的噪聲對人的生理與心理會産生不良影響。在日常工作和生活環境中,噪聲主要造成聽力損失,幹擾談話、思考、休息和睡眠。根據國際标準化組織(ISO)的調查,在噪聲級85分貝和90分貝的環境中工作30年,耳聾的可能性分别為8%和18%。在噪聲級70分貝的環境中,談話就感到困難。對工廠周圍居民的調查結果認為,幹擾睡眠、休息的噪聲級阈值,白天為50分貝,夜間為45分貝。

美國環境保護局(EPA)于 1975年提出了保護健康和安甯的噪聲标準。中國也提出了環境噪聲容許範圍:夜間(22時至次日6時)噪聲不得超過30分貝,白天(6時至22時)不得超過40分貝。

以上說明是某篇文章的内容,我這裡直接搬來讓大家了解一下。意思就是環境噪聲對人有一定的影響。

以下開始本文的重點,本文所說到的噪聲傳感器實現原理簡單,程序設計也不複雜。

硬件原理:

傳感器原理圖如下:

stm32 光照傳感器(STM32之低成本的環境噪聲傳感器的使用)2

傳感器原理:麥克風采集環境聲音轉換為微弱的電信号通過LM358運算放大器把信号放大到能被STM32的adc采集的範圍内。然後通過程序把模拟量轉換為數據量。

此原理圖目前還存在一些問題,主要是穩定性不是很好,但是通過電位器調整還是可以達到一定的精度範圍。

軟件程序設計

程序主要使用到STM32的ADC功能,所以最快的程序設計方法是使用STM32的現有的ADC實驗例程,在例程上進行修改。主要代碼如下:

Stm32ADC配置代碼

void MIC_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道時鐘 RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14 //PA1 作為模拟通道輸入引腳 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟輸入引腳 GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1); //複位ADC1,将外設 ADC1 的全部寄存器重設為缺省值 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在獨立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模數轉換工作在單通道模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模數轉換工作在單次轉換模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //轉換由軟件而不是外部觸發啟動 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC數據右對齊 ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進行規則轉換的ADC通道的數目 ADC_Init(ADC1, &ADC_InitStructure); //根據ADC_InitStruct中指定的參數初始化外設ADCx的寄存器 ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 ADC_ResetCalibration(ADC1); //使能複位校準 while(ADC_GetResetCalibrationStatus(ADC1)); //等待複位校準結束 ADC_StartCalibration(ADC1); //開啟AD校準 while(ADC_GetCalibrationStatus(ADC1)); //等待校準結束 } //獲得ADC值 //ch:通道值 0~3 u16 Get_Adc(u8 ch) { //設置指定ADC的規則組通道,一個序列,采樣時間 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采樣時間為239.5周期 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的軟件轉換啟動功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉換結束 return ADC_GetConversionValue(ADC1); //返回最近一次ADC1規則組的轉換結果 }

濾波算法:(采集多次數據求平均值)

u16 Get_Adc_Average(u8 ch,u8 times) { u32 temp_val=0; u8 t; for(t=0;t<times;t ) { temp_val =Get_Adc(ch); delay_us(5); } return temp_val/times; }

處理采集到的數據轉換為環境噪聲量

void Mictask(void) { u16 adcx; float sound; adcx=Get_Adc_Average(ADC_Channel_1,100); sound = 80.00*(float)adcx/4096.00 15.00f; _MIC_Data.MIC_Data=sound; }

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved