ADC简介¶
Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.
ADC 子系统由信号复用器和电压模数转换器(VADC)组成,用于将内部及外部模拟信号通过多路复用方式路由至 VADC,并完成模拟量到数字量的转换。
ADC架构框图¶
ADC接口位置¶
智能主控板上ADC接口的位置如下图所示,其中Quectel Pi M1支持ADC0、ADC1,Quectel Pi L1只支持ADC0。
ADC管脚定义¶
Quectel Pi M1 支持使用的ADC管脚定义如下:
接口 |
引脚号 |
引脚名 |
PM4250引脚号 |
电压域 |
MPM中断 |
引脚描述 |
|---|---|---|---|---|---|---|
ADC |
128 |
ADC0 |
GPIO4 |
1.8 V |
- |
PMU_GPIO04 |
ADC |
185 |
ADC1 |
GPIO7 |
1.8 V |
- |
PMU_GPIO07 |
Quectel Pi L1 支持使用的ADC管脚定义如下:
接口 |
引脚号 |
引脚名 |
PM4250引脚号 |
电压域 |
MPM中断 |
引脚描述 |
|---|---|---|---|---|---|---|
ADC |
128 |
ADC0 |
GPIO6 |
1.8 V |
- |
PMU_GPIO06 |
ADC使用说明¶
通过ADC节点可以来查看该不同ADC通道的ADC输入数据。
使用方法¶
测试时使用可调直流电源作为输入信号源:
将电源 正极 连接到 ADC0 或 ADC1 引脚。
电源 GND 与智能主控板 GND 相连。
M1: 各通道对应关系及输入特性如下:
ADC0:
连接到GPIO4
节点:
in_voltage_adc_gpio4_input支持输入电压范围:约 0~5.25 V
ADC1:
连接到GPIO7
节点:
in_voltage_adc_gpio7_input支持输入电压范围:约 0~5.25 V
设置直流电源输出为目标电压后,可通过以下命令读取 ADC 采样结果(单位:μV):
adb shell
cd /sys/bus/iio/devices/iio:device0
cat in_voltage_adc_gpio4_input
cat in_voltage_adc_gpio7_input
L1: 通道对应关系及输入特性如下:
ADC0:
连接到PMU_GPIO6
节点:
in_voltage_adc_gpio6_input支持输入电压范围:约 0~5.25 V
设置直流电源输出为目标电压后,可通过以下命令读取 ADC 采样结果(单位:μV):
adb shell
cd /sys/bus/iio/devices/iio:device1
cat in_voltage_adc_gpio6_input
测试代码¶
以下示例代码演示了在应用程序中读取 ADC 电压值的基本方法。程序通过访问ADC对应的节点文件,读取ADC原始值(单位为 μV),并转换为整数以供后续处理。
点击展开/折叠:ADC读取测试代码(可自行NDK编译)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main()
{
int fd = -1;
int adc_value;
char buff[64] = {0};
// 打开ADC节点文件(ADC0对应GPIO4)
fd = open("/sys/bus/iio/devices/iio:device0/in_voltage_adc_gpio4_input", O_RDONLY);
if(fd < 0){
perror("open error\n");
return fd;
}
// 读取ADC值int n_read = read(fd, buff, sizeof(buff));
if(n_read < 0) {perror("read error\n");close(fd);return -1;}// 将读取的字符串转换为整数(单位为μV)
adc_value = atol(buff);
printf("read %d bytes, content: %s\n", n_read, buff);
printf("ADC value: %d μV\n", adc_value);
close(fd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main()
{
int fd = -1;
int adc_value;
char buff[64] = {0};
// 打开ADC节点文件(ADC0对应PMU_GPIO06)
fd = open("/sys/bus/iio/devices/iio:device1/in_voltage_adc_gpio6_input", O_RDONLY);
if(fd < 0){
perror("open error\n");
return fd;
}
// 读取ADC值int n_read = read(fd, buff, sizeof(buff));
if(n_read < 0) {perror("read error\n");close(fd);return -1;}// 将读取的字符串转换为整数(单位为μV)
adc_value = atol(buff);
printf("read %d bytes, content: %s\n", n_read, buff);
printf("ADC value: %d μV\n", adc_value);
close(fd);
return 0;
}
代码说明:
使用
open()函数打开ADC节点文件/sys/bus/iio/devices/iio:device0/in_voltage_adc_gpio4_input。使用
read()函数读取ADC原始值(字符串格式,单位为μV)。使用
atol()函数将字符串转换为长整型数值。读取的ADC值单位为微伏(μV),可根据需要转换为电压值。
编译和运行:
# 使用NDK编译# 将编译好的可执行文件推送到设备并运行
adb push test_adc /data/local/tmp/test_adc
adb shell "chmod +x /data/local/tmp/test_adc"
adb shell "/data/local/tmp/test_adc"
ADC测试数据¶
ADC引脚规格¶
板载ADC引脚定义如下:
接口 |
模块引脚号 |
模块引脚名 |
模块 I/O |
NET名称 |
说明 |
|---|---|---|---|---|---|
ADC |
128 |
ADC0 |
I |
ADC0 |
1) 连接器输入电压范围:0–5.25 V。 |
ADC |
185 |
ADC1 |
I |
ADC1 |
与ADC0相同的电气特性(0–5.25 V输入范围,RH = 18 kΩ,RL = 10 kΩ,ADC引脚电压 = Vin × 10/28)。 |
ADC0测试数据¶
电压源 |
ADC0(μV) |
理论值(V) |
|---|---|---|
1.8 V |
638408 |
1.8 V×10/28 = 0.642857 |
3 V |
1066414 |
3 V×10/28 = 1.07143 |
5 V |
1784623 |
5 V×10/28 = 1.78571 |
ADC1测试数据¶
电压源 |
ADC1(μV) |
理论值(V) |
|---|---|---|
1.8 V |
640549 |
1.8 V×10/28 = 0.642857 |
3 V |
1069269 |
3 V×10/28 = 1.07143 |
5 V |
1789814 |
5 V×10/28 = 1.78571 |