STM32F103的光照、烟雾MQ2、有毒气体MQ135的ADC配置(寄存器版与库函数版

//#include "adc.h"#if 0  //寄存器编程
/*******************************************************
*函数名:void ADC1_Init(void)
*功  能:ADC1初始化
*参  数:无
*返  回:无
*备  注:
传感器         引脚    ADC1通道号光照          PA3     通道3 MQ2烟雾       PA2     通道2MQ135有害     PA1     通道1
********************************************************/
void ADC1_Init(void)
{/* 1.时钟配置 */RCC->APB2ENR |=1<<2;  //开启PA口的时钟RCC->APB2ENR |=1<<9;  //开启ADC1的时钟RCC->CFGR &=~(3<<14); //清零RCC->CFGR |= (2<<14); //ADC时钟设置为6分频 72/6=12M .ADC时钟不能大于14MRCC->APB2RSTR  |=  1<<9;  //开启复位ADC1的接口RCC->APB2RSTR  &=~(1<<9); //关闭ADC1复位/* 2.GPIO配置 */GPIOA->CRL &= 0xffff000f; //PA1、PA2、PA3设置为模拟输入/* 3.ADC配置 */ADC1->CR1 &= ~(1<<23);  //禁用规则通道的模拟看门狗  ADC1->CR1 &= ~(1<<22);  //禁用注入通道的模拟看门狗 ADC1->CR1 &= ~(0XF<<16);//独立模式ADC1->CR1 &= ~(0X7<<13);//选1个通道ADC1->CR1 &= ~(1<<8);   //不用扫描模式ADC1->CR1 &= ~(1<<5);   //不使用ADC的任何中断 ADC1->CR2 |= 1<<20;      //规则通道启用外部触发事件 ADC1->CR2 |= 7<<17;        //规则通道启用软件触发 ADC1->CR2 &=~(1<<15);  //不启用注入通道ADC1->CR2 &=~(1<<11);  //得到的AD值采用右对齐方式 ADC1->CR2 &=~(1<<8);   //不启用DMAADC1->SMPR2 &=~(7<<3);  //设置通道1的采样时间。ADC1->SMPR2 |= (7<<3);  //采样周期设置为239.5个周期 +12.5ADC1->SQR1 &= ~(0XF<<20); //设置为只有一个转换ADC1->SQR1 |=  ( 0 <<20);ADC1->CR2 |= 1<<0; //ADC从掉电模式,变为上电模式ADC1->CR2 |= 1<<3; // 初始化校准寄存器while (ADC1->CR2 & (1<<3)); //等待校准寄存器初始化完成ADC1->CR2 |= 1<<2; //开始校准        while (ADC1->CR2 & (1<<2)); //等待校准完成
}/*******************************************************
*函数名:u16 ADC1_Get(u8 ch)
*功  能:按通道号获取AD值
*参  数:通道号
*返  回:AD值
*备  注:
传感器        引脚    ADC1通道号
光照          PA3     通道3
MQ2烟雾       PA2     通道2
MQ135有害     PA1     通道1
********************************************************/
u16 ADC1_ReadData(u8 ch)
{   ADC1->SQR3 &= ~(0X1F<<0); //设置通道3为第一个转换ADC1->SQR3 |= ch; // 通道号ADC1->CR2|= 1<<22;  //开启规则转换通道,这时才开始转换               while (!(ADC1->SR & (1<<1))); //等待AD转换完成return ADC1->DR; //返回AD值.
}  #else  //库函数编程/*******************************************************
*函数名:void ADC1_Init(void)
*功  能:ADC1初始化
*参  数:无
*返  回:无
*备  注:
传感器         引脚    ADC1通道号光照          PA3     通道3 MQ2烟雾       PA2     通道2MQ135有害     PA1     通道1
********************************************************/
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); //ADC1时钟6分频(小于等于14MHz)/* 2.GPIO配置 */  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN; // 模拟输入                  GPIO_Init(GPIOA, &GPIO_InitStructure);                           /* 3.ADC配置 */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数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1;   //每次转换通道数目ADC_Init(ADC1,&ADC_InitStructure); //初始化ADC1ADC_Cmd(ADC1,ENABLE); //使能ADCADC_ResetCalibration(ADC1);  //使能复位校准while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束ADC_StartCalibration(ADC1);    //开启AD校准while(ADC_GetCalibrationStatus(ADC1));//等待校准结束//ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}/*******************************************************
*函数名:u16 ADC1_Get(u8 ch)
*功  能:按通道号获取AD值
*参  数:通道号
*返  回:AD值
*备  注:
传感器        引脚    ADC1通道号
光照          PA3     通道3
MQ2烟雾       PA2     通道2
MQ135有害     PA1     通道1
********************************************************/
u16 ADC1_ReadData(u8 ch)
{   ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_1Cycles5);            ADC_SoftwareStartConvCmd(ADC1,ENABLE);  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));return ADC_GetConversionValue(ADC1);
}  #endif//中值平均滤波
#define N 10 //采样个数u16 ADC1_ReadAvgData(u8 ch)
{u16 sum=0;u16 ADC1_ValueBuf[N];for(u8 i=0;i<N;i++){ADC1_ValueBuf[i] = ADC1_ReadData(ch);}//从小到大排列(冒泡法)for(u8 j=0;j<N-1;j++) // 趟数 {for(u8 i=0;i<N-1-j;i++) // 一趟比较的次数 {if(ADC1_ValueBuf[i]>ADC1_ValueBuf[i+1]) // 把最大值往后放 {//交换 u16 temp;temp = ADC1_ValueBuf[i];ADC1_ValueBuf[i] = ADC1_ValueBuf[i+1];ADC1_ValueBuf[i+1] = temp;}}}for(u8 i=2;i<N-2;i++) // 去掉最低两位与最高两位{sum+=ADC1_ValueBuf[i];}return sum/(N-4); // 求平均值
}u16 Light_Data(void)//光照
{u16 ad;ad=ADC1_ReadAvgData(3);        ad=(4095-ad)*1000/4095;return ad;
}u16 MQ2_Data(void)//烟雾
{u16 ad;ad=ADC1_ReadAvgData(2);        ad=ad*100/4095;return ad;
}u16 MQ135_Data(void)//有害气体
{u16 ad;ad=ADC1_ReadAvgData(1);        ad=ad*100/4095;return ad;
}

## STM32F103的光照、烟雾MQ2、有毒气体MQ135的ADC配置(寄存器版与库函数版相关推荐

  1. stm32f103 GPIO—— 一灯大师之库函数版

    在使用库函数之前,我们先来看GPIO寄存器的结构体 该结构体中的成员,包含了引脚,输出速度,输出模式.我们可以使用这个结构体来对I/O口进行配置. GPIO_InitTypeDef GPIO_Init ...

  2. stm32f103 GPIO——一灯大师之I/O口输出模式的寄存器配置

    在讲述寄存器配置之前,我们先来看看二进制中,在不改变其他位的条件下,对某个位的置1和清零. 先看口诀: 清零用&            (对某一位,进行"与"操作.与0相与 ...

  3. STM32F103五分钟入门系列(十三)独立看门狗IWDG

    参考:STM32F103五分钟入门系列(十三)独立看门狗IWDG 作者:自信且爱笑' 发布时间:2021-07-31 19:50:28 网址:https://blog.csdn.net/Curnane ...

  4. 正点原子STM32(基于HAL库)4

    目录 ADC 实验 ADC 简介 单通道ADC 采集实验 ADC 寄存器 硬件设计 程序设计 下载验证 单通道ADC 采集(DMA 读取)实验 ADC & DMA 寄存器 硬件设计 程序设计 ...

  5. 小白学STM32——跑马灯库函数版本

    一.STM32 GPIO 1. GPIO_MODE_AIN 模拟输入 输入信号不经施密特触发器直接接入,输入信号为模拟量而非数字量,其余输入方式输入数字量. 2. GPIO_MODE_IN_FLOAT ...

  6. MQ2烟雾传感器模块——stm32f103

    MQ2烟雾传感器的使用 ADC的使用 电压与浓度的转换 定时器的使用 ADC的使用 利用mq2传感器对气体进行检测,无非就是利用传感器内部的电路以及材料在不同气体环境下有着不同的电阻值,通过对电阻电压 ...

  7. 基于MQ-135传感器和Arduino开发板的烟雾探测器

    在本篇文章中,我们主要介绍如何使用MQ-135传感器和Arduino开发板制作一款烟雾探测器,用于测量环境中的烟雾等级.只需将MQ-135气体传感器模块与Arduino和1602 LCD模块连接即可显 ...

  8. STM32F103单片机温湿度等监测Android手机蓝牙APP显示控制设计

    这次给大家介绍的是一个温湿度,光照烟雾等监测设计,包含开关灯.基于STM32F103单片机(正点原子mini板).蓝牙模块.Android APP完成.软件是Android studio 2021.1 ...

  9. 85、基于STM32单片机烟雾温度报警器设计火灾防火检测可燃气体监测系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.程序源码 六.资料包括 摘要 本设计采用使用STM32F103作为控制器件,MQ-2型 ...

最新文章

  1. JavScript中的循环
  2. CodeForces 768E Game of Stones 打表找规律
  3. 太智能了!国内首批自动驾驶出租车即将在长沙上路!
  4. Linux常用系统备份、恢复命令
  5. MySQL 高级 - 存储过程 - 语法 - loop循环
  6. android盒子改造,废旧手机改造成电视盒子详细教程
  7. 第二冲刺阶段个人博客7
  8. IOS中的懒加载lazyLoad
  9. VScode PowerShell运行脚本报错禁止运行脚本解决方式图文
  10. 爬虫必备技能!开发者工具技巧总结
  11. 2013驾考科目三考试难点解析
  12. 计算机视觉-SIFT
  13. C/C++[codeup 2063]日期累加
  14. Python之基础语法
  15. unity3d模型制作规范
  16. 2018:视频标准混战的元年序幕
  17. win10下安装Ubuntu16.04双系统 (gtx1050ti)(联想legion)
  18. 在厉害的圈子里耳濡目染 No.110
  19. 8脚 tja1050t_CAN总线通信硬件原理图(采用TJA1050T CAN总线驱
  20. 微信支付普通商户模式实现分账操作

热门文章

  1. linux中一切皆文件, 一切文件皆二进制
  2. 锐捷客户端下虚拟机VMware无法联网的问题
  3. DPDK发包处理流程
  4. 海量数据处理 大量数据中找出最大的前10个数 (Top K 问题)
  5. flac格式怎么转换mp3?
  6. Win2008 R2 X64 提示“please wait for the System Event Notification servicequot;
  7. 思科JABBER显示头像配置文件
  8. 天赋和努力,谁都有追逐梦想的权利!
  9. linux mysql下载安装步骤(方便下次安装)
  10. 微信小程序下拉刷新不执行 enablePullDownRefresh