光敏传感器的学习 您所在的位置:网站首页 mhsensorseries光敏传感器 光敏传感器的学习

光敏传感器的学习

2024-02-12 02:02| 来源: 网络整理| 查看: 265

最近在学传感器,我一开始是想从雨滴传感器入手学习的,但是网上对于这个传感器的资料介绍很少,好在对光敏传感器挺多的,就先学这个了,有些传感器是直接DO口TTL电平的,这种只要配置GPIO就可以了,跟学习点灯差不多。但是像光敏传感器和雨滴传感器这些有AO口,可以在stm32自带的ADC中,进行模数转换,光敏传感器的工作原理略过,下面是关于光敏传感器模拟量的测试,希望对像我一样的初学者有所帮助,这里我是参考原子的,收益颇多。可能因为这些太简单了,但是对于我初学者来说,觉得这个相对还是有点难理解的。

硬件连接:光敏传感器AO接在stm32的PF6,我这里的PF6对应的是ADC3的通道4,DO不接,VCC接5V,GND接地

代码的实现:

这里delay和usart 程序是用正点原子封装好的delay ,usart,可以先去找一份例程代码,然后把里面的sys,usart,delay直接拷贝

adc.c   #include "adc.h" #include "delay.h" void ADC3_Init(void) { ADC_InitTypeDef ADC_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); //开启时钟 RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE); RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6); //时钟分频,ADC不能超过14Mhz,不然会不精准,系统内部时钟是72Mhz,所以要分频 ADC_DeInit(ADC3); ADC_InitStruct.ADC_Mode = ADC_Mode_Independent; //独立模式 ADC_InitStruct.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式 ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式 ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStruct.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目 ADC_Init(ADC3, &ADC_InitStruct); ADC_Cmd(ADC3, ENABLE); ADC_ResetCalibration(ADC3); //重置指定的ADC1的复位寄存器 while(ADC_GetResetCalibrationStatus(ADC3)); //获取ADC1重置校准寄存器的状态,设置状态则等待 ADC_StartCalibration(ADC3); //开启精准计算 while(ADC_GetCalibrationStatus(ADC3)); } //光敏传感器的通道为4,此处ch要为adc的通道4 ADC_Channel_4 u16 ADC3_Get(u8 ch) { ADC_RegularChannelConfig(ADC3, ch, 1, ADC_SampleTime_239Cycles5);//规则通道,ADC3,通道4,第一个转换,采样时间为239.5周期 ADC_SoftwareStartConvCmd(ADC3, ENABLE); //使能指定的ADC3的软件转换启动功能 while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC)); //等待转换结束,转换结束标志位置1 return ADC_GetConversionValue(ADC3); //返回最近一次ADC3规则组的转换结果 } adc.h #ifndef ADC_H #define ADC_H #include "sys.h" void ADC3_Init(void); u16 ADC3_Get(u8 ch); #endif /* ADC_H */  lightsensor.h #ifndef LIGHTSENSOR_H #define LIGHTSENSOR_H #include "sys.h" #define LightSensor_read_time 10 #define LSENS_ch ADC_Channel_4 void LighrSensor_Init(void); u8 LightSensor_Val(void); #endif /* LIGHTSENSOR_H */ lightsensor.c #include "lightsensor.h" #include "adc.h" #include "delay.h" #include "led.h" //光敏传感器PF6/ADC3_IN4 void LighrSensor_Init(void) //初始化GPIO { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN; //采用ADC的时候,这里要用模拟输入模式 GPIO_Init(GPIOF, &GPIO_InitStruct); ADC3_Init(); } //光敏传感器模拟值0-100 u8 LightSensor_Val(void) { u32 temp = 0; u8 t; for(t=0;t 4000) { temp = 4000; LED1 = 1; }else { LED1 = 0; } return (u8)(100-(temp/40)); //模拟量输出范围为 0-100 } main.c #include "delay.h" #include "usart.h" #include "led.h" #include "lightsensor.h" void Hardware_Init(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); LighrSensor_Init(); } int main(void) { Hardware_Init(); while(1) { adc_val = LightSensor_Val(); printf("adc_val.....\r\n",adc_val); } }

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有