本篇主要介绍: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的值也会发生变化
评论(0)
您还未登录,请登录后发表或查看评论