传感器学习之路(一)湿度传感器的了解与学习,以及单片机的配合代码分析

目录

 一、湿度传感器的了解

二、初始化程序的了解

三、测量值的编写和解析

四、单片机通信收发配置

五、总结


 一、湿度传感器的了解

从今天开始,我们开始简单的记录学习传感器的历程,因为是刚刚接触,所以我选择了一个比较简单的传感器——湿度传感器,由此来了解传感器的内在原理和控制方式。

首先是传感器内部端口的初始化,我们知道在C语言里面数组是需要初始化的,变量也是需要初始化的,那么由此可推得 ,像传感器这类电子元器件在使用之前也是需要初始化的, 所以我们第1步先了解它的初始化程序。  

二、初始化程序的了解

void  initHumiditySensor()

{

ADC_InitTypeDef  ADC_InitStructure;

GPIO_InitTypeDef  GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

GPIO_InitStructure.GPIO_Pin= GPIO_Pin_0;

GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AIN;

GPIO_Init(GPIOA, &GPIO_InitStructure);

ADC_InitStructure.ADC_ContinuousConvMode= ENABLE;

ADC_InitStructure.ADC_Mode= ADC_Mode_Independent;

ADC_InitStructure.ADC_DataAlign= ADC_DataAlign_Right;

ADC_InitStructure.ADC_ExternalTrigConv= ADC_ExternalTrigConv_None;

ADC_InitStructure.ADC_NbrOfChannel=1;

ADC_InitStructure.ADC_ScanConvMode= DISABLE;

ADC_Init(ADC1,&ADC_InitStructure);

RCC_ADCCLKConfig(RCC_PCLK2_Div8);

ADC_RegularChannelConfig(ADC1, ADC_Channel_0,1,

ADC_SampleTime_55Cycles5);

ADC_Cmd(ADC1, ENABLE);

ADC_ResetCalibration(ADC1);

while(ADC_GetResetCalibrationStatus(ADC1))

{}

ADC_StartCalibration(ADC1);

while(ADC_GetCalibrationStatus(ADC1))

{}

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

}

这是一个参考程序,要善假于物也!

这里使用了STM32的ADC1来采集湿度传感器的模拟信号。

首先这是IO口PA0在AIN模式,然后配置ADC。

需要确保里面的ADC_ContinuousConvMode= ENABLE,使之连续转换。

 

三、测量值的编写和解析

 

比例系数,将ADC测量值转换为 0~100的百分比

float f = 100.0f/(4096*3/3.3f); 

读取湿度信息,返回的数值为0~100,分辨度为0.1

float readHumidity(){ 

  return ((int)((ADC1->DR)*f*10))*0.1f;

}

函数直接返回湿度的百分比。

首先说一下“ f ”的意义,f 是为了将ADC采集的数值转化为实际的湿度值。 STM32的ADC最多只支持12位的AD转换,也就是说只能用0~4095这些数来表示输入的模拟量。

简单来说就是 0对应0V,4096对应3.3V。而湿度计的模拟信号则定义为0~3V对应0~100。通过上述的式子可以得到一个比例值 f 将0~4095的数值转化为湿度百分比。

由于配置的ADC是持续转换的,因此直接读取ADC的DR寄存器就能获得模拟量的大小。

 

四、单片机通信收发配置

 

首先在valuepack.h中定义要收发哪些变量,由于本次我们是要发送一个float类型的变量,所以配置如下:

// 根据实际需要的变量,定义数据包中 bool byte short int float 五种类型的数目 

#define TX_BOOL_NUM 0 

#define TX_BYTE_NUM 0 

#define TX_SHORT_NUM 0 

#define TX_INT_NUM 0 

#define TX_FLOAT_NUM 1

配置好之后,编译器会自动为你生成一个带有float [1]数组的TxPack。

然后在main.c中使用这个TxPack

TxPack txpack; 

int main(void){ 

initHumiditySensor();

initValuePack(115200); 

while(1){ 

// 延时 

for(int t=0;t<7200000;t++) { }

txpack.floats[0] = readHumidity(); 

sendValuePack(&txpack); 

}

}

以上是所有主函数的代码,先初始化,然后进入主循环,延时一段时间后,读取湿度并将湿度传给txpack的floats[0],然后发送。之所以将延时定这么高,是因为这款湿度传感器的数据更新频率太低。很巧的是7200000此for循环实际和1秒时间相差不大,而STM32F103时钟是72000000Hz。

五、总结

以上就是这个传感器的代码以及单片机的配合程序,虽然代码和程序略显简单和粗暴。但是其内在的原理和使用方法,却值得我们认真的思考与研究。  当真正的掌握了这个研究方法和思路之后,再研究其他的传感器也就如鱼得水,更加方便快捷了。 



 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值