我们在日常生活中一般会需要采集光照度来判断灯是否打开,应用范围非常广泛。本次来研究一下该模块的实现。
首先看一下模块的样子,如下图:
该模块有四个引脚,分别为VCC、GND、AO、DO,其中AO是模块的模拟输出,DO是模块的数字量输出。
我们分别验证该模块的数字量输出和模拟量输出,并通过标准库和HAL库实现。
单片机型号:STM32F103系列
光敏模块工作电压:3.3V-5V
标准库实现:
1.数字量实现光照度采集。
接线表设计:
模块(光敏模块) | STM32的IO口 | 设置的工作模式 |
VCC | VCC(3.3V) | - |
GND | GND | - |
DO | PA0 | GPIO_Mode_IPU (上拉输入模式) |
- | PA9 | TX(串口1通信) |
- | PA10 | RX(串口1通信) |
代码片段:
-
/
****
****
****
****
****
****
****
****
****
****
-
函数名称:void illuminanceDetectionRead
_DO(void)
-
函数参数:无参
-
函数返回值:无
-
函数功能:光照度状态读取
-
创建作者:王艇
-
创建时间:2021.5.21
-
联系方式:
-
修改作者:
-
修改时间:
-
修改说明:
-
****************************************/
-
void illuminanceDetectionRead_DO(void)
-
{
-
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
-
{
-
USART1_printf(USART1, "\n光照度强\r\n");
-
}
-
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1)
-
{
-
USART1_printf(USART1, "\n光照度弱\r\n");
-
}
-
DelayMS(1000); // 延时1秒
-
}
实现效果: 提示:我们可以调节模块中的电位器调整对光照变化的灵敏度。
显然数字量的检测可以实现光照度,但光照度的变不能细化,因此我们需要AD转换,实现光照度精确采集,这样可以应用到很多场景。
2.模拟量实现光照度采集。
接线表设计:
模块(光敏模块) | STM32的IO口 | 设置的工作模式 |
VCC | VCC(3.3V) | - |
GND | GND | - |
AO | PA0 | GPIO_Mode_AIN (模拟输入模式) |
- | PA9 | TX(串口1通信) |
- | PA10 | RX(串口1通信) |
-
/
****
****
****
****
****
****
****
****
****
****
-
函数名称:void illuminanceInitConfig(void)
-
函数参数:无参
-
函数返回值:无
-
函数功能:光敏模块ADC初始化配置
-
创建作者:王艇
-
创建时间:2021.5.21
-
联系方式:
-
修改作者:
-
修改时间:
-
修改说明:
-
****
****
****
****
****
****
****
****
****
****/
-
void illuminanceInitConfig
_AO(void)
-
{
-
GPIO_InitTypeDef GPIO
_InitStructure;
-
ADC_InitTypeDef ADC
_InitStructure;
-
-
RCC_APB2PeriphClockCmd(RCC
_APB2Periph_ADC1,ENABLE);
-
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
-
-
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
-
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
-
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
-
GPIO_Init(GPIOA, &GPIO_InitStructure);
-
-
// ADC1 工作模式配置
-
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
-
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_InitStructure.ADC_NbrOfChannel = 1;
-
ADC_Init(ADC1, &ADC_InitStructure);
-
-
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_13Cycles5);
-
-
ADC_Cmd(ADC1, ENABLE);
-
ADC_ResetCalibration(ADC1);
-
/* Check the end of ADC1 reset calibration register */
-
while(ADC_GetResetCalibrationStatus(ADC1));
-
ADC_StartCalibration(ADC1);
-
/* Check the end of ADC1 calibration */
-
while(ADC_GetCalibrationStatus(ADC1));
-
}
-
/
****
****
****
****
****
****
****
****
****
****
-
函数名称:void illuminanceDetectionRead
_AO(void)
-
函数参数:无参
-
函数返回值:无
-
函数功能:光照度状态读取
-
创建作者:王艇
-
创建时间:2021.5.21
-
联系方式:
-
修改作者:
-
修改时间:
-
修改说明:
-
****************************************/
-
u16 illuminanceDetectionRead_AO(void)
-
{
-
u16 ADC_VALUE = 0;
-
-
-
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
-
ADC_VALUE = ADC_GetConversionValue(ADC1);
-
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
-
return ADC_VALUE;
-
}
实现效果:
HAL库实现:
1.数字量采集光照度:
接线表设计:
模块(光敏模块) | STM32的IO口 | 设置的工作模式 |
VCC | VCC(3.3V) | - |
GND | GND | - |
DO | PA0 | 输入模式(上拉) |
- | PA9 | TX(串口1通信) |
- | PA10 | RX(串口1通信) |
实现效果:
2.模拟量采集光照度:
接线表设计:
模块(光敏模块) | STM32的IO口 | 设置的工作模式 |
VCC | VCC(3.3V) | - |
GND | GND | - |
AO | PA0 | ADC1_IN0 |
- | PA9 | TX(串口1通信) |
- | PA10 | RX(串口1通信) |
实现效果:
大家需要可以留言,我发给大家,互相学习互相交流。
源码下载链接:(1条消息) 光敏电阻模块光照度采集(标准库和HAL实现)-电信文档类资源-CSDN下载
转载:https://blog.csdn.net/XiaoCaiDaYong/article/details/117108810