跳转至

02 ADC

作者:许璐 | 最后修改:2026-06-03

一、模数转换(ADC)概述

1.1 ADC 简介

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

Air8101 模块的 ADC 接口主要用来检测模拟电压信号量,用于电池电压检测,温湿度检测,TDS 检测等应用。

1.2 ADC 接口介绍

1. ADC 介绍

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

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

Air8101有ADC1,ADC2,ADC3,ADC4,ADC5,ADC6,ADC10,ADC12,ADC13,ADC14,一共10路外部ADC;

这10路ADC复用的对应关系为:

每个通道对应的关系如下:

ADC1对应通道1

ADC2对应通道2

ADC3对应通道3

ADC4对应通道4

ADC5对应通道5

ADC6对应通道6

ADC10对应通道10

ADC12对应通道12

ADC13对应通道13

ADC14对应通道14

通道如下图所示:

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 温度

三、准备硬件环境

Air8101核心板 + 两个 Air9000P(直流电源)+ 杜邦线 +Type-c 数据线

三根 Type-c 数据线分别给两个 Air9000P 和 Air8000 开发板

一个 Air9000P 输出 1.2V 电压通过鳄鱼夹和杜邦线连接到 Air8000 开发板 ADC0 和 ADC1 通道

另一个 Air9000P 输出 3.3V 电压通过鳄鱼夹和杜邦线连接到 Air8000 开发板 ADC2 和 ADC3 通道

两个 Air9000P 和开发板通过鳄鱼夹和杜邦线共地

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

合宙功耗分析仪 Air9000P,淘宝购买链接:Air9000P 淘宝购买链接

Air8101 核心板购买链接:Air8101 核心板 WiFi 4G 以太网 蓝牙 720P显示屏 200万拍照-淘宝网

四、软件环境

在开始实践本示例之前,先筹备一下软件环境:

1. Luatools 工具

2. 本demo开发测试时使用的固件为Air8101 V2010 版本固件,本demo对固件版本没有什么特殊要求,所以你如果要测试本demo时,可以直接使用最新版本的内核固件;如果发现最新版本的内核固件测试有问题,可以使用我们开发本demo时使用的内核固件版本来对比测试;

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 代表通道)外接稳压电源供电,注意供电不可超过量程(0-2.4V)!

本示例将 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,推荐使用这个接口来获取电压值。