跳转至

ADC

一、模数转换(ADC)概述

1.1 ADC 简介

ADC 通常指模拟/数字转换器,是指将连续变量的模拟信号转换为离散的数字信号的器件。

合宙 Cat.1 模块 ADC 接口主要用来检测模拟电压信号量,用于电池电压检测,温湿度检测,TDS 检测等应用。

1.2 ADC 接口介绍

1. ADC 介绍

Air8101 内部 ADC 接口精度为 12bits 外部直流分压为 0-2.4V

2. Air8101 内部具有 6 个 ADC 接口通道

通道复用对应关系:ADC1 对应 ADC10,ADC2 对应 ADC12,ADC3 对应 13,ADC4 对应 ADC14,ADC5 对应 ADC15,ADC6。通道如下图所示:

3. 特殊通道

CPU 内部温度 Temp -- adc.CH_CPU 主供电脚电压 VBAT -- adc.CH_VBAT

注意事项:

Air8101 不能使用内部分压(adc.setRange)!

二、演示功能概述

本章节演示了 Air8101 内部 11 个 ADC 接口。

以及 2 个特殊通道:CPU 内部温度 Temp -- adc.CH_CPU。主供电脚电压 VBAT -- adc.CH_VBAT 的使用教程。

  1. 通过 adc.get(adc.CH_VBAT)读取供电电压
  2. 通过 adc.get(adc.CH_CPU)读取 CPU 温度

三、准备硬件环境

3.1 开发板

开发板图片后续在此补充......

3.2 直流稳压电源

“古人云:‘工欲善其事,必先利其器。’在深入介绍本功能示例之前,我们首先需要确保以下硬件环境的准备工作已经完成。”

参考:硬件环境清单,准备以及组装好硬件环境。

合宙可调稳压电源,淘宝购买链接:合宙可调稳压电源淘宝购买链接

四、软件环境

“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。

1. Luatools 工具

2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V10001_Air8101.soc;参考项目使用的内核固件

3. luatos 需要的脚本和资源文件, 脚本和资源文件

lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到 Air8101 开发板,将本篇文章中演示使用的项目文件烧录到 Air8101开发板中。

4. 本教程使用api接口

五、模数转换(ADC)软硬件资料

5.1 API 接口介绍

本教程使用 api 接口为:adc - 模数转换 - LuatOS 文档

六、代码示例介绍

6.1 读取 adc 外部输入模拟电压

6.1.1 代码介绍

先判断 ADC 通道是否存在,然后 adc.open(1)开启 ADC1 ,之后通过 adc.get(1)获取 ADC1 的输入模拟电压值。只演示了 ADC1,后面的通道和 1 的使用方法一样,具体实现看脚本 demo:

if adc_pin_1 and adc_pin_1 ~= 255 then adc.open(adc_pin_1) end

if adc_pin_1 and adc_pin_1 ~= 255 then
   log.debug("adc", "adc" .. tostring(adc_pin_1), adc.get(adc_pin_1))
end

6.1.2 运行结果展示

可以将 adcx(x 代表通道)外接稳压电源供电,注意供电不可超过量程!

本示例将 adcx 输入 1.5V(电源正极接 adcx,负极接 GND),查看 Luatools 的 log 如下(返回值单位为 mV):

6.2 读取 VBAT 供电电压和 CPU 温度

6.2.1 代码介绍

打开 VBAT 读取供电电压和 CPU 温度这两个 ADC,然后获取数据。

if adc_pin_temp and adc_pin_temp ~= 255 then adc.open(adc_pin_temp) end
    if adc_pin_vbat and adc_pin_vbat ~= 255 then adc.open(adc_pin_vbat) end

        if adc_pin_temp and adc_pin_temp ~= 255 then
            log.debug("adc", "CPU TEMP", adc.get(adc_pin_temp))
        end
        if adc_pin_vbat and adc_pin_vbat ~= 255 then
            log.debug("adc", "VBAT", adc.get(adc_pin_vbat))
        end

6.2.2 运行结果展示

通过下图可以看到,VBAT 端供电电压为 3.3V,CPU 温度为 17°

七、总结

本教程简单举例了如何读取 adc 输入电压、读取供电电压、读取 CPU 温度,除此之外,adc 可以将各种连续变化的模拟信号(如温度、湿度、压力、电压、电流等)转换为离散的数字信号,本模块内部 ADC 精度 12bits,对许多应用已经足够,如温湿度传感器、压力传感器、音频信号处理等,然而对于需要更高精度的应用,可以外挂更高精度的 ADC,如 16 位,24 位等。使用过程中需注意量程范围,不可超出量程。

扩展

常见问题

1. ADC 测量电压来回跳变,为什么?

看外部输入电压是否与模块共地,正常情况需要共地,保持参考电压一致。

2. adc.read()和 adc.get()要用哪一个?

adc.read()返回两个值,一个原始值,一般没用,可以直接抛弃;另一个是从原始值换算得出的实际值,通常单位是 mV。(仅作了解,不建议使用)

adc.get()返回的就是计算值,通常单位是 mV,推荐使用这个接口来获取电压值。