完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。 先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获一、前言 GPIO的输入和输出我们已经讲完了,大家只要认真看过我的前几篇博客,相信掌握GPIO是使用方法不是什么难事 上篇博文我们讲到了,数字量输入采集也就是GPIO输入,数字量采集只能采集一些开关量,这可以解决绝大部分的问题,但是数字量采集也不是万能的,在遇到某些特殊的传感器时,也会感到无能为力 不是所有的传感器都是数字量输出的,也是有很多传感器是模拟量输出的,那到底什么是模拟量呢
既然这类模拟量传感器输出的是模拟信号,那么就不能使用常规的数字量输入功能进行采集,需采用新的功能ADC模数转换进行采集
在单片机上实现模拟量采集有如下两种方法
打开Air720Sl硬件设计手册找到如下部分 三、编写测试程序 Air720SL拥有两路硬件ADC功能,分别是GPIO62对应ADC0,GPIO63对应ADC1,两者的电气特性完全一致,分辨率也都是12位 首先使用前我们需要包含官方提供的adc驱动库require "adc",然后才可以使用相关库函数 ADC0的测试程序如下 local function ADC0_Task() local adcValue, voltValue = 0, 0 local result = adc.open(0)--打开ADC通道0 while true do log.info("ADC0_Task", "ADC0_Task_run") adcValue, voltValue = adc.read(0)--读取通道0的值 --adc.read接口返回的voltval放大了3倍,所以需要除以3还原成原始电压 if adcValue ~= 0xffff then log.info("ADC 0的原始测量数据和电压值:", adcValue, voltValue) end sys.wait(1000) end adc.close(0) end ADC1的测试程序如下 local function ADC1_Task() local adcValue, voltValue = 0, 0 local result = adc.open(1) while true do log.info("ADC1_Task", "ADC1_Task_run") adcValue, voltValue = adc.read(1) if adcValue ~= 0xffff then log.info("ADC 1的原始测量数据和电压值:", adcValue, voltValue) end sys.wait(1000) end adc.close(1) end 可以看出来,官方的库封装的很简洁,只需要三个函数就能实现模拟量采集 ADC0的测试代码和ADC1的测试代码几乎完全一样,没有什么区别,下面我们直接下载完整的测试程序进行测试 四、下载完整的代码到Air720Sl开发板 这里我们直接贴出全部代码 --必须在这个位置定义PROJECT和VERSION变量 --PROJECT:ascii string类型,可以随便定义,只要不使用,就行 --VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义 PROJECT = "LED" VERSION = "0.0.1" require "sys" --加载日志功能模块,并且设置日志输出等级 --如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可 require "log" LOG_LEVEL = log.LOGLEVEL_TRACE --[[ 如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数 如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如: 1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可 2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可 ]] --log.openTrace(true,1,115200) require "adc" local function ADC0_Task() local adcValue, voltValue = 0, 0 local result = adc.open(0)--打开ADC通道0 while true do log.info("ADC0_Task", "ADC0_Task_run") adcValue, voltValue = adc.read(0)--读取通道0的值 --adc.read接口返回的voltval放大了3倍,所以需要除以3还原成原始电压 if adcValue ~= 0xffff then log.info("ADC 0的原始测量数据和电压值:", adcValue, voltValue) end sys.wait(1000) end adc.close(0) end local function ADC1_Task() --初始化GPIO 比如GPIO_38 local adcValue, voltValue = 0, 0 local result = adc.open(1) while true do log.info("ADC1_Task", "ADC1_Task_run") adcValue, voltValue = adc.read(1) if adcValue ~= 0xffff then log.info("ADC 1的原始测量数据和电压值:", adcValue, voltValue) end sys.wait(1000) end adc.close(1) end local function user_main() sys.taskInit(ADC0_Task) sys.taskInit(ADC1_Task) end --启动系统框架 sys.taskInit(user_main) sys.init(0, 0) sys.run() 下载程序后,我们将ADC0和ADC1的引脚同时接地引脚在这 能够看到ADC1成功检测到了低电平,输出的数据是0。而ADC0却没有任何反应.。四、总结 1、官方的adc库函数
不会下载的点击这里,进去查看我的第二篇博文2、Air720SL模块Luat开发:第一个Luat的Hello World里面讲了怎么下载 |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
2433 浏览 0 评论
3341 浏览 9 评论
3021 浏览 16 评论
3514 浏览 1 评论
9118 浏览 16 评论
1242浏览 3评论
635浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
627浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2373浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1936浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-23 03:49 , Processed in 1.030689 second(s), Total 76, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号