STM32-雨滴传感器
生活随笔
收集整理的這篇文章主要介紹了
STM32-雨滴传感器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
0 說明:
?1 傳感器介紹
?2 代碼說明
? ?2.1 ADC初始化函數(adc.c)
? 2.2 GPIO初始化函數
2.3 主函數
0 說明:
????????本篇文章主要是說明怎么使用STM32單片機讀取雨滴傳感器采集到的數據,并且附帶著STM32所需要的全部代碼,所使用的雨滴傳感器如下圖所示。
附:使用單片機STM32f103系列
?1 傳感器介紹
????????該傳感器具有數字開關量輸出(0和1)和模擬量AO電壓輸出兩種輸出形式。? ? ?
????????接上5V電源,電源燈亮,感應板上沒有水滴時,DO輸出為高電平,開關指示燈滅;滴上一滴水,DO輸出為低電平,開關指示燈亮;刷掉上面的水滴后又恢復,輸出高電平狀態。AO模擬輸出,可以連接單片機的AD口檢測滴在上面的雨量大小。DO TTL數字輸出也可以連接單片機檢測是否有雨。
?2 代碼說明
代碼主要包括主函數(main.c)、ADC初始化函數(adc.c)、GPIO初始化函數
? ?2.1 ADC初始化函數(adc.c)
ADC的初始化都差不多,需要注意的是ADC的采集函數
這里采用ADC1通道的PA5進行采集AO的信息
#include "stm32f10x.h" //包含需要的頭文件 #include "delay.h" //包含需要的頭文件/*函數名:初始化ADC */ void Adc_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //定義一個設置GPIO的變量ADC_InitTypeDef ADC_InitStructure; //定義一個設置ADC的變量RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE ); //使能GPIOA通道時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE ); //使能ADC1通道時鐘RCC_ADCCLKConfig(RCC_PCLK2_Div6); //設置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14MGPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //準備設置PA5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模擬輸入引腳GPIO_Init(GPIOA, &GPIO_InitStructure); //設置PA5ADC_DeInit(ADC1); //復位ADC1,將外設 ADC1 的全部寄存器重設為缺省值ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在獨立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模數轉換工作在單通道模式ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模數轉換工作在單次轉換模式ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //轉換由軟件而不是外部觸發啟動ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC數據右對齊ADC_InitStructure.ADC_NbrOfChannel = 1; //順序進行規則轉換的ADC通道的數目ADC_Init(ADC1, &ADC_InitStructure); //根據ADC_InitStruct中指定的參數初始化外設ADCx的寄存器 ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 ADC_ResetCalibration(ADC1); //使能復位校準 while(ADC_GetResetCalibrationStatus(ADC1)); //等待復位校準結束 ADC_StartCalibration(ADC1); //開啟AD校準while(ADC_GetCalibrationStatus(ADC1)); //等待校準結束 }/*-------------------------------------------------*/ /*函數名:獲得ADC結果 */ /*參 數:ch: 通道數 */ /*-------------------------------------------------*/ int Get_Adc(int ch) { ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采樣時間為239.5周期 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的軟件轉換啟動功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待轉換結束return ADC_GetConversionValue(ADC1); //返回最近一次ADC1規則組的轉換結果 } /*-------------------------------------------------*/ /*函數名:平均多次ADC結果,提高精度 */ /*參 數:channel: 通道數 */ /*參 數:count: 平均次數 */ /*-------------------------------------------------*/ int Get_Adc_Average(int channel,int count) {int sum_val=0;char t;for(t=0;t<count;t++) //循環讀取times次{sum_val+=Get_Adc(channel); //計算總值Delay_Ms(5); //延時}return sum_val/count; //返回平均值 }? 2.2 GPIO初始化函數
本個例程采用的是PA0讀取DO的狀態,使用#define宏定義????????1. gpio.h
#ifndef __GPIO_H #define __GPIO_H #define gpio_readA GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) //讀取GPIOA的P0口電平(0/1)void Gpio_Init(void); //延時初始化函數 int Gpio_read(void); //讀取A0口#endif2. gpio.c
#include "stm32f10x.h" #include "delay.h" #include "gpio.h" #include "usart1.h"void Gpio_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; //定義一個設置GPIO的變量RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA端口時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; //設置PA0/1 // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉輸入,默認狀態是低電平 // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入,默認狀態是高電平 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure); //設置PA}int Gpio_read(void) {if(gpio_readC == 1){ Delay_Ms(100);return 1;}return 0; }2.3 主函數
#include "stm32f10x.h" //包含需要的頭文件 #include "main.h" //包含需要的頭文件 #include "delay.h" //包含需要的頭文件 #include "usart1.h" //包含需要的頭文件 #include "adc.h" //包含需要的頭文件 #include "gpio.h" //包含需要的頭文件int main(void) {float raindata; //接受雨滴數據Delay_Init(); //延時功能初始化 Usart1_Init(9600); //串口1功能初始化,波特率9600Gpio_Init(); // PA0,讀取數字數據Adc_Init(); //ADC初始化while(1) //主循環{ u1_printf("DO:%d\r\n",Gpio_read());if(Gpio_read()){u1_printf("沒有雨水出現!\r\n");}else{u1_printf("有雨水出現!\r\n");}raindata = (float)(Get_Adc_Average(5,20))*(3.3/4096);u1_printf("rain:%.2f\r\n",raindata);Delay_Ms(1000); //延時} }注意:
雨滴越多,電壓越小。
傳感器的輸出電壓和雨滴數量是成反比關系。即雨量越大,傳感器輸出的電壓值越低。
讀取不成功時:
靠考慮是否某些引腳已經被默認占用。(不一定)
也要考慮轉化模塊的問題。是不是有的可以調(調節靈敏度電位計)
轉化模塊壞掉了,換一個試試
總結
以上是生活随笔為你收集整理的STM32-雨滴传感器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【微信技术-微信小程序】------ 使
- 下一篇: [python-thirdLib] Py