6、Air720SL模块Luat开发:又是一种新的外设之ADC模

目录

点击这里查看所有博文

一、前言

GPIO的输入和输出我们已经讲完了,大家只要认真看过我的前几篇博客,相信掌握GPIO是使用方法不是什么难事

上篇博文我们讲到了,数字量输入采集也就是GPIO输入,数字量采集只能采集一些开关量,这可以解决绝大部分的问题,但是数字量采集也不是万能的,在遇到某些特殊的传感器时,也会感到无能为力
在这里插入图片描述

不是所有的传感器都是数字量输出的,也是有很多传感器是模拟量输出的,那到底什么是模拟量呢

既然这类模拟量传感器输出的是模拟信号,那么就不能使用常规的数字量输入功能进行采集,需采用新的功能ADC模数转换进行采集

在单片机上实现模拟量采集有如下两种方法

首先使用前我们需要包含官方提供的adc驱动库require "adc",然后才可以使用相关库函数

ADC0的测试程序如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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的测试程序如下

1
2
3
4
5
6
7
8
9
10
11
12
13
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开发板

这里我们直接贴出全部代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
--必须在这个位置定义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却没有任何反应.。
这里我也分开单独测试过均没有测试成功。也许是官方的底层固件出了bug,目前我使用的是v0008版本的固件,下个版本也许会修复这个问题,使用的话建议暂时避开ADC0
在这里插入图片描述

四、总结

1、官方的adc库函数

不会下载的点击这里,进去查看我的第二篇博文2、Air720SL模块Luat开发:第一个Luat的Hello World里面讲了怎么下载
这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束

上次更新 2021-01-28