概述
目录
一、湿度传感器的了解
二、初始化程序的了解
三、测量值的编写和解析
四、单片机通信收发配置
五、总结
一、湿度传感器的了解
从今天开始,我们开始简单的记录学习传感器的历程,因为是刚刚接触,所以我选择了一个比较简单的传感器——湿度传感器,由此来了解传感器的内在原理和控制方式。
首先是传感器内部端口的初始化,我们知道在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。
五、总结
以上就是这个传感器的代码以及单片机的配合程序,虽然代码和程序略显简单和粗暴。但是其内在的原理和使用方法,却值得我们认真的思考与研究。 当真正的掌握了这个研究方法和思路之后,再研究其他的传感器也就如鱼得水,更加方便快捷了。
最后
以上就是务实小懒猪为你收集整理的传感器学习之路(一)湿度传感器的了解与学习,以及单片机的配合代码分析的全部内容,希望文章能够帮你解决传感器学习之路(一)湿度传感器的了解与学习,以及单片机的配合代码分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复