C/C++教程

STM32 cube AD 测量土壤湿度

本文主要是介绍STM32 cube AD 测量土壤湿度,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一 。说明

本来想买个温湿度模块,结果买了个湿度 - _ - !

1. 什么是AD转换

AD转换是把离散的模拟量转换为数字量的过程,其原理就是使用单片机的高频率和时钟来采样x轴的点样,根据电压的变化使用曲线函数来获取y轴数字值的过程,我们叫做AD转换

2.如何确定AD采样的位数,并知道电压值

如果单片机的的ADC为12位,那么它的最大值为4095。单片机在进行AD转换前需要先设置一个参考电压。假如把参考电压设置为5V,5V=4095,0V=0;根据这样的关系,我们就可以把模拟电压进行数字化了。比如:2V=2/5*4095=1638。

3. 什么是A0 和 D0

A0 输出为模拟量的电压值

D0 根据可调电阻设置传感器的灵敏度,当达到某个阈值时候能输出 1 或者 0 ,变化波动较大

比如:MQ135 未检测到气体时,电压值为4v , 检测到后为0.1V

VCC  连接 5V ( 可查参考手册,不同的模块要求电压不同)

GND  接地

二 。配置

1. 设置采样周期 55.5 cyles,和中断端口 IN1,该端口和A0连接

2. 开启中断 ,这里采用中断方式。也可以不使用中断,直接在main的 while 里来做一样

3. 根据配置的时钟知道AD的采样精度 ,这里我用的是12位的AD

三。湿度取值说明

在实际测试中,ad_value 随着水分的增加,而减少
在干燥的空气中,ad_value 在4020左右 -> 0
在纯水的中的值为:ad_value 在1500左右 -> 100%
根据以上的几个条件,我们可以用1次函数模拟出湿度变化的曲线,所以就可以求值了

四。代码

int main(void){
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();
    //开启中断
    HAL_ADC_Start_IT(&hadc1);
    while(1){
    }
}
 
//这是中断回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	float vol,hum;
	uint32_t adc_value;
	//获取ad value
	adc_value= HAL_ADC_GetValue(&hadc1);
	//2的12次方,所以3V = 4096
	vol = (float)adc_value*3.3/4096;
	//在实际测试中,ad_value 随着水分的增加,而减少
	//在干燥的空气中,ad_value 在4020左右 -> 0
	//在纯水的中的值为:ad_value 在1500左右 -> 100%
	//土壤湿度的范围为 0~100 %
	hum = -0.03968253968253968*adc_value+159.52380952380952;
	//限制一下上下限
	if(hum < 0 ) hum = 0;
	if(hum > 100) hum = 100;

	//再次启动ADC转换
	HAL_ADC_Start_IT(hadc);
}

四。演示效果(过程有效长细心观看)

空气中湿度为:0

水中湿度为:100 

土壤中水量的增加会从 44 ~ 53%

感谢您的支持,写的文章如对您有所帮助,开源不易,请您打赏,谢谢啦~

 

 

这篇关于STM32 cube AD 测量土壤湿度的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!