本篇主要介绍:stm32f103 ADC读取电压 采集土壤湿度传感器(XH-M214)数据

XH-M214简介

XH-M214的实物张这个样子:
在这里插入图片描述

那个像叉子的是传感器,测量土壤水分随土壤电导率的变化而变化(土壤电阻随干旱而增加)。在传感器的两个电极之间测量电阻。
蓝色模块是一个电压比较器和一个分压电路,其引脚定义如下:
在这里插入图片描述
一个是模拟信号输出,及测量的土壤湿度,还有一个开关信号输出,因为有个比较器嘛,当超过阈值则输出标志位。
其与原理图如下:
在这里插入图片描述
工作电压3.3v-5v,工作电流:100mA以内

优势:

  • 表面采用镀镍处理,有加宽的感应面积,可以提高导电性能,防止接触土壤容易生锈的问题,延时使用寿命
  • 宽范围控制土壤湿度,通过点位器调节控制相应阈值,湿度低于设定值时,DO输出高电平,高于设定值时DO输出低电平
  • 比较器采用LM393芯片,工作稳定

使用方法:

  • 传感器适用于土壤的湿度检测
  • 模块中的蓝色的电位器是用于土壤湿度的阈值调节,顺时针调节,控制的湿度会越大,逆时针越小
  • 数字量输出DO可以与单片机直接连接,通过单片机来检测高低电平,由此来检测土壤湿度
  • 小板模拟量输出AO可以和AD模块连接,通过AD转换,可以获得土壤湿度更精准的数值。

stm32驱动

XH-M214的接口就是一个模拟量输出,上面介绍了。所以它的软件驱动主要就是stm32的adc配置来读取模拟量。
下面来看如何配置stm32的adc接口。来实现ad值的读取

stm32f103的内置ADC有三个,可同时进行三个ADC转换。
前几个配置如下:
在这里插入图片描述
如果用ADC1的通道1则需要将外部的ad信号接到PA1引脚上,二通道则接到PA2上

void ADC1_GPIO_Config(void){
    GPIO_InitTypeDef GPIO_InitStructure;
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1, ENABLE);    //使能ADC1的时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2; //用通道1和通道2 所以1和2引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//配置速度
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;    //模拟输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA1和PA2
}

配置用的gpio口

void ADC_Config(void)
{
  ADC_InitTypeDef ADC_InitStructure;//ADC结构体变量 配置adc用的
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
  ADC_InitStructure.ADC_ScanConvMode =    DISABLE; //使能扫描
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由软件控制转换,不使用外部触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
  ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道1
  ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC1
  ADC_Cmd(ADC1, ENABLE);//使能ADC1
  ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

配置ADC

//获得ADC值
//ch:通道值0-3
u16 Get_Adc(u8 ch)   
{
      //设置指定ADC的规则组通道,1代表一个序列,ADC_SampleTime_1Cycles5 为采样时间
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_1Cycles5 );        
      // 使能指定的ADC的软件转换启动功能
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);        
     //返回AD值
     return (uint16_t) ADC1->DR;
}

获得AD的值

在main函数中调用也很简单了

void main()
{
       //配置时钟
       ....
      //配置ADC1用的gpio口
    ADC1_GPIO_Config();
    //配置ADC
    ADC_Config();  
    while(1)
    {
        int a,b;
        a = Get_Adc(1);//读取通道1的ad值
        b = Get_Adc(2);//读取通道2的ad值

    }
}

XH-M214 protues测试

由于在protues里没有XH-M214,其本质是模拟量读取,所以在protues里用滑动变阻器分压来改变ad值,输入stm32的adc接口来替换XH-M214是合理的
在这里插入图片描述
这样既可
在protues中加入lcd1602的显示代码,则可以显示读取的数据
改变滑动变阻器的位置,改变输入的ad值,lcd的值也会发生变化

在这里插入图片描述
在这里插入图片描述