STM32CubeMX——光敏电阻检测光照强度

前言

多少事,从来急;天地转,光阴迫。
一万年太久,只争朝夕。 ——毛泽东《满江红·致郭沫若同志》


一、简介

  • 光敏电阻

光敏电阻(photoresistor or light-dependent resistor,后者缩写为ldr)或光导管(photoconductor),常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。 这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。这是由于光照产生的载流子都参与导电,在外加电场的作用下作漂移运动,电子奔向电源的正极,空穴奔向电源的负极,从而使光敏电阻器的阻值迅速下降。

STM32CubeMX——光敏电阻检测光照强度_第1张图片
我自己使用的是下面的这款更为简易的光敏电阻:
STM32CubeMX——光敏电阻检测光照强度_第2张图片

两者相比之下的不同是: 是否可以调节 阈值 ,可以通过旋钮来改变它的阈值,如图:
STM32CubeMX——光敏电阻检测光照强度_第3张图片

  • 特性:
    光敏电阻对光线十分敏感。光照愈强,阻值就愈低。随着光照强度的升高,电阻值迅速降低,可降低至1KΩ以下。
  • 工作原理:
    光敏电阻的工作原理是基于内光电效应,即在半导体光敏材料两端装上电极引线,将其封装在带有透明窗的管壳里就构成光敏电阻。为了增加灵敏度,两电极常做成梳状。
    STM32CubeMX——光敏电阻检测光照强度_第4张图片
  • 光敏模块原理图:
    STM32CubeMX——光敏电阻检测光照强度_第5张图片

二、原理

我使用的模块只有三个引脚,可能还会有其他不同类型的模块会有四个引脚,相比之下,会多一个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的对应关系如下:
在这里插入图片描述
再分析温度采集电路中,电压值与电阻值的关系:
STM32CubeMX——光敏电阻检测光照强度_第6张图片
在这里插入图片描述
两个等式联立,可以得出AD与电阻的关系:y = 1000 * AD / 4096 -AD
在这里插入图片描述


三、新建工程

1.打开STM32CubeMX软件,点击“新建工程”

STM32CubeMX——光敏电阻检测光照强度_第7张图片

2. 选择 MCU 和封装

STM32CubeMX——光敏电阻检测光照强度_第8张图片

3.配置时钟

STM32CubeMX——光敏电阻检测光照强度_第9张图片
STM32CubeMX——光敏电阻检测光照强度_第10张图片
具体学习可以参考:本人博客网站-RCC学习

4.配置调试模式

5.串口(USART1)配置

在这里插入图片描述

6.ADC配置

  • 初始化参数配置:
    Analog中选择ADC1设置,仅以规则通道为例,开启通道0(IN0),将ADC1的通道0(IN0)对应的引脚(PA0)光敏电阻AO引脚用杜邦线连接起来,用以接收模拟量。
    STM32CubeMX——光敏电阻检测光照强度_第11张图片

7.生成代码

输入项目名称和路径。(注:路径中不允许出现中文。)
STM32CubeMX——光敏电阻检测光照强度_第12张图片
选择应用的IDE,开发环境MDK-ARM V5
STM32CubeMX——光敏电阻检测光照强度_第13张图片
每个外设生成独立的 ’.c/.h’ 文件

  • 不勾: 所有初始化代码都生成在 main.c
  • 勾选: 初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。

    点击 GENERATE CODE 生成代码

8.构建工程

DeBug的模式根据不同的芯片进行选择:
在这里插入图片描述


四、编写代码

main.c文件中,添加一下代码:

  • 重写fgetfput函数:勾选微库(这个很重要),添加头文件
    在这里插入图片描述
/* USER CODE BEGIN Includes */
#include
/* 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 */
    HAL_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 */

五、实验结果

STM32CubeMX——光敏电阻检测光照强度_第14张图片

谢谢阅读!!!

STM32CubeMX——光敏电阻检测光照强度_第15张图片

你可能感兴趣的:(STM32模块学习,stm32,单片机)