目录
一、雨滴感应模块介绍:
(1)产品特点:
-
材料与尺寸:采用高品质FR-04双面材料,尺寸为5.0*4.0CM,表面镀镍处理,抗氧化、导电性好,寿命长。
-
输出信号:提供干净的比较器输出信号,波形良好,驱动能力强(超过15mA)。
-
灵敏度调节:通过电位器调节灵敏度。
-
工作电压:支持3.3V至5V的工作电压。
-
输出形式:支持数字开关量输出(0和1)和模拟量AO电压输出。
-
安装便利:设有固定螺栓孔,方便安装。
-
PCB尺寸:小板PCB尺寸为3.2cm x 1.4cm。
-
比较器:使用宽电压LM393比较器。
-
(2)功能介绍:
-
电源指示:接上3-5V电源后,电源指示灯亮。
-
数字输出(DO):在感应板上没有水滴时,DO输出为高电平,开关指示灯灭;滴上一滴水后,DO输出为低电平,开关指示灯亮;刷掉水滴后,输出恢复为高电平状态。
-
模拟输出(AO):AO模拟输出可以连接单片机的AD口,用于检测滴在上面的雨量大小。
-
数字输出应用:DO TTL数字输出也可以连接单片机,用于检测是否有雨。
(3)接线方式:
-
VCC:接电源正极(3-5V)。
-
GND:接电源负极。
-
DO:TTL开关信号输出。
-
AO:模拟信号输出。
二、AO与DO介绍:
AO(模拟信号输出)和DO(数字信号输出)是传感器或电子设备中常见的两种输出类型。
(1)AO(模拟信号输出):
-
性质:模拟信号是连续变化的信号,其值可以在一定范围内取任意值。例如,电压可以在0V到5V之间连续变化。
-
应用:模拟信号常用于需要精确测量物理量变化的应用,如温度、压力、光强等。它能够提供更细腻的测量结果,适合于需要连续变化数据的场景。
-
处理:模拟信号通常需要通过模数转换器(ADC)转换为数字信号,才能被数字系统(如微控制器、计算机等)处理。
-
优点:能够提供较高的测量精度和分辨率。
-
缺点:容易受到噪声干扰,传输距离有限,抗干扰能力相对较弱。
(2)DO(数字信号输出):
-
性质:数字信号是不连续的信号,其值只有两种状态,通常表示为高电平和低电平。例如,高电平可能表示为5V,低电平表示为0V。
-
应用:数字信号常用于需要进行开关控制或状态检测的应用,如检测水滴、按钮按下等。它适用于需要明确状态指示或控制信号的场景。
-
处理:数字信号可以直接被数字系统处理,无需转换。
-
优点:抗干扰能力强,传输距离远,信号稳定可靠。
-
缺点:相比模拟信号,可能无法提供连续的测量数据,精度和分辨率可能较低。
(3)总结:
AO(模拟信号输出)提供连续变化的信号,适用于需要精细测量和连续数据的场景,但容易受到噪声干扰;DO(数字信号输出)则提供离散的高或低电平信号,适用于开关控制和状态检测,具有更强的抗干扰能力。选择AO或DO取决于应用需求:模拟信号适合精确测量,数字信号适合状态指示和控制。
三、ADC:
(1)STM32 ADC介绍:
- STM32的ADC为12位ADC,是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。
- 模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
- ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
(2)ADC主要特征:
- STM32的ADC模块是一个12位分辨率的模数转换器,具备多种功能,包括在转换结束或发生模拟看门狗事件时产生中断、支持单次和连续转换模式、自动扫描模式、自校准、数据对齐、可编程采样间隔、外部触发选项、间断模式和双重模式。它还支持DMA请求以提高数据传输效率。STM32不同系列的ADC转换时间有所不同,供电要求为2.4V到3.6V,输入范围由VREF-和VREF+决定(VREF- ≤ VIN ≤ VREF+)。此外,如果存在VREF-引脚,需要将其与VSSA相连。
- ADC3的规则转换和注入转换触发与ADC1和ADC2的不同。
- TIM8_CH4和TIM8_TRGO及它们的重映射位只存在于大容量产品中。
四、代码编写:
(1)初始化ADC:
注意:ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。
// 初始化ADC,采用ADC单通道转换
void ADCSingle_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // 使能ADC1和GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // ADC通常位于APB2总线上
RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 配置ADC时钟,选择PCLK2的6分频,即ADCCLK = 72MHz / 6 = 12MHz
GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 设置GPIO模式为模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 设置引脚为PA0
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA的PA0引脚
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // 配置ADC的规则通道,选择通道0,采样时间为55.5周期
// ADC初始化
ADC_InitTypeDef ADC_InitStructure; // 定义ADC初始化结构体
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 设置ADC工作模式为独立模式
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 设置数据对齐方式为右对齐
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 设置外部触发转换为无触发
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 设置为不连续转换模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 设置为不扫描模式
ADC_InitStructure.ADC_NbrOfChannel = 1; // 设置通道数目为1
ADC_Init(ADC1, &ADC_InitStructure); // 初始化ADC1
// ADC使能
ADC_Cmd(ADC1, ENABLE); // 使能ADC1
// ADC校准,内部电路自动执行校准
ADC_ResetCalibration(ADC1); // 重置ADC校准寄存器
while (ADC_GetResetCalibrationStatus(ADC1) == SET); // 等待校准重置完成
ADC_StartCalibration(ADC1); // 开始校准
while (ADC_GetCalibrationStatus(ADC1) == SET); // 等待校准完成
}
-
时钟配置:
-
使能ADC1和GPIOA接口的时钟。
-
配置ADC时钟为PCLK2的6分频,得到12MHz的ADCCLK。
-
-
GPIO配置:
-
设置GPIOA的PA0引脚为模拟输入模式(
GPIO_Mode_AIN
)。 -
设置GPIO引脚速度为50MHz(
GPIO_Speed_50MHz
)。
-
-
ADC通道配置:
-
配置ADC1的规则通道,选择通道0(对应PA0引脚)。
-
设置采样时间为55.5个周期(
ADC_SampleTime_55Cycles5
)。
-
-
ADC初始化配置:
-
设置ADC工作模式为独立模式(
ADC_Mode_Independent
)。 -
设置数据对齐方式为右对齐(
ADC_DataAlign_Right
)。 -
设置外部触发转换为无触发(
ADC_ExternalTrigConv_None
)。 -
设置为不连续转换模式(
ADC_ContinuousConvMode = DISABLE
)。 -
设置为不扫描模式(
ADC_ScanConvMode = DISABLE
)。 -
设置通道数目为1(
ADC_NbrOfChannel = 1
)。
-
-
ADC使能:
-
使能ADC1模块。
-
-
ADC校准:
-
重置ADC校准寄存器。
-
等待校准重置完成。
-
开始ADC校准。
-
等待校准完成。
-
(2)ADC值获取:
启动STM32的ADC1模块进行一次软件触发的模拟到数字转换,并等待转换结束,最后返回转换得到的数值结果。这个数值是一个16位的数字,代表了对应模拟输入信号的数字量。
// 获取ADC转换的值
uint16_t ADCSingle_GetValue(void)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 启动ADC1的软件转换
while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 等待转换结束
return ADC_GetConversionValue(ADC1); // 返回转换结果
}
(3)转换到0-100范围:
通过ADC获取的12位原始值(范围0-4095)转换为0-100的百分比形式,以便于表示和使用。
//将ADC获取的值转换到0-100。
float Scope_convert(void)
{
uint16_t ADC;
float Scope;
ADC = ADCSingle_GetValue(); // 调用前面定义的函数,获取ADC转换的原始值,该值是12位的,范围0-4095
Scope = 100-((float)ADC/4095)*100; // 将ADC值转换为0-100的范围
return Scope; // 返回转换后的Scope值
}
五、效果演示:
(1)主函数:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "drop.h"
uint16_t value1=0;
float value2;
int main(void)
{
//OLED初始化
OLED_Init();
//初始化ADC单通道转换
ADCSingle_Init();
while (1)
{
value1=ADCSingle_GetValue();
value2=Scope_convert();
OLED_ShowString(0, 0, "water level:", OLED_8X16);
OLED_ShowFloatNum(0, 16, value2, 3, 1, OLED_8X16); // 显示百分比,保留两位小数
OLED_ShowString(48, 16, "%", OLED_8X16);
OLED_ShowString(0, 32, "ADC:", OLED_8X16);
OLED_ShowNum(0, 48, value1, 4, OLED_8X16);
OLED_Update();
}
}
(2)效果:
雨滴感应(水位显示)模块测量水位
六、代码下载:
通过网盘分享的文件:34-雨滴感应(水位显示)模块测量水位
链接: https://pan.baidu.com/s/1pjY1QKGxQP91w8Vpb_ih3A?pwd=dm2u 提取码: dm2u