我是靠谱客的博主 迷你皮皮虾,这篇文章主要介绍33_光敏传感器实验光敏传感器简介硬件接线图 实验源码,现在分享给大家,希望可以做个参考。

目录

光敏传感器简介

硬件接线图

实验源码


光敏传感器简介

光敏传感器简介

  光敏传感器是最常见的传感器之一,它的种类繁多主要有:光电管、光电倍增管、光敏电阻、光敏三极管、太阳能电池、红外线传感器、紫外线传感器、光纤式光电传感器、色彩传感器、CCD和CMOS图像传感器等。光传感器是目前产量最多、应用最广的传感器之一,它在自动控制和非电量电测技术中占有非常重要的地位。

  光敏传感器是利用光敏元件将光信号转换为电信号的传感器,它的敏感波长在可见光波长附近,包括红外线波长和紫外线波长。光传感器不只局限于对光的探测,它还可以作为探测元件组成其他传感器,对许多非电量进行检测,只要将这些非电量转换为光信号的变化即可。

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

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

  利用这个电流变化,我们串接一个电阻,就可以转换成电压的变化(功率一定情况下电压和电流成反比),从而通过ADC读取电压值,判断外部光线的强弱。 

硬件接线图

 实验源码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/** ****************************************************************************** * @file : user_rcc_config.c * @brief : V1.00 ****************************************************************************** * @attention * ****************************************************************************** */ /* Include 包含---------------------------------------------------------------*/ #include "user_rcc_config.h" /* Typedef 类型----------------------------------------------------------------*/ /* Define 定义----------------------------------------------------------------*/ /* Macro 宏------------------------------------------------------------------*/ /* Variables 变量--------------------------------------------------------------*/ /* Constants 常量--------------------------------------------------------------*/ /* Function 函数--------------------------------------------------------------*/ /*! brief RCC配置 param[in] none param[out] none retval none */ void Rcc_config(void) { /*使能GPIOA时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); /*使能GPIOF时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE); /*使能UART1时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); /*使能ADC1通道时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3,ENABLE ); /*设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M*/ RCC_ADCCLKConfig(RCC_PCLK2_Div6); } /************************************************************** END OF FILE ****/
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/** ****************************************************************************** * @file : user_gpio.c * @brief : V1.00 ****************************************************************************** * @attention * ****************************************************************************** */ /* Include 包含---------------------------------------------------------------*/ #include "user_gpio.h" /* Typedef 类型----------------------------------------------------------------*/ /* Define 定义----------------------------------------------------------------*/ /* Macro 宏------------------------------------------------------------------*/ /* Variables 变量--------------------------------------------------------------*/ /* Constants 常量--------------------------------------------------------------*/ /* Function 函数--------------------------------------------------------------*/ /*! brief GPIO初始化函数 param[in] none param[out] none retval none */ void Gpio_Init(void) { /*GPIO结构体*/ GPIO_InitTypeDef GPIO_InitTypeDefstruct; /*UART1发送引脚配置*/ GPIO_InitTypeDefstruct.GPIO_Mode = GPIO_Mode_AF_PP;//推挽复用输出 GPIO_InitTypeDefstruct.GPIO_Pin = GPIO_Pin_9; GPIO_InitTypeDefstruct.GPIO_Speed = GPIO_Speed_10MHz; /*写入结构体到GPIOA*/ GPIO_Init(GPIOA,&GPIO_InitTypeDefstruct); /*UART1接收引脚配置*/ GPIO_InitTypeDefstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_InitTypeDefstruct.GPIO_Pin = GPIO_Pin_10; GPIO_InitTypeDefstruct.GPIO_Speed = GPIO_Speed_10MHz; /*写入结构体到GPIOA*/ GPIO_Init(GPIOA,&GPIO_InitTypeDefstruct); /*PF8作为模拟通道输入引脚*/ GPIO_InitTypeDefstruct.GPIO_Pin = GPIO_Pin_1; GPIO_InitTypeDefstruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入引脚 GPIO_Init(GPIOF, &GPIO_InitTypeDefstruct); } /************************************************************** END OF FILE ****/
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/** ****************************************************************************** * @file : user_adc.c * @brief : V1.00 ****************************************************************************** * @attention * ****************************************************************************** */ /* Include 包含---------------------------------------------------------------*/ #include "user_adc.h" /* Typedef 类型----------------------------------------------------------------*/ /* Define 定义----------------------------------------------------------------*/ /* Macro 宏------------------------------------------------------------------*/ /* Variables 变量--------------------------------------------------------------*/ /* Constants 常量--------------------------------------------------------------*/ /* Function 函数--------------------------------------------------------------*/ /*! brief ADC初始函数 param[in] none param[in] none retval none */ void Adc_Init(void) { /*ADC结构体*/ ADC_InitTypeDef ADC_InitStructure; /*复位ADC1*/ ADC_DeInit(ADC3); /*ADC配置*/ ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC3独立模式 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通道的数目 /*写入ADC1里面*/ ADC_Init(ADC3, &ADC_InitStructure); /*使能ADC3*/ ADC_Cmd(ADC3, ENABLE); /*使能复位校准*/ ADC_ResetCalibration(ADC3); /*等待复位校准结束*/ while(ADC_GetResetCalibrationStatus(ADC3)); /*开启AD校准*/ ADC_StartCalibration(ADC3); /*等待校准结束*/ while(ADC_GetCalibrationStatus(ADC3)); } /*! brief 获取ADC3通道数值函数 param[in] none param[in] none retval none */ uint16_t Get_Adc3(uint8_t Channel) { /*ADC1,通道Channel,转换顺序1第一个转换,采样时间239.5个周期*/ ADC_RegularChannelConfig(ADC3, Channel, 1, ADC_SampleTime_239Cycles5 ); /*使能ADC1软件转换*/ ADC_SoftwareStartConvCmd(ADC3,ENABLE); /*等待转换结束*/ while(ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC ) == 0); /*返回最近一次ADC1转换结果*/ return ADC_GetConversionValue(ADC3); } /*! brief 获取ADC3转换数值取平均值 param[in] none param[in] none retval none */ uint16_t Get_Adc_Average(uint8_t Channel,uint8_t Count) { uint32_t val = 0; uint8_t i; for(i =0;i<Count;i++) { val+=Get_Adc3(Channel); delay_ms(5); } return val/Count; } /*! brief 获取光敏传感值 param[in] none param[in] none retval 返回光敏传感器值 0-100 0最暗 最亮100 */ uint16_t Get_Adc_Light(void) { uint32_t val; uint16_t result; /*读取ADC3通道6,10次取取平均值*/ val = Get_Adc_Average(ADC_Channel_6,10); /*12位精度十进制就是4096,这里大于4000赋值4000方便计算*/ if(val > 4000) { val = 4000; } /*当值等于4000(电压最大3.3V)的时候说明最暗,4000/40=100个等级,100-100 = 0就是最暗, 不使用100减的话就是100是最暗的0是最大的,为了能符合正常的逻辑思维0最暗 100最亮*/ return (uint8_t)(100-(val/40)); } /************************************************************** END OF FILE ****/
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/** ****************************************************************************** * @file : user_uart.c * @brief : V1.00 ****************************************************************************** * @attention * ****************************************************************************** */ /* Include 包含---------------------------------------------------------------*/ #include "user_uart.h" /* Typedef 类型----------------------------------------------------------------*/ /* Define 定义----------------------------------------------------------------*/ /* Macro 宏------------------------------------------------------------------*/ /* Variables 变量--------------------------------------------------------------*/ extern uint16_t USART_RX_STA; extern uint8_t USART_RX_BUF[200]; /* Constants 常量--------------------------------------------------------------*/ /* Function 函数--------------------------------------------------------------*/ #if 1 #pragma import(__use_no_semihosting) /*实现Printf代码*/ struct __FILE { int handle; }; FILE __stdout; void _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) ch; return ch; } #endif /*! brief UART1初始化 param[in] none param[out] none retval none */ void Uart1_Init(u32 bound) { /*UART结构体*/ USART_InitTypeDef USART_InitTypeDefstruct; /*UART结构体配置*/ USART_InitTypeDefstruct.USART_BaudRate = bound; //波特率 USART_InitTypeDefstruct.USART_HardwareFlowControl =USART_HardwareFlowControl_None; //不使用硬件流 USART_InitTypeDefstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//发送接收使能 USART_InitTypeDefstruct.USART_Parity = USART_Parity_No; //不使用奇偶校验 USART_InitTypeDefstruct.USART_StopBits = USART_StopBits_1; //1个停止位 USART_InitTypeDefstruct.USART_WordLength = USART_WordLength_8b; //8个数据位 /*写入USART1*/ USART_Init(USART1,&USART_InitTypeDefstruct); /*使能串口1*/ USART_Cmd(USART1,ENABLE); } /*! brief UART1中断服务函数 param[in] none param[out] none retval none */ void USART1_IRQHandler(void) { } /************************************************************** END OF FILE ****/
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/** ****************************************************************************** * @file : user_mian.h * @brief : V1.00 ****************************************************************************** * @attention * ****************************************************************************** */ /* Include 包含---------------------------------------------------------------*/ #include "stm32f10x.h" #include <stdbool.h> #include "user_gpio.h" #include "user_delay.h" #include "user_rcc_config.h" #include "user_uart.h" #include "user_adc.h" /* Typedef 类型----------------------------------------------------------------*/ /* Define 定义----------------------------------------------------------------*/ /* Macro 宏------------------------------------------------------------------*/ /* Variables 变量--------------------------------------------------------------*/ //最多一次接收200个字节 uint8_t USART_RX_BUF[200]; //接收状态 //bit15, 接收完成标志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字节数目 uint16_t USART_RX_STA=0; //接收状态标记 /* Constants 常量--------------------------------------------------------------*/ /* Function 函数--------------------------------------------------------------*/ int main(void) { /*配置系统中断分组为2位抢占2位响应*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*延时函数初始化*/ delay_init(); /*RCC配置*/ Rcc_config(); /*GPIO初始化*/ Gpio_Init(); /*初始化ADC1*/ Adc_Init(); /*USART1初始化*/ Uart1_Init(9600); /*死循环*/ while(1){ printf("光强等级:%drn",Get_Adc_Light()); delay_ms(1000); } } /************************************************************** END OF FILE ****/

最后

以上就是迷你皮皮虾最近收集整理的关于33_光敏传感器实验光敏传感器简介硬件接线图 实验源码的全部内容,更多相关33_光敏传感器实验光敏传感器简介硬件接线图 实验源码内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部