打印
[应用相关]

学习STM32的光敏传感器

[复制链接]
796|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-8-23 08:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
光敏传感器是一种能够感知光线强度并将其转化为电信号的传感器。在STM32学习中,光敏传感器具有广泛的应用,例如光线控制、自动亮度调节等。本文将详细介绍如何使用STM32控制光敏传感器,并提供代码案例进行实验。

本文将基于STM32F4系列的微控制器进行讲解,使用的光敏传感器为光敏三极管,也称为光敏电阻。我们将使用ADC(模数转换器)模块来读取光敏传感器产生的电信号,并通过串口显示光线强度的数值。

下面是实验所需的材料清单:

STM32F4开发板(如STM32F407ZET6)
光敏传感器(光敏三极管)
杜邦线若干
串口转USB模块
接下来,我们将分为以下几个步骤来进行实验:

硬件连接 首先,将光敏传感器的正极连接到STM32的3.3V供电引脚,负极连接到STM32的GND引脚。然后,将光敏传感器的信号引脚连接到STM32的模拟输入引脚(例如PA0引脚)。

初始化ADC模块 在使用ADC模块之前,我们需要对其进行初始化。以下是初始化ADC模块的代码:

#include "stm32f4xx.h"

void ADC_Init(void){
  // 使能ADC1、GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);

  // 配置ADC初始化结构体
  ADC_InitTypeDef ADC_InitStruct;
  ADC_StructInit(&ADC_InitStruct);
  ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStruct.ADC_ScanConvMode = DISABLE;
  ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStruct.ADC_NbrOfConversion = 1;

  // 初始化ADC1
  ADC_Init(ADC1, &ADC_InitStruct);

  // 配置ADC通道
  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);

  // 使能ADC1
  ADC_Cmd(ADC1, ENABLE);

  // 等待ADC1准备就绪
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));

  // 执行ADC校准
  ADC_StartCalibration(ADC1);
  while(ADC_GetCalibrationStatus(ADC1));
}

读取光线强度 读取光线强度的核心代码如下所示:
uint16_t ADC_GetValue(void){
  // 启动ADC转换
  ADC_StartConversion(ADC1);

  // 等待转换完成
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

  // 返回ADC转换结果
  return ADC_GetConversionValue(ADC1);
}
串口输出 通过串口输出光线强度,以便观察结果。以下是初始化串口的代码:
#include "stm32f4xx.h"

void USART_Init(void){
  // 使能USART2、GPIOA时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

  // 配置USART2引脚
  GPIO_InitTypeDef GPIO_InitStruct;
  GPIO_StructInit(&GPIO_InitStruct);
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);

  // 配置USART2参数
  USART_InitTypeDef USART_InitStruct;
  USART_StructInit(&USART_InitStruct);
  USART_InitStruct.USART_BaudRate = 115200;
  USART_Init(USART2, &USART_InitStruct);

  // 使能USART2
  USART_Cmd(USART2, ENABLE);
}

然后,我们可以通过以下代码来实现串口输出:

void USART_SendString(char* str){
  while(*str){
    while(!USART_GetFlagStatus(USART2, USART_FLAG_TXE));
    USART_SendData(USART2, *str++);
  }
}

int main(void){
  // 初始化ADC模块
  ADC_Init();

  // 初始化串口
  USART_Init();

  while(1){
    // 读取光线强度
    uint16_t light = ADC_GetValue();

    // 将光线强度值转换为字符串并发送到串口
    char str[16];
    sprintf(str, "Light: %d\r\n", light);
    USART_SendString(str);

    // 延时一段时间
    for(int i=0; i<1000000; i++);
  }
}

通过上述步骤,我们完成了使用STM32控制光敏传感器的实验。在实际应用中,我们可以根据光线强度的数值来进行相应的操作,例如控制LED灯的亮度、控制窗帘的开合等。

需要注意的是,本文只是提供了一个基本的实验框架,实际应用中可能需要根据具体的传感器和需求进行适当的调整和修改。另外,为了确保实验的准确性和可靠性,建议使用STM32的官方库函数(例如HAL库)来进行开发。

希望本文能够对学习STM32控制光敏传感器有所帮助,如果有任何疑问,请随时提问。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/qq_67153941/article/details/141300295

使用特权

评论回复
沙发
梵蒂冈是神uy| | 2024-8-23 14:37 | 只看该作者
可以控制LED灯的亮度根据光线强度的数值来进行相应的操作

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1923

主题

15596

帖子

11

粉丝