IGKBoard(imx6ull)-ADC编程MQ-2烟雾传感器采样
文章目录
- 1- ADC介绍
- 2- MQ-2烟雾传感器介绍
- (1)工作原理
- (2)MQ-2应用电路
- 3- MQ-2烟雾传感器硬件连接
- 4- ADC驱动配置
- 5- 编程查看当前浓度
1- ADC介绍
ADC是Analog-to-Digital Converter的缩写,指模数转换器。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式,模数转换器可以实现这个功能。ADC就是数模转换,将模拟量转换为数字量。
总之,只要是需要模拟信号转为数字信号的场合,那么肯定要用到ADC。很多数字传感器内部会集成 ADC,传感器内部使用 ADC来处理原始的模拟信号,最终给用户输出数字信号。
学习ADC需要注意注意几个参数:
- 分辨率:采集精准度的重要因素。就是尺子上的能量出来的最小测量刻度,例如我们常用的厘米尺它的最小刻度就是1毫米,表示最小测量精度就是1毫米。假如 ADC的测量范围为 0-5V,分辨率设置为12位,那么我们能测出来的最小电压就是 5V除以 2的 12次方,也就是5/4096=0.00122V。很明显,分辨率越高,采集到的信号越精确,所以分辨率是衡量 ADC的一个重要指标。
- 精度:是影响结果准确度的因素之一。经过计算我们 ADC在 12位分辨率下的最小测量值是 0.00122V,但是我们ADC的精度最高只能到11位也就是 0.00244V。也就是 ADC测量出0.00244V的结果是要比0.00122V要可靠,也更准确。
- 采样时间:当 ADC在某时刻采集外部电压信号的时候,此时外部的信号应该保持不变,但实际上外部的信号是不停变化的。所以在 ADC内部有一个保持电路,保持某一时刻的外部信号,这样 ADC就可以稳定采集了,保持这个信号的时间就是采样时间。
- 采样率:也就是在一秒的时间内采集多少次。很明显,采样率越高越好,当采样率不够的时候可能会丢失部分信息,所以 ADC采样率是衡量 ADC性能的另一个重要指标。
2- MQ-2烟雾传感器介绍
(1)工作原理
MQ-2烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。
处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。
(2)MQ-2应用电路
MQ-2常用的电路有两种,一种使用采用比较器电路监控,另一种为ADC电路检测。
以下图中的模块仅有比较器电路,ADC部分使用IGKBoard的主控集成的ADC进行检测,下文进行详细介绍和使用。
MQ-2的引脚4输出随烟雾浓度变化的直流信号,被加到比较器U1A的2脚,Rp构成比较器的门槛电压。当烟雾浓度较高输出电压高于门槛电压时,比较器输出低电平(0v),此时LED亮报警;当浓度降低传感器的输出电压低于门槛电压时,比较器翻转输出高电平(Vcc),LED熄灭。调节Rp,可以调节比较器的门槛电压,从而调节报警输出的灵敏度。
R1串入传感器的加热回路,可以保护加热丝免受冷上电时的冲击。
3- MQ-2烟雾传感器硬件连接
- GND:该引脚要连到开发板的GND扩展引脚上
- VCC:该引脚要连到开发板的 5v 供电引脚上
- AOUT:是MQ-2模块的模拟输出引脚,该引脚应该连开发板上ADC功能的GPIO引脚上
在IGKBoard开发板上,提供了两个ADC模拟输入的引脚,位于开发板的8pin扩展口上,其管脚名为TS_XP和TS_YN,在Linux系统启动时如果启用了ADC overlay后,它俩会默认作为ADC模拟输入口使用。这样,MQ-2的AO引脚应该连接上其中之一即可。
4- ADC驱动配置
如果想作为MQ-2的模拟信号采样引脚使用的话,我们需要修改开发板上的DTOverlay配置文件,添加该引脚的 ADC 支持,然后关机重启系统就可以了。
root@igkboard:~# vi /run/media/mmcblk1p1/config.txt
# Enable extra overlays
dtoverlay_extra=adc
然后在/sys/bus/iio/devices目录下可以查看到ADC对应的iio设备:iio:device0
root@igkboard:/sys/bus/iio/devices# ls
iio:device0
root@igkboard:/sys/bus/iio/devices/iio:device0# ls
buffer in_voltage1_raw in_voltage_scale scan_elements
buffer0 in_voltage2_raw name subsystem
dev in_voltage3_raw of_node trigger
in_conversion_mode in_voltage4_raw power uevent
in_voltage0_raw in_voltage_sampling_frequency sampling_frequency_available
进入设备我们可以看见很多文件,但是我们只关心三个文件:
- in_voltage1_ra :ADC1通道 1原始值文件,即**TS_YN(GPIO01_IO01)**管脚的输入模拟值转换的数字值,范围0-4095;
- in_voltage4_raw :ADC1通道 4原始值文件,即**TS_XP(GPIO01_IO04)**管脚的输入模拟值转换的数字值,范围0-4095;
- in_voltage_scale: ADC1比例文件 (分辨率 ),单位为 mV。实际电压值 (mV) = in_voltage1_raw * in_voltage_scale。
root@igkboard:/sys/bus/iio/devices/iio:device0# cat in_voltage1_raw
1448
root@igkboard:/sys/bus/iio/devices/iio:device0# cat in_voltage_scale
0.805664062
当前TS_YN管脚上的实际电压是 1448 * 0.805664062 ≈ 1,166.6 mV,即1.1666V
MQ-2的浓度值也就可以计算出为 1448/4095 * 100% = 35.4%
5- 编程查看当前浓度
还是来说一下流程:
- 第一步肯定要打开我们文件的路径读取文件,因为是两个文件,直接用一个指针数组;
- 因为要每时每刻都需要读取数据,所以需要在一个while(1)循环中进行;
- 打开文件读取数据我们可以创建一个自定义函数,传进文件路径以及buf保存我们读取的数据;
- 当然我们需要将我们读取的字符串数据进行类型转换;
- 然后公式计算输出。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>/*我们要访问的文件路径*/
static char *file_path[] =
{"/sys/bus/iio/devices/iio:device0/in_voltage_scale", "/sys/bus/iio/devices/iio:device0/in_voltage1_raw",
};static int file_data_read(char *filename, char *buf, size_t buf_size)
{int ret = 0;//打开文件之后的标注值,小于0说明文件打开了需要关闭int fd = -1;//文件描述符if(!filename || !buf || !buf_size){printf("[%s] Error filename or buf or buf_size error\n", __FUNCTION__);return -1;}fd = open(filename, O_RDONLY);if(fd < 0){printf("Open file '%s' failure:%s\n", filename, strerror(errno));ret = -2;goto CleanUp;}memset(buf, 0, sizeof(buf));fd = read(fd, buf, buf_size);if(fd < 0){printf("Read file '%s' failure:%s\n", filename, strerror(errno));ret = -3;goto CleanUp;}CleanUp:if (ret < 0){close(fd);}return ret;
}int main(int argc, char *argv[])
{int raw = 0;//原始数据float scale = 0;//精度值float act = 0;//实际值float conc = 0;//浓度值char adc_buf[30] = {};while(1){if(file_data_read(file_path[0],adc_buf, sizeof(adc_buf)) < 0){printf("Error:Read %s failuere.\n", file_path[0]);}scale = atof(adc_buf);//字符串类型转换为浮点数类型printf("scale:%f ", scale);if(file_data_read(file_path[1],adc_buf, sizeof(adc_buf)) < 0){printf("Error:Read %s failuere.\n", file_path[1]);}raw = atoi(adc_buf);//字符串类型转换为浮点数类型printf("raw:%d\n", raw);act = (raw*scale)/1000.f;conc = ((float)raw/4095.f)*100.f;printf("MQ-2 实际电压:%.3fV, 浓度为 %.1f%%\n", act, conc);sleep(1);}return 0;
}
Makefile文件:
CC=arm-linux-gnueabihf-gcc
APP_NAME=adc_mq2all:clean@${CC} ${APP_NAME}.c -o ${APP_NAME}clean:@rm -f ${APP_NAME}
make之后文件就是在ARM架构上运行的文件啦。
wangdengtao@wangdengtao-virtual-machine:~/wangdengtao/tftpboot$ make
wangdengtao@wangdengtao-virtual-machine:~/wangdengtao/tftpboot$ file adc_mq2
adc_mq2: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, BuildID[sha1]=38c11b2cad6acaa418e19672fba8008004e43b50, for GNU/Linux 3.2.0, not stripped
对tftp服务器搭建不了解的可以参考这篇文章:wpa_supplicant无线网络配置imx6ull以及搭建tftp服务器
tftp服务器下载到我们的开发板,然后运行:
root@igkboard:~# tftp -gr adc_mq2 192.168.0.134
root@igkboard:~# chmod a+x adc_mq2
root@igkboard:~# ./adc_mq2
scale:0.805664 raw:1029
MQ-2 virtual voltage: 0.829V, concentration: 25.1%
scale:0.805664 raw:1029
MQ-2 virtual voltage: 0.829V, concentration: 25.1%
scale:0.805664 raw:1029
MQ-2 virtual voltage: 0.829V, concentration: 25.1%
0000scale:0.805664 raw:1224
MQ-2 virtual voltage: 0.986V, concentration: 29.9%
0000scale:0.805664 raw:1329
MQ-2 virtual voltage: 1.071V, concentration: 32.5%
0.scale:0.805664 raw:1385
MQ-2 virtual voltage: 1.116V, concentration: 33.8%
.....scale:0.805664 raw:1446
MQ-2 virtual voltage: 1.165V, concentration: 35.3%
scale:0.805664 raw:1372
MQ-2 virtual voltage: 1.105V, concentration: 33.5%
scale:0.805664 raw:1332
MQ-2 virtual voltage: 1.073V, concentration: 32.5%
scale:0.805664 raw:1373
MQ-2 virtual voltage: 1.106V, concentration: 33.5%
scale:0.805664 raw:1526
MQ-2 virtual voltage: 1.229V, concentration: 37.3%
scale:0.805664 raw:1450
MQ-2 virtual voltage: 1.168V, concentration: 35.4%
scale:0.805664 raw:1412
MQ-2 virtual voltage: 1.138V, concentration: 34.5%
其实对着我们的烟雾传感器哈一口气都是可以看见变化的。
相关文章:
IGKBoard(imx6ull)-ADC编程MQ-2烟雾传感器采样
文章目录1- ADC介绍2- MQ-2烟雾传感器介绍(1)工作原理(2)MQ-2应用电路3- MQ-2烟雾传感器硬件连接4- ADC驱动配置5- 编程查看当前浓度1- ADC介绍 ADC是Analog-to-Digital Converter的缩写,指模数转换器。真实世界的模拟…...
前端二面vue面试题总结
什么是 mixin ? Mixin 使我们能够为 Vue 组件编写可插拔和可重用的功能。如果希望在多个组件之间重用一组组件选项,例如生命周期 hook、 方法等,则可以将其编写为 mixin,并在组件中简单的引用它。然后将 mixin 的内容合并到组件中…...
时间API在更新,传奇已经谢幕,但技术永远不死
(Bill Joy(左一),Vinod Khosla(左二),Andy Bechtolsheim(右二),Scott McNealy(右一) ) CSDN 博文征集活动(和日期相关的代码和bug):点击这里 各位 “big guys”,这篇博文…...
SQL调优指南笔记22:Gathering Diagnostic Data with SQL Test Case Builder
本文为SQL Tuning Guide 第21章“Gathering Diagnostic Data with SQL Test Case Builder”的笔记。 SQL Test Case Builder 是一种工具,可自动收集在不同数据库实例中重现问题所需的信息。 SQL 测试用例是一组信息,使开发人员能够为遇到性能问题的特定…...
从0开始学python -43
Python3 正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。 re 模块使 Python 语言拥有全部的正则表达式功能。 compile 函数根…...
Kafka基本原理
总述 简介 Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各…...
css3的重点内容
css3的重点内容 浮动 父级边框塌陷问题 浮动的清除 clear:left; //清除左侧浮动 clear:right; //清除右侧浮动 clear:both; //清除两侧浮动解决方案 增加父级元素的高度增加一个空的div,之后清除浮动通过overflow来进行相关元素的修剪给父类添加相应的伪类元素…...
《Roller: Fast and Efficient Tensor Compilation for Deep Learning》
《Roller: Fast and Efficient Tensor Compilation for Deep Learning》 用于深度学习 快速高效的张量编译器 作者 微软亚洲研究院以及多伦多大学等多所高校 摘要 当前编译为了产生高效的kernel时,搜索空间大,通常使用机器学习的方法 找到最优的方案…...
顺丰同城测试开发一面 49min答案,全文7000字,面试总结都在这里了
今天给大家分享一份顺丰同城的测试开发一面面试真题。老规矩,当你看到这份面试题的时候,先不要着急去看答案,你可以想想假如你在面试现场,你会怎么回答?这个思考的过程其实也是很重要的。 全文7000字干货,…...
docker启动容器服务之后访问失败
关于docker启动容器服务之后,宿主机访问失败(解决方法) 注:在进行docker容器启动宿主机进行容器访问时,无需进行网络的配置,docker容器在启动时会自动解决 第一种原因及修改方法 在进行启动的时候&#…...
GraalVM-云原生时代的JVM(Java)
文章目录一、GraalVM是什么?二、GraalVM有哪些特点?2.1、高性能2.2、多语言支持2.3、互操作性2.4、安全性三、GraalVM的应用效果3.1、提高性能3.2、简化开发3.3、降低成本3.4、节省资源3.5、支持云环境四、使用GraalVM编译springboot应用程序4.1、下载并…...
如何外网登录访问瑞友天翼应用虚拟化系统?——快解析内网端口映射方案
瑞友天翼应用虚拟化系统(GWT System)是国内具有自主知识产权的应用虚拟化平台,是基于服务器计算(Server-based Computing)的应用虚拟化平台。如何将内网平台提供到互联网上外网访问,是我们比较关注的问题。…...
蓝海彤翔执行副总裁张加廷接受【联播苏州】独家专访
今年春节档,科幻类电影《流浪地球2》票房口碑双丰收,截至目前,累计票房已破 38 亿,淘票票评分 9.6 ,影片的特效质感可以媲美国际顶尖水平。其中,蓝海彤翔为影片的后期制作提供了出色的渲染服务。2月21日&am…...
iOS Airplay Screen Mirroring 同屏技术详解
投屏技术已经被大量用在身边的产品,比如电视投屏,投影仪,视频会议产品中。 在iOS平台外的其他平台中都已经有非常成熟的标准和实现。但在封闭的苹果iOS和Mac系统中,苹果使用私有的Airplay协议进行多屏互动,只开放给自己…...
更新 Python 100道基础入门检测练习题【下篇】(附答案)
前言 大家早好、午好、晚好吖 ❤ ~ 爆肝更新 Python 100道基础入门练习题【篇上】 更多精彩内容、资源皆可点击文章下方名片获取此处跳转 实例021:猴子偷桃 题目: 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半…...
[RDMA-高级计算机网络report] Congestion Control for Large-Scale RDMA Departments
本文主要解决的问题是在RoCEv2体系中,基于优先级的拥塞控制PFC是一种粗粒度的机制。 它在端口(或端口加优先级)级别上运行,并且不区分流。PAUSE机制是基于每个端口(和优先级)的,而不是基于每个流…...
ROS2功能包Hello world(python)
文章目录环境准备Python创建工作空间、功能包及节点方法编译使用环境准备 为了便于日后复现,相关环境已经打包到docker中。 拉取docker镜像 docker pull 1224425503/ros2_foxy_full:latest新建容器 docker run -dit --rm --privilegedtrue --network host -e NV…...
数学建模竞赛的一些心得体会
1.数学建模经验首先简要的介绍一下我的情况。数学建模我也是在大一暑假开始接触的,之前对其没有任何的了解。我本身对数学也有相对较厚的兴趣,同时我也是计算机专业的学生,因此,我觉得我可参加数学建模的这个比赛。大一的暑假参加…...
什么是自动化测试?自动化测试现状怎么样?
什么是自动化测试:其实自动化测试,就是让我们写一段程序去测试另一段程序是否正常的过程,自动化测试可以更加省力的替代一部分的手动操作。 现在自动化测试的现状,也是所有学习者关心的,但现在国内公司主要是以功能测…...
CHAPTER 2 Web HA集群部署 - Heartbeat
Web HA集群部署 - Heartbeat1. Heartbeat 概述1.1 Heartbeat主要组成部分2. 环境依赖2.1 环境及组件软件2.2 关闭firewalld & selinux2.3 配置双机互信,SSH密钥登录2.4 同步时间(以主节点时间为准)2.5 配置域名解析3 安装软件3.1 安装…...
蓝桥杯每日一题:不同路径数(dfs深度优先)
给定一个 nm的二维矩阵,其中的每个元素都是一个 [1,9] 之间的正整数。 从矩阵中的任意位置出发,每次可以沿上下左右四个方向前进一步,走过的位置可以重复走。 走了 k 次后,经过的元素会构成一个 (k1) 位数。 请求出一共可以走出…...
NCRE计算机等级考试Python真题(十)
第十套试题1、数据库系统的核心是___________。A.数据库管理系统B.数据模型C.软件工具D.数据库正确答案: A2、下列叙述中正确的是___________。A.线性表链式存储结构的存储空间可以是连续的,也可以是不连续的B.线性表链式存储结构与顺序存储结构的存储空…...
【蓝桥杯嵌入式】点亮LED灯,流水灯的原理图解析与代码实现——STM32
🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…...
RK3288-android8-es7210-阵列麦克风
ES7210驱动包 应需求调试一个ES7210的阵列麦克风 首先移植 From 234647c69a57c32198c65836e7fc521dc22e444b Mon Sep 17 00:00:00 2001 From: LuoXiaoTan <lxt@rock-chips.com> Date: Tue, 10 Jul 2018 18:08:50 -0700 Subject: [PATCH] ASoC: codecs: add es7210 adc …...
硬件工程师常见问题与答疑
在工作中,尤其是做了很多年的,有些问题可能不知道,又不好意思问,怕别人说你连这个都不知道?很尴尬,而且百度又搜不到,本博主收集了很多答疑,希望里面有对你有用的,或者是…...
【Java】Java进阶学习笔记(一)—— 面向对象(封装)
【Java】Java进阶学习笔记(一)—— 面向对象(封装)一、类中成分1、类中成分2、this关键字this() 访问构造器方法3、static关键字1. 成员变量的区分2. 成员方法的区分3. 成员变量访问语法的区分二、封装1、封装的定义封装的好处2、…...
jsp拆迁管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 JSP 拆迁管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…...
CCNP350-401学习笔记(易错题合集)
CCNP350-401学习笔记(1-50题)_殊彦_sy的博客-CSDN博客CCNP350-401学习笔记(2023.2.17)https://blog.csdn.net/shuyan1115/article/details/129088574?spm1001.2014.3001.5502CCNP350-401学习笔记(51-100题)…...
喀秋莎Camtasia2023最新版本电脑录屏剪辑软件
录屏软件的鼻祖是techSmith 的喀秋莎(Techsmith Camtasia Studio),视频编辑软件Camtasia 2023发布,十大新功能放出!作为一个自媒体人,每天都要录制编辑视频,选择一个好的视频编辑工具就是大家首先面临的一个…...
「考研算法」
考研算法 前言 本系列文章涉及的算法内容,针对的是哈尔滨工业大学854科目。在本文中通过具体的算法题进行讲解相应算法。 今天涉及的算法主要有线性筛,十大排序中快速排序和归并排序。 后续会有动态规划的相关算法以及尝试模型的总结,如果…...
网站备案 多ip/免费创建个人博客网站
学习目的及目标 掌握UDP原理和工作过程 掌握乐鑫ESP32的UDP的程序设计 主要掌握UDP源码过程UDP科普(来自百度百科)UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型…...
天津制作网页/杭州网站优化方案
R Markdown是一种用于在R中生成可重复生成的报告的开源工具。它可以帮助您将所有代码,结果和编写都放在一个地方,并以一种有吸引力且易于消化的方式格式化所有内容。它也是将您的数据工作展示给其他人的宝贵工具。使用R Markdown,您可以选择将…...
java电商网站开发源码/站长之家是什么网站
for i in $( cd /proc;ls |grep "^[0-9]"|awk ‘ $0 >100‘) ;do awk ‘/Swap:/{aa$2}END{print ‘"$i"‘,a/1024"M"}‘ /proc/$i/smaps 2>/dev/null ; done | sort -k2nr | head -10可以看到pid18906的这个经常 占用了最多的swap然后 我们…...
wordpress首页添加价格/软文写作公司
假设需要交换的两个数为 a, b 使用中间变量 ------------- | a | b | t | ------------- 使用一个中间变量来做媒介来交换,设中间变量为t;则通过 a -> t; b -> a; t -> b 完成了交换,代码如下 var t a; a b; b t; 不使用中间变量…...
dz论坛做分类网站/杭州小程序建设公司
连试了几次全部失败。 只要用地铁卡了。 手机是:小米note2 支付宝首页》更多》便民生活》城市服务》交通》羊城通乘车码 出现二维码。 接着就是失败,失败,失败……...
大淘客构建自己的网站/黄页引流推广链接
Spark2.4.0源码分析之WorldCount 触发作业提交(二) 更多资源 github: https://github.com/opensourceteams/spark-scala-maven-2.4.0 主要内容描述 Final RDD作为参数,通过RDD.collect()函数触发作业提交时序图 https://github.com/opensourceteams/spark-scala-mav…...