光敏,红外,人体红外检测模块的模拟输出(ADC)实验——入门
Posted stmplayer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了光敏,红外,人体红外检测模块的模拟输出(ADC)实验——入门相关的知识,希望对你有一定的参考价值。
前面给大家介绍了传感器的开关输出的使用,今天给大家介绍一下常见传感器的模拟输出的用法,用到了STM32的ADC(模数转换)模块和USART串口通信模块。代码就是正点原子的ADC实验的代码。今天只聊传感器,ADC与USART模块可以自行查找资料或者等我过几天更新,一定简单易懂。
先给大家介绍两个新的传感器,由上至下为声音检测模块和红外对管。声音检测可以用于检测是否有声音,并不能识别内容,常用于做声控灯。红外对管常用于做循迹小车,一个发射红外,一个接受红外,在光照强度大的情况下会失灵。DO是开关输出,本次使用模拟输出端口,DO端可以不用连接。
接线方式
VCC——单片机3.3V
GND——单片机GND
OUT/AO——单片机PA1
模块工作环境
- 工作电压:3.3V至5V
- 电平输出: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<times;t++)
{
temp_val+=Get_Adc(ch);
delay_ms(5);
}
return temp_val/times;
}
主函数的主要代码是:
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模块的使用,但是如果不看原理的话也不是很难,首先会用,用熟了之后就可以深究原理了,初步学习过程中不要给自己挖坑,先将各模块用起来。有什么新的问题可以私聊,一起学习。
以上是关于光敏,红外,人体红外检测模块的模拟输出(ADC)实验——入门的主要内容,如果未能解决你的问题,请参考以下文章