前言
多少事,从来急;天地转,光阴迫。 一万年太长,只争朝夕。 ——满江红毛泽东·郭沫若同志致郭沫若同志
一、简介
这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。这是由于光照产生的载流子都参与导电,在外加电场的作用下作漂移运动,电子奔向电源的正极,空穴奔向电源的负极,从而使光敏电阻器的阻值迅速下降。
是否可以调整 阈值 ,如图所示:
- 光敏电阻对光非常敏感。光线越强,电阻值越低。随着光强度的增加,电阻值迅速降低到1KΩ以下。
- 光敏电阻的工作原理是基于内部光电效应,即在半导体光敏材料的两端安装电极导线,并将其包装在带透明窗户的管壳中,形成光敏电阻。为了提高灵敏度,两个电极通常被梳成梳状。
二、原理
我使用的模块只有三个引脚,其他不同类型的模块可能有四个引脚。相比之下,会有更多的引脚DO(数字输出)。 这三个引脚分别是VCC、GND、AO,简介图中已标明了具体的引脚。
- VCC:接电源正极 3.3~5V;
- GND:接地;
- AO :模拟输出;(模数转换器的通道 ADC1_IN0 对应I/O口 :PA0)
光敏模块接口 | STM32的IO口 | 设置的工作模式 |
---|---|---|
VCC | VCC(3.3V) | - |
GND | GND | - |
AO(S:Sign) | PA0 | GPIO_Mode_IPU(上拉输入模式) |
- | PA9 | TX(USART1 串口1通信) |
- | PA10 | RX(USART1 串口1通信) |
光敏电阻收集的模拟量:
STM32F1的AD采样结果为12位,即采样最大值为4096(即2的12次方),参考电压3.3V,所以3.3V对应4096,当然,3.3V只是理想状态,实际上可能有轻微的偏差。假设单片机AD引脚电压采集为x,实际单片机的参考电压为z伏,读取AD值与x的对应关系如下: 分析温度采集电路中电压值与电阻值的关系: 可以得出两个等式联立AD与电阻的关系:y = 1000 * AD / 4096 -AD
;
三、新建工程
1.打开STM32CubeMX点击新建工程软件
2. 选择 MCU 和封装
3.配置时钟
我的博客网站-RCC学习
4.配置调试模式
5.串口(USART1)配置
6.ADC配置
- 在
Analog
中选择ADC1
以规则通道为例,设置打开通道0(IN0)
,将ADC1的通道0(IN0)
对应的引脚(PA0)
与光敏电阻
的AO引脚
用杜邦线连接,接收模拟量。
7.生成代码
输入项目名称和路径。 选择应用的IDE
,开发环境MDK-ARM V5
- 所有的初始代码都生成了 main.c
- 在相应的外设文件中生成初始代码。 如 GPIO 生成初始代码 gpio.c 中。
8.构建工程
芯片选择模式:
四、编写代码
在main.c
在文件中添加代码:
- 重写
fget
和fput
函数:,添加头文件<stdio.h>
;
/* USER CODE BEGIN Includes */ #include<stdio.h> /* USER CODE END Includes */
/** * 函数功能: 重定向c库函数printf到DEBUG_USARTx * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */ int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff); return ch; } /** * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx * 输入参数: 无 * 返 回 值: 无 * 说 明:无 */ int fgetc(FILE *f) { uint8_t ch = 0; HAL_UART_Receive(&huart1, &ch, 1, 0xffff); return ch; }
- 定义变量:接收数据;
/* USER CODE BEGIN 1 */ int Val; //定义一个变量来表示光强 /* USER CODE END 1 */
- 对ADC具体操作代码:
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ AL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1 ,50);
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
Val = HAL_ADC_GetValue(&hadc1);
}
printf("光照强度:%d \r\n",Val);
HAL_Delay(1000);
}
/* USER CODE END 3 */