怕黑的女仆

我有一个女仆,她的名字叫光敏传感器,她很怕黑,今天我带她和大家见见面…
晚上无聊,玩光敏传感器,找一下感觉,用光敏传感器检测环境光照,光线暗了之后会提醒开灯(就是女仆提醒…).

工作原理
首先要了解光敏传感器的工作原理:
实际上光敏传感器就是一个光敏二极管,这个二极管对光的变化非常敏感,光敏二极管具有单项导通性,二极管的管芯是一个光敏PN结。工作时,在二极管俩端加上反向电压,无光照时,有很小的饱和反向漏电流,即暗电流,此时光敏二极管截止。当受到光照时,饱和反向漏电流大大增加,形成光电流,它随入射光强度的变化而变化。当光线照射 PN 结时,可以使 PN 结中产生电子一空穴对,使少数载流子的密度增加。这些载流子在反向电压下漂移,使反向电流增加。因此可以利用光照强弱来改变电路中的电流,再串联一个电阻,就是反映光照强度的电信号了,就可以用ADC读取光照,从而得出环境的光照情况。

ADC配置
关于ADC的详细讲解,可以参考我之前的一篇博客:点击跳转
采用ADC3的通道6,来转换电压,光敏传感器接在PF8上,要初始化相关引脚,初始化ADC,配置ADC相关参数,编写ADC的中断服务函数,直接上代码:

//ADC3_CH6 PF8 接光敏传感器 越暗电压越大
void ADC3_LS1_Init( void )
{
	GPIO_InitTypeDef GPIO_InitStruct;
	ADC_InitTypeDef ADC_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC3|RCC_APB2Periph_GPIOF, ENABLE );
	
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//GPIO引脚模式:模拟输入
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init( GPIOF, &GPIO_InitStruct );
	
	ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//连续转换模式开启
	ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
	ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//关闭外部触发,使用
	ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//使用一个ADC
	ADC_InitStruct.ADC_NbrOfChannel = 1;//一个ADC转换通道
	ADC_InitStruct.ADC_ScanConvMode = DISABLE;//禁止扫描模式(多通道时使用)
	ADC_Init( ADC3, &ADC_InitStruct );
	
	NVIC_InitStruct.NVIC_IRQChannel = ADC3_IRQn;
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
	NVIC_Init( &NVIC_InitStruct );
	
	
	RCC_ADCCLKConfig( RCC_PCLK2_Div8 );//ADC时钟8分频
	/* 转换时间确定后,完成一次转换就进入一次中断 */
	ADC_RegularChannelConfig( ADC3, ADC_Channel_6, 1, ADC_SampleTime_55Cycles5 );//配置转换时间及顺序
	ADC_ITConfig( ADC3, ADC_IT_EOC, ENABLE );//开启中断,转换完成触发
	ADC_Cmd( ADC3, ENABLE );//开启ADC3
	
	//下面这几步操作的函数在库函数中是挨着的,方便记忆
	ADC_ResetCalibration(ADC3);//重置ADC,下面校准
	while( ADC_GetResetCalibrationStatus(ADC3)==1 )//等待重置完成
		ADC_StartCalibration( ADC3 );//开始校准
	while( ADC_GetCalibrationStatus(ADC3)==1 );//等待校准完成
	
	ADC_SoftwareStartConvCmd( ADC3, ENABLE );//使能软件触发
	
}


uint16_t Result;
/* ADC3的中断服务函数 */
void ADC3_IRQHandler( void )
{
	if( ADC_GetITStatus( ADC3, ADC_IT_EOC )==SET )
	{
		ADC_ClearITPendingBit( ADC3, ADC_IT_EOC );
		Result = ADC_GetConversionValue( ADC3 );
	}
	
}

读取的原始数据经过转换可以得到对应的电压值:

float x;
x = (float)(Result*3.3/4096);

程序运行后的效果如图:
在这里插入图片描述
只需要判断以下电压值,再根据相应的电压值区间显示信息即可,这个程序主要是熟悉一下ADC的使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值