STM32-风速传感器(ADC)

目录

[0 说明](#0 说明)

[1 传感器介绍](#1 传感器介绍)

[2 代码说明](#2 代码说明)

[2.1 ADC.c](#2.1 ADC.c)

[2.2 adc.h](#2.2 adc.h)

[2.3 main.c](#2.3 main.c)


0 说明

本篇文章主要是说明怎么使用STM32单片机读取风速传感器采集到的数据,读取方式是ADC,并且附带着STM32所需要的全部代码,所使用的风速传感器如下图所示。

**附:**使用单片机STM32f103系列

1 传感器介绍

该风速传感器使用优质ABS材质、硬度高、柔韧度好、抗压、抗腐蚀、使用寿命长。传感器采用海洋军用的高精度测量风速传感器,与传统产品相比,具有更高精度;是建筑机械、铁路、港口、码头、风力发电、光伏发电、电厂、气象、索道、环境、温室、养殖等领域不可缺少的风速检测装置。用它可以实现设备风速指示数字化及自动化,是相关设备不可缺少的风速检测设备。

本风速传感器采用小型直流有刷电机与三杯式旋转风杯组装而成,其工作原理为,当环境有水平流动风时,旋转风杯能够产生旋转,并带动小型电机产生电压,其电压与旋转速度基本成正比。利用此信号电压,可以对环境风速进行测量。风速传感器输出电压信号和风速的计算公式如下:

2 代码说明

代码主要包括主函数(main.c)、ADC初始化函数(adc.c)函数

2.1 ADC.c

ADC的初始化都差不多,需要注意的是ADC的采集函数

这里采用ADC1通道的PA5进行采集信息

cpp 复制代码
// adc.c
#include "stm32f10x.h"    
#include "delay.h"	   

//初始化ADC                           									   
void Adc_Init(void)
{    
	GPIO_InitTypeDef      GPIO_InitStructure;                            
	ADC_InitTypeDef       ADC_InitStructure;                            

	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最大时间不能超过14M

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                            //准备设置PA5
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		                   //模拟输入引脚
	GPIO_Init(GPIOA, &GPIO_InitStructure);                                 //设置PA5
    	
	ADC_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));	                               //等待校准结束
}

//获得采集结果
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规则组的转换结果
}

// 多次得到采集结果并求平均值
int Get_Adc_Average(int ch,int times)
{
	int temp_val=0;
	char t;
	
	for(t=0;t<times;t++)             //循环读取times次
	{
		temp_val+=Get_Adc(ch);       //计算总值
		Delay_Ms(5);                 //延时
	}
	return temp_val/times;           //返回平均值
} 

2.2 adc.h

adc.h是根据adc.c的需要进行写的,两个对应就行

cpp 复制代码
// adc.h
#ifndef __ADC_H
#define __ADC_H	
							   
void Adc_Init(void); 				  //初始化ADC
int Get_Adc(int ch) ; 				  //获得ADC结果 
int Get_Adc_Average(int ch,int times);//平均多次ADC结果,提高精度

#endif 

2.3 main.c

主函数里面主要就是进行函数的初始化和调用

cpp 复制代码
#include "stm32f10x.h"  
#include "main.h"       
#include "delay.h"       
#include "usart1.h"     // 串口是为了调试方便,可以自己写个串口程序
#include "adc.h"       

int main(void) 
{
	int  i;                 //用于for循环
	float wind,twind;         //接收风速数据
		
	Delay_Init();           //延时功能初始化              
	Usart1_Init(9600);      //串口1功能初始化,波特率9600
	Adc_Init();             //ADC初始化
	
	while(1)                //主循环
	{		
		wind = (float)(Get_Adc_Average(5,20))*(3.3/4096);
		twind = 27*wind;
		u1_printf("twind:%.2f m/s\r\n",twind);
		Delay_Ms(1000);                                                   //延时
	}
}
相关推荐
智商偏低6 小时前
单片机之helloworld
单片机·嵌入式硬件
青牛科技-Allen7 小时前
GC3910S:一款高性能双通道直流电机驱动芯片
stm32·单片机·嵌入式硬件·机器人·医疗器械·水泵、
森焱森9 小时前
无人机三轴稳定控制(2)____根据目标俯仰角,实现俯仰稳定化控制,计算出升降舵输出
c语言·单片机·算法·架构·无人机
白鱼不小白9 小时前
stm32 USART串口协议与外设(程序)——江协教程踩坑经验分享
stm32·单片机·嵌入式硬件
S,D10 小时前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
芯岭技术13 小时前
PY32F002A单片机 低成本控制器解决方案,提供多种封装
单片机·嵌入式硬件
youmdt13 小时前
Arduino IDE ESP8266连接0.96寸SSD1306 IIC单色屏显示北京时间
单片机·嵌入式硬件
嘿·嘘14 小时前
第七章 STM32内部FLASH读写
stm32·单片机·嵌入式硬件
Meraki.Zhang14 小时前
【STM32实践篇】:I2C驱动编写
stm32·单片机·iic·驱动·i2c
几个几个n16 小时前
STM32-第二节-GPIO输入(按键,传感器)
单片机·嵌入式硬件