2.17 雨滴传感器
雨滴传感器主要是用来检测是否下雨及雨量的大小。主要用于汽车智能灯光(AFS)系统、汽车自动雨刷系统、智能车窗系统。
该雨滴传感器基本上是一块板,上面以线形形式涂覆镍。雨滴传感器常见的工作原理是通过检测水滴的导电性来判断是否下雨。它是利用两个电极之间的电导性变化来测量水滴的存在。这两个电极之间会有一个空气间隙,正常状态下是断路状态。当水滴接触到电极上时,水滴的导电性会导致电流通过水滴形成电流回路,从而改变电极之间的电阻值。也就改变了其两端的压降。
2.17.1 模块来源
采购链接: 雨滴感应模块 雨水传感器下雨感知模块天气模块 水位显示模块水滴 资料下载链接: https://pan.baidu.com/s/10bjbsmcOh2N7YGDS3PquPw 资料提取码:psfm
**图 2.16.1-1 产品实物展示**2.17.2 规格参数
**工作电压:**3.3V-5V **探测距离:**1 米 **输出方式: **DO 接口为数字量输出 AO 接口为模拟量输出 **读取方式:**ADC 与数字量(0 和 1) **管脚数量:**4 Pin(2.54mm 间距排针) 文件 2.16.2-1 产品说明书
2.17.3 移植过程
我们的目标是在梁山派 GD32F470 上能够判断当前雨水采集板上是否有水的功能。首先要获取资料,查看数据手册应如何实现,再移植至我们的工程。
2.17.3.1 查看资料
该模块基于LM393运算放大器。它包括电子模块和“收集”雨滴的印刷电路板。当雨滴积聚在电路板上时,它们会形成并联电阻路径,该路径可通过运算放大器进行测量。
控制板上有两个指示灯,电源指示灯 PWR-LED 和输出信号指示灯 DO-LED。电源指示灯在通电后常亮,没有雨的时候出信号指示灯不亮;雨滴上去,候出信号指示灯亮。雨滴板和控制板是分开的,方便将线引出,大面积的雨滴板,更有利于检测到雨水。
控制板上有两个输出,数字输出 DO,模拟输出 AO。接上 5V 电源电源灯亮,感应板上没有水滴时,DO 输出为高电平,滴上一滴水,DO 输出为低电平,刷掉上面的水滴,又恢复到输出高电平状态,灵敏度可以通过蓝色的可变电阻调节。
AO 模拟输出,连接到单片机的的模拟输入口,通过比对模拟值转化为的数字值大小,可以检测滴在上面的雨量大小,雨水越大,电阻值越小,模拟值转化为的数字值越大。 不同的值对应是降雨量的多少毫米,则需要实体测量,雨滴板的放置方式不同结果都不同,这里不作研究。
其对应的原理图见图 2.17.3.1-2,AO 输出为雨滴传感器直接输出的电压,所以为模拟量;DO 为经过 LM393 进行电压比较后,输出高低电平,所以为数字量。具体原理见光敏电阻光照传感器章节的 2.3.3.1 查看资料。
图 2.17.3.1-2 雨滴传感器原理图
因此 DO 引脚可以配置为 GPIO 的输入模式,AO 引脚需要配置为 ADC 模拟输入模式。
2.17.3.2 引脚选择
想要使用 ADC,需要确定使用的引脚是否有 ADC 外设功能。可以通过数据手册【GD32F450xx_Datasheet_Rev2.2.pdf】进行查看。文件下载见文件 2.17.3.2-1 数据手册(GD32F450 与 GD32F470 在功能与寄存器地址上没有区分)(梁山派开发板资料可在官网获取 www.lckfb.com)
**图 2.17.3.2-1 数据手册来源** **文件 2.17.3.2-1 数据手册**在数据手册的第 28 页结尾,是关于 GD32F450Zx 系列芯片引脚的功能定义示意图。
图 2.17.3.2-2 引脚功能定义起始页
当前只有 AO 引脚需要使用到 ADC 接口,所以 DO 引脚可以使用开发板上其他的 GPIO。这里选择使用 PC1 的附加 ADC 功能。使用 ADC0 的第 11 道输入通道。
**图 2.17.3.2-3 有****ADC****功能的引脚**######### 光照传感器 | ######### 立创·梁山派 | ######### 接线图 |
---|
2.17.3.3 移植至工程
移植步骤中的导入.c 和.h 文件与上一节相同,只是将.c 和.h 文件更改为 bsp_raindrop.c 与 bsp_raindrop.h。见 2.2.3.3 移植至工程。这里不再过多讲述。移植完成后面修改相关代码。
在文件 bsp_raindrop.c 中,编写如下代码。
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: LCKFB
* 修改日期: 2023年04月06日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#include "bsp_raindrop.h"
/******************************************************************
* 函 数 名 称:raindrop_gpio_config
* 函 数 说 明:初始化雨滴传感器引脚
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void raindrop_gpio_config(void)
{
//使能引脚时钟
rcu_periph_clock_enable(BSP_RAINDROP_GPIO_RCU_AO);
rcu_periph_clock_enable(BSP_RAINDROP_GPIO_RCU_DO);
//使能ADC时钟
rcu_periph_clock_enable(BSP_ADC_RCU);
//配置ADC时钟
adc_clock_config(ADC_ADCCK_PCLK2_DIV4);
//配置A0引脚为模拟输入模式
gpio_mode_set(BSP_RAINDROP_GPIO_PORT_AO, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, BSP_RAINDROP_GPIO_PIN_AO);
//配置D0引脚为输入模式
gpio_mode_set(BSP_RAINDROP_GPIO_PORT_DO, GPIO_MODE_INPUT, GPIO_PUPD_NONE, BSP_RAINDROP_GPIO_PIN_DO);
//配置ADC为独立模式
adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT);
//使能扫描模式
adc_special_function_config(BSP_ADC, ADC_SCAN_MODE, ENABLE);
//数据右对齐
adc_data_alignment_config(BSP_ADC, ADC_DATAALIGN_RIGHT);
//ADC0设置为12位分辨率
adc_resolution_config(BSP_ADC, ADC_RESOLUTION_12B);
//ADC0设置为规则组 一共使用 1 个通道
adc_channel_length_config(BSP_ADC,ADC_REGULAR_CHANNEL, 1);
//ADC外部触发禁用, 即只能使用软件触发
adc_external_trigger_config(BSP_ADC, ADC_REGULAR_CHANNEL, EXTERNAL_TRIGGER_DISABLE);
//ADC0使能
adc_enable(BSP_ADC);
//开启ADC自校准
adc_calibration_enable(BSP_ADC);
}
/**********************************************************
* 函 数 名 称:get_adc_value
* 函 数 功 能:读取ADC值
* 传 入 参 数:ADC_CHANNEL_x=要采集的通道
* 函 数 返 回:测量到的值
* 作 者:LC
* 备 注:无
**********************************************************/
unsigned int get_adc_value(uint8_t adc_channel_x)
{
unsigned int adc_value = 0;
//设置采集通道
adc_regular_channel_config(BSP_ADC, 0, adc_channel_x, ADC_SAMPLETIME_15);
//开始软件转换
adc_software_trigger_enable(BSP_ADC, ADC_REGULAR_CHANNEL);
//等待 ADC 采样完成
while ( adc_flag_get(BSP_ADC, ADC_FLAG_EOC) == RESET )
{
;
}
//读取采样值
adc_value = adc_regular_data_read(BSP_ADC);
//返回采样值
return adc_value;
}
/******************************************************************
* 函 数 名 称:get_raindrop_percentage_value
* 函 数 说 明:读取雨滴AO值,并且返回百分比
* 函 数 形 参:无
* 函 数 返 回:返回百分比
* 作 者:LC
* 备 注:无
******************************************************************/
unsigned int get_raindrop_percentage_value(void)
{
int adc_max = 4095;
int adc_new = 0;
int Percentage_value = 0;
adc_new = get_adc_value( BSP_RAINDROP_ADC_CHANNEL );
Percentage_value = (1-((float)adc_new/adc_max)) * 100;
return Percentage_value;
}
/******************************************************************
* 函 数 名 称:get_raindrop_do_value
* 函 数 说 明:读取雨滴DO值,返回0或者1
* 函 数 形 参:无
* 函 数 返 回:
* 作 者:LC
* 备 注:无
******************************************************************/
unsigned char get_raindrop_do_value(void)
{
return gpio_input_bit_get(BSP_RAINDROP_GPIO_PORT_DO, BSP_RAINDROP_GPIO_PIN_DO);
}
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
在文件 bsp_raindrop.h 中,编写如下代码。
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: LCKFB
* 修改日期: 2023年04月06日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#ifndef _BSP_RAINDROP_H__
#define _BSP_RAINDROP_H__
#include "gd32f4xx.h"
#define BSP_RAINDROP_GPIO_RCU_AO RCU_GPIOC
#define BSP_RAINDROP_GPIO_PORT_AO GPIOC
#define BSP_RAINDROP_GPIO_PIN_AO GPIO_PIN_1
#define BSP_RAINDROP_GPIO_RCU_DO RCU_GPIOF
#define BSP_RAINDROP_GPIO_PORT_DO GPIOF
#define BSP_RAINDROP_GPIO_PIN_DO GPIO_PIN_8
#define BSP_ADC_RCU RCU_ADC0
#define BSP_ADC ADC0
#define BSP_RAINDROP_ADC_CHANNEL ADC_CHANNEL_11
void raindrop_gpio_config(void);
unsigned int get_raindrop_percentage_value(void);
#endif
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
2.17.4 移植验证
在自己工程中的 main 主函数中,编写如下。
/********************************************************************************
* 测试硬件:立创·梁山派开发板GD32F470ZGT6 使用主频200Mhz 晶振25Mhz
* 版 本 号: V1.0
* 修改作者: LCKFB
* 修改日期: 2023年04月06日
* 功能介绍:
******************************************************************************
* 梁山派软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 其余模块移植手册:https://dri8c0qdfb.feishu.cn/docx/EGRVdxunnohkrNxItYTcrwAnnHe
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
*********************************************************************************/
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "bsp_usart.h"
#include "bsp_raindrop.h"
int main(void)
{
uint16_t value = 0;
//滴答定时器初始化 1ms
systick_config();
//串口0初始化 调试
usart_gpio_config(9600U);
//ADC接口初始化
raindrop_gpio_config();
while(1)
{
printf("raindrop = %d%%\r\n", get_raindrop_percentage_value() );
delay_1ms(500);
}
}
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
移植现象:输出检测雨滴大小程度的百分比。(当滴一些水在裸露的铜皮上时,输出高于 50%;当将水擦掉时,输出 2% 左右)
移植成功示例,见文件 2.17.4-1 。
文件 2.17.4-1 移植成功示例