STM32F1与STM32CubeIDE编程实例-光敏电阻(LDR)传感器驱动

光敏电阻(LDR)传感器驱动

光敏电阻器(也称为光电池或光敏电阻器、LDR 或光电导电池)是一种无源元件,可降低元件敏感表面上接收光度(光)的电阻。光敏电阻的电阻随着入射 l 强度的增加而减小;换言之,它表现出光电导性。光敏电阻可应用于光敏检测器电路和光激活和暗激活开关电路中,作为电阻半导体。在黑暗中,光敏电阻可以具有高达几兆欧 (MΩ) 的电阻,而在光照下,光敏电阻可以具有低至几百欧姆的电阻。如果光敏电阻上的入射光超过某个频率,则被半导体吸收的光子会为束缚电子提供足够的能量以跳入导带。由此产生的自由电子(及其空穴伙伴)导电,从而降低电阻。光敏电阻的电阻范围和灵敏度在不同的器件之间可能存在很大差异。此外,独特的光敏电阻对某些波段内的光子的反应可能大不相同。

在这里插入图片描述

本实例将介绍如何驱动LDR传感器。在前面的文章中,对LDR传感器也做了详细的介绍,请参考:

1、LDR传感器配置

LDR传感器驱动通过ADC配置来完成。配置如下:

在这里插入图片描述

本次实例使用轮询方式对LDR传感器进行采样。关于ADC相关介绍,请参考:

2、LDR驱动实现

1)基本定义

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
/\*
\* ldr.h
\*
\* Created on: Apr 22, 2022
\* Author: jenson
\*/

#ifndef \_\_LDR\_H\_\_
#define \_\_LDR\_H\_\_

#include <stm32f1xx\_hal.h>
#include "main.h"
#include <stdio.h>

typedef struct {
uint16\_t id; // 编号
GPIO_TypeDef \*GPIOx; // 总线端口
uint16\_t GPIO_Pin; // 总线引脚
ADC_HandleTypeDef\* adc; // ADC
} ldr\_sensor\_t;
/\*\*
\* @brief 初始化传感器
\* @param sensor 传感对象
\* \*/
void ldr\_init(ldr\_sensor\_t\* sensor);
/\*\*
\* @brief 读取传感的值
\* @param sensor 传感器对象
\* @param out\_value 传感器的值
\* @return 读取成功,返回1;否则返回0
\* \*/
uint8\_t ldr\_read\_value(ldr\_sensor\_t\* sensor,int32\_t\* out_value);

#endif /\* \_\_LDR\_H\_\_ \*/


2)驱动代码实现

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
/\*
\* ldr.c
\*
\* Created on: Apr 22, 2022
\* Author: jenson
\*/


#include "ldr.h"

void ldr\_init(ldr\_sensor\_t\* sensor){
// 校准ADC
HAL\_ADCEx\_Calibration\_Start(sensor->adc);
}

uint8\_t ldr\_read\_value(ldr\_sensor\_t\* sensor,int32\_t\* out_value){
uint32\_t value = -1;
// 开始采样
HAL\_ADC\_Start(sensor->adc);
// 轮询方式转换采样值
HAL\_ADC\_PollForConversion(sensor->adc, 1);
// 获取最终采样值
value = HAL\_ADC\_GetValue(sensor->adc);
\*out_value = value;
return 1;
}


3)主程序

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
/\* Private includes ----------------------------------------------------------\*/
/\* USER CODE BEGIN Includes \*/
#include "ldr/ldr.h"
#include <stdio.h>
/\* USER CODE END Includes \*/

/\* USER CODE BEGIN PV \*/
ldr\_sensor\_t sensor;
int32\_t sensor_value = 0;
/\* USER CODE END PV \*/

int main(void) {
/\* USER CODE BEGIN 1 \*/

/\* USER CODE END 1 \*/

/\* MCU Configuration--------------------------------------------------------\*/

/\* Reset of all peripherals, Initializes the Flash interface and the Systick. \*/
HAL\_Init();

/\* USER CODE BEGIN Init \*/

/\* USER CODE END Init \*/

/\* Configure the system clock \*/
SystemClock\_Config();

/\* USER CODE BEGIN SysInit \*/

/\* USER CODE END SysInit \*/

/\* Initialize all configured peripherals \*/
MX\_GPIO\_Init();
MX\_ADC1\_Init();
MX\_USART1\_UART\_Init();
/\* USER CODE BEGIN 2 \*/
sensor.id = 1;
sensor.GPIOx = LDR_SENSOR_GPIO_Port;
sensor.GPIO_Pin = LDR_SENSOR_Pin;
sensor.adc = &hadc1;

ldr\_init(&sensor);

printf("\*\*\*\*STM32CubeIDE:LDR\*\*\*\*\r\n");
/\* USER CODE END 2 \*/

/\* Infinite loop \*/
/\* USER CODE BEGIN WHILE \*/
while (1) {
/\* USER CODE END WHILE \*/

/\* USER CODE BEGIN 3 \*/
uint8\_t res = ldr\_read\_value(&sensor, &sensor_value);
if (res) {
printf("current ldr value:%ld\r\n", sensor_value);
}else{
printf("read sensor value failed.\r\n");
}
HAL\_Delay(100);
}
/\* USER CODE END 3 \*/
}

程序运行结果如下:

在这里插入图片描述

文章来源: https://iotsmart.blog.csdn.net/article/details/125313513