STM32——光敏传感器实验-M4

一、光敏传感器原理

1、光敏传感器简介

光敏传感器是最常见的传感器之一,它的种类繁多,主要有:光电管、光电倍增管、光敏电阻、光敏三极管、太阳能电池、红外线传感器、紫外线传感器、光纤式光电传感器、色彩传感器、CCD和CMOS图像传感器等。光电传感器是目前产量最多、应用最广的传感器之一,它在自动控制和非电量电测计数中占有非常重要的地位。光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感器不知局限于对光的探测,它还可以作为探测元件组成其它传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即可。

光敏二极管也叫光电二极管。光敏二极管与半导体二极管在结构上是类似的,其管芯是一个具有光敏特征的PN结,具有单向导电性,因此工作时需加上反向电压。无光照时,有很小的饱和反向漏电流,即暗电流,此时光敏二极管截止。当受到光照时,饱和反向漏电流大大增加,形成光电流,它随入射光强度的变化而变化。当光线照射PN结时,可以使PN结中产生电子一空穴对,使少数载流电子的密度增加。这些载流子在反向电压下漂移,使反向电流增加。因此可以利用光照强弱来改变电路中的电流。

简而言之:照射光敏二极管的光强不同,通过光敏二级管的电流大小就不同,所以可以通过检测电流大小,达到检测光强的目的。

利用这个电流变化,我们串联一个电阻,就可以转换成电压的变化,从而通过ADC读取电压值,判断外部光线的强弱。

探索者STM32F407板载了一个光敏二极管(光敏电阻),作为光敏传感器,它对光的变化十分敏感。

2、硬件连接

LS1即为光敏二极管。光敏二极管一端接地,另一端接电阻再接到高电平。当无光照射时,光敏二极管与电阻的接点处电压与高电平VCC3.3相同;当有光照射时,二极管产生电流,会分一部分电压,二极管与电阻的接点处电压降低。可以检测该接点的电压变化来检测光照强弱。图中将接点处引出并接一个电阻,再连接PF7对应ADC3(通道5)。因此可以通过ADC测量通道5的电压得到光照的强弱。

二、实验(通过ADC3_CH5来检测光敏二极管一端的电压变化来达到检测光强的目的)

为巩固基础代码,这里将再写一遍ADC的配置代码:

void Adc3_Init(void)
{
  GPIO_InitTypeDef GPIO_InitABC;
  ADC_CommonlnitTypeDef ADC_CommonlnitInitABC;
  ADC_InitTypeDef ADC_InitABC;
  
  RCC_AHB1PeriphColckCmd(RCC_AHB1Periph_GPIOF,ENABLE);//使能GPIOF时钟
  RCC_APB2PeriphhClockCmd(RCC_APB2Periph_ADC3,ENABLE);//使能ADC3时钟
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE);//ADC3复位
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE);//复位结束
  
  GPIO_InitABC.GPIO_Pin=GPIO_Pin_7;//PF7,通道5
  GPIO_InitABC.GPIO_Mode=GPIO_Mode_AN;//模拟输入
  GPIO_InitABC.GPIO_PuPd=GPIO_PuPd-NOPULL;//不带上下拉
  GPIO_Init(GPIOF,&GPIO_InitABC);
  ADC_CommonlnitABC.ADC_Mode=ADC_Mode_Independent;//独立模式
  ADC_CommonlnitABC.ADC_TwoSamplingDelay=ADC_DMA_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个周期
  ADC_CommonlnitABC.ADC_DMAAccessMode=ADC_DAMAccessMode_Disable;//DMA失能
  ADC_COmmonlnitABC.ADC_Prescaler=ADC_Prescaler_Div4;//预分频4,注意分频后不能超过36M
  ADC_Commonlnit(&ADC_CommonlnitABC);
  ADC_InitABC.ADC_Resolution=ADC_Resolution_12b;//12位分辨率模式
  ADC_InitABC.ADC_ScanConvMode=DISABLE;//非扫描模式
  ADC_InitABC.ADC_ContinousConvMode=DISABLE;//关闭连续转换
  ADC_InitABC.ADC_ExternalTrigCovEdge=ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
  ADC_InitABC.ADC_DataAlign=ADC_DataAlign_Right;//右对齐
  ADC_InitABC.ADC_NbrOfConversion=1;//1个转换在规则序列中
  ADC_Init(ADC3,&ADC_InitABC);
  ADC_Cmd(ADC3,ENABLE);//开启ADC转换器
}

读取ADC3的值:

u16 Get_Adc3(u8 ch)
{
  ADC_RegualrChannelConfig(ADC3,ch,1,ADC_SampleTime_480Cycles);//ADC3,ADC通道,480个周期,提高采样时间提高精确度
  ADC_SofewareStartConv(ADC3);//使能指定的ADC3的软件转换启动器
  while(!ADC_GetFlagStatus(ADC3,ADC_FLAG_EOC));//等待转换结束
  return ADC_GetConversionValue(ADC3);//返回最近一次ADC3规则组的转换结果
}

读取ADC值,转换成相应的光强:

u8 Lsense_Get_Val(void)//0~100:0最暗,100最亮
{
  u32 temp_val=0;
  u8 t;
  for(t=0;t<LSENS_READ_TIMES;t++)
  {
    temp_val+=Get_Adc3(ADC_Channel_5);//读取ADC值,通道5
    delay_ms(5);
  }
  temp_val/=LSENS_READ_TIMES;//得到平均值
  if(temp_val>4000)  temp_val=4000;
  return (u8)(100-(temp_val/40));
}  
//LSENS_READ_TIMES  10

最暗的时候接点处电压最高,最亮的时候接点处电压最低。

主函数调用Lsens_Init()即可。然后将获得的值显示在液晶屏上就可以了。

光敏传感器的用处:可以用光敏传感器控制液晶的背光。类似于手机自动调节屏幕亮度。

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值