前言
这部分主要介绍系统的采集端组成,这里有用到几种传感器,DHT11温湿度传感器,MQ系列气体采集传感器,光敏电阻(用来测量光照强度的),主要用来监测家庭居住环境的相关环境参数。
一、ADC转换
1.介绍
-
AD转换是把离散的模拟量转换为数字量的过程,其原理就是使用单片机的高频率和时钟来采样x轴的点样,根据电压的变化使用曲线函数来获取y轴数字值的过程,我们叫做AD转换。
-
ADC模块读到的数据是12位的数据,STM32读到的ADC值,是从0到4095(111111111111)。当把ADC引脚接了GND,读到的就是0;当把ADC引脚接了VCC,读到的就是4095。单片机在进行AD转换前需要先设置一个参考电压。假如把参考电压设置为5V,5V=4095,0V=0;根据这样的关系,就可以把模拟电压进行数字化了。比如:2V=2/5*4095=1638
-
STM32将 ADC 的转换分为 2 个通道组:规则通道组和注入通道组。规则通道相当于你正常运行的程序,而注入通道呢,就相当于中断。在你程序正常执行的时候,中断是可以打断你的执行的。同这个类似,注入通道的转换可以打断规则通道的转换, 在注入通道被转换完成之后,规则通道才得以继续转换。
下面是ADC通道所使用的引脚:
2.实现
用ADC1的通道采集外部电压值
- 开启PA口时钟和ADC1时钟,设置PA1为模拟输入。调用函数:GPIO_Init();APB2PeriphClockCmd();
- 复位ADC1,同时设置ADC1分频因子。调用函数:ADC_DeInit(ADC1);RCC_ADCCLKConfig(RCC_PCLK2_Div6);
- 初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息。调用函数:void ADC_Init();
- 使能ADC并校准。调用函数:ADC_Cmd();
- 配置规则通道参数。调用函数:ADC_RegularChannelConfig();
- 开启软件转换:ADC_SoftwareStartConvCmd(ADC1);
- 等待转换完成,读取ADC值。调用函数:ADC_GetConversionValue(ADC1)。
/**************************************************************************
函数名: ADC1_Init(void)
函数功能:ADC初始化函数
入口参数:无
返回 值:无
**************************************************************************/
//初始化ADC
void ADC1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
/* 1.时钟配置 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启PA口的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//开启ADC1的时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); 配置ADC时钟为PCLK2的分频因子6,72M/6=12,ADC最大时间不能超过14M
/* 2.GPIO配置 */ //用作ADC采集的IO必须没有复用,否则采集电压会有影响
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 3.ADC配置 */
// ADC_DeInit(ADC1); //复位ADC1 //将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 只使用一个ADC,属于独立模式
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; // 转换通道1个
ADC_Init(ADC1,&ADC_InitStructure); //初始化ADC1
//ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
ADC_Cmd(ADC1,ENABLE); // 开启ADC1 ,并开始转换