光敏,红外,人体红外检测模块的模拟输出(ADC)实验——入门

前面给大家介绍了传感器的开关输出的使用,今天给大家介绍一下常见传感器的模拟输出的用法,用到了STM32的ADC(模数转换)模块和USART串口通信模块。代码就是正点原子的ADC实验的代码。今天只聊传感器,ADC与USART模块可以自行查找资料或者等我过几天更新,一定简单易懂。

先给大家介绍两个新的传感器,由上至下为声音检测模块和红外对管。声音检测可以用于检测是否有声音,并不能识别内容,常用于做声控灯。红外对管常用于做循迹小车,一个发射红外,一个接受红外,在光照强度大的情况下会失灵。DO是开关输出,本次使用模拟输出端口,DO端可以不用连接。

接线方式

VCC——单片机3.3V

GND——单片机GND

OUT/AO——单片机PA1

模块工作环境

  1. 工作电压:3.3V至5V
  2. 电平输出:0~3.3V

话不多说上代码,ADC的代码可以直接使用正点原子的,ADC模块:

#include "adc.h"
#include "delay.h"
//	 
															   
void  Adc_Init(void)
{ 	
	ADC_InitTypeDef ADC_InitStructure; 
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1	, ENABLE );	 
 

	RCC_ADCCLKConfig(RCC_PCLK2_Div6);  

	//PA1 ×÷ΪģÄâͨµÀÊäÈëÒý½Å                         
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		
	GPIO_Init(GPIOA, &GPIO_InitStructure);	

	ADC_DeInit(ADC1);  

	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	
	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_InitStructure.ADC_NbrOfChannel = 1;	
	ADC_Init(ADC1, &ADC_InitStructure);	

  
	ADC_Cmd(ADC1, ENABLE);	
	
	ADC_ResetCalibration(ADC1);	
	 
	while(ADC_GetResetCalibrationStatus(ADC1));	
	
	ADC_StartCalibration(ADC1);	
 
	while(ADC_GetCalibrationStatus(ADC1));	 
 
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		
}				  

u16 Get_Adc(u8 ch)   
{
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );	
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));

	return ADC_GetConversionValue(ADC1);	
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t

主函数的主要代码是:

while(1)
	{
	1、	adcx=Get_Adc_Average(ADC_Channel_1,10);
	
	2、	temp=(float)adcx*(3.3/4096);
	3、	adcx=temp;
 
	4、	printf("%5.3f     ",temp);
	5、	delay_ms(2500);	
	}									

1、取出ADC读取传感器输出的平均值到adcx,每十次做一次平均值,确保数值准确。

2、ADC每次取值只会取12位,所以他可以表达最大值是4096,把每次输出的值先除4096再乘以3.3就可以使得到的值范围在0~3.3,可以看做是0~3.3V。

4、此处在USART函数里用了printf函数重定义,使printf可以直接用串口输出数据到上位机。函数重定义代码如下:


int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0); 
    USART1->DR = (u8) ch;      
	return ch;
}

下图是我用四角光敏传感器做的模拟输出实验,展示一下结果:

1.给光敏电阻遮光,输出电压为1.294V

2.给光敏电阻照光,输出电压为0.436V

总结

传感器方面并不难,难的是ADC模块的使用,但是如果不看原理的话也不是很难,首先会用,用熟了之后就可以深究原理了,初步学习过程中不要给自己挖坑,先将各模块用起来。有什么新的问题可以私聊,一起学习。

你可能感兴趣的:(单片机,传感器)