02 ADC
作者:王城钧 | 最后修改:2026-07-22
一、模数转换(ADC)概述
1.1 ADC 简介
ADC 通常指模拟/数字转换器,是指将连续变量的模拟信号转换为离散的数字信号的器件。 合宙 硬件产品中的 ADC 接口主要用来检测模拟电压信号量,用于电池电压检测,温湿度检测,TDS 检测等应用。
1.2 ADC 接口介绍
Air8201G基于Air780EGH模组,所以看Air780EGH的手册即可;
根据 Air780EGH 产品手册可知:
- Air780EGH 内部 ADC 接口精度为 12bits
- Air780EGH 内部具有 4 个 ADC 接口,ADC0 ~ ADC3
- 两个特殊通道 :
CPU 内部温度 Temp : -- adc.CH_CPU
主供电脚电压 VBAT : -- adc.CH_VBAT
注意事项: 设置分压(adc.setRange)要在 adc.open 之前设置,否则无效!!
1.3 输入电压的范围
Air780EGH 关闭分压后,量程范围 0~3.3V 注意:外接输入电压切记不可超过量程,否则有烧毁风险!!!
>-- 设置ADC引脚的测量范围0-3.3V,这种方式被测电压不可经过外部电阻分压后再挂在ADC上;
> adc.setRange(adc.ADC_RANGE_MAX)
> -- 设置ADC引脚的测量范围0-1.5V,这种方式被测电压可以经过外部电阻分压后再挂在ADC上;
> adc.setRange(adc.ADC_RANGE_MIN)
-- 说明:
-- 当被测量电压最高值在1.5v以内时, 推荐使用ADC_RANGE_MIN,且不添加外部分压电路;
-- 当被测量电压最高值在3.3v以内时, 推荐使用ADC_RANGE_MAX,且不添加外部分压电路;
-- 当被测量电压最高值在3.3v以上时, 推荐使用ADC_RANGE_MIN,且必须添加外部分压电路;
二、演示功能概述
由于Air8201G板子未引出4个普通adc接口,所以本章节仅演示2 个特殊通道:
CPU 内部温度 Temp -- adc.CH_CPU
主供电脚电压 VBAT -- adc.CH_VBAT 的使用教程。
1.通过 adc.get(id)读取4个普通ADC接口的外部输入模拟电压
注意:启用分压后可超量程测电压,但不建议使用避免烧坏,
若想测量更高的外部电源电压,需要外接分压电阻,
具体设计请参考ADC接口设计指导;本教程外部输入电压在3.3v以内,
需要外部电源与模组共地,保持参考电压一致
2.通过 adc.get(adc.CH_VBAT)读取VBAT电压
3.通过 adc.get(adc.CH_CPU)读取 CPU 温度
三、准备硬件环境


1、Air8201H 开发板一块 + 可上网的 sim 卡一张 +4g 天线一根;
2、TYPE-C USB 数据线一根;
TYPE-C USB 数据线直接插到板子的 TYPE-C USB 座子,另外一端连接电脑 USB 口;
四、软件环境
在开始实践本示例之前,先筹备一下软件环境:
1.烧录工具: Luatools 工具;
2.内核固件:Air8201G固件(基于Air780EGH)
3.LuatOS 需要的脚本和资源文件
脚本和资源文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8201/demo/adc
五、模数转换(ADC)软硬件资料
5.1 API 接口介绍
本教程使用 api 接口为:adc - 模数转换 - LuatOS 文档
5.2 ADC 硬件设计
ADC 硬件设计参考:adc - 硬件设计
六、代码示例介绍
6.1 读取供电电压
6.1.1 代码介绍
-- VBAT通道采集处理
adc.open(adc.CH_VBAT)
for _ = 1, num_samples do
table.insert(samples[5], adc.get(adc.CH_VBAT))
end
adc.close(adc.CH_VBAT)
process_channel(samples[5], "VBAT")
6.1.2 运行结果展示
通过下图可以看到,VBAT 端供电电压平均为 3.74V

6.2 读取 CPU 温度
6.2.1 代码介绍
-- CPU温度通道采集处理
adc.open(adc.CH_CPU)
for _ = 1, num_samples do
table.insert(samples[4], adc.get(adc.CH_CPU))
end
adc.close(adc.CH_CPU)
process_channel(samples[4], "CPU TEMP")
6.2.2 运行结果展示
通过下图可以看到,模组 CPU 平均温度为 32.5 摄氏度

6.3 数据处理函数
当通道样本数大于 2 时,先对样本升序排序并剔除首尾极值,计算剩余样本的平均值,最后根据标签(如 CPU 温度或电压)格式化输出带单位的处理值及总样本数,否则记录样本不足。
local function process_channel(channel_samples, tag)
if #channel_samples > 2 then
-- 升序排序
table.sort(channel_samples)
-- 创建剔除极值后的新数组
local trimmed = {}
for i = 2, #channel_samples-1 do
table.insert(trimmed, channel_samples[i])
end
-- 计算平均值
local sum = 0
for _, v in ipairs(trimmed) do
sum = sum + v
end
local avg_value = sum / #trimmed
-- 根据tag进行不同处理
if tag == "CPU TEMP" then
log.info(tag, string.format("温度值: %.2f ℃(样本数:%d)", avg_value/1000, #trimmed+2))
else
log.info(tag, string.format("处理值: %.2f mV (样本数:%d)", avg_value, #trimmed+2))
end
-- -- 格式化输出
-- log.info(tag, string.format("处理值: %.2f mV (样本数:%d)", avg_value, #trimmed+2))
else
log.info(tag, "样本不足无法处理")
end
end
七、总结
本教程简单举例了如何读取 adc 输入电压、读取供电电压、读取 CPU 温度,除此之外,adc 可以将各种连续变化的模拟信号(如温度、湿度、压力、电压、电流等)转换为离散的数字信号,本模块内部 ADC 精度 12bits,对许多应用已经足够,如温湿度传感器、压力传感器、音频信号处理等,然而对于需要更高精度的应用,可以外挂更高精度的 ADC,如 16 位,24 位等。使用过程中需注意量程范围,不可超出量程。 已经完全领悟 ADC 的逻辑了,快来实际操作一下吧!
常见问题
1.ADC 测量电压来回跳变,为什么?
看外部输入电压是否与模块共地,正常情况需要共地,保持参考电压一致。
2.adc.read()和 adc.get()要用哪一个?
使用 adc.get(),adc.read()不使用。 adc.get()返回的就是计算值,通常单位是 mV,推荐使用这个接口来获取电压值。
adc.read()的第一个返回值,没有意义,不做解释,第二个返回值与adc.get()的返回值一样为计算值,故推荐使用adc.get()。