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 的使用教程。
- 通过 adc.get(adc.CH_VBAT)读取供电电压
- 通过 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,推荐使用这个接口来获取电压值。