目录
一、土壤湿度检测模块模块介绍:
(1)产品特点:
-
优质材料:采用镀镍处理的优质土壤传感器,感应面积加宽,提高导电性能,防止生锈,延长使用寿命。
-
宽范围控制:可调节土壤湿度的阈值,通过电位器控制。湿度低于设定值时,DO输出高电平;高于设定值时,DO输出低电平。
-
稳定工作:使用LM393比较器芯片,工作稳定。
-
宽电压范围:工作电压为3.3V-5V。
-
安装方便:设有固定螺栓孔。
-
尺寸:PCB尺寸为3.2cm x 1.4cm。
-
(2)模块使用说明:
-
适用场景:适用于土壤湿度检测。
-
阈值调节:模块中的蓝色电位器用于调节土壤湿度的阈值。顺时针调节阈值增大,逆时针调节阈值减小。
-
数字量输出:DO引脚可与单片机直接相连,通过检测高低电平来检测土壤湿度。
-
模拟量输出:AO引脚可与AD模块相连,通过AD转换获得更精确的土壤湿度数值。
(3)接线说明(4线制):
-
VCC:外接3.3V-5V电源。
-
GND:外接地。
-
DO:数字量输出接口,输出0或1。
-
AO:模拟量输出接口,输出电压信号。
(4) 原理图:
二、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 "soil.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)效果:
六、代码下载:
通过网盘分享的文件:35-土壤湿度检测模块检测土壤湿度
链接: https://pan.baidu.com/s/1YvB2jBY37qPBQCNTZdT2iw?pwd=9duq 提取码: 9duq
评论记录:
回复评论: