ADC简介

Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.


ADC 子系统由信号复用器和电压模数转换器(VADC)组成,用于将内部及外部模拟信号通过多路复用方式路由至 VADC,并完成模拟量到数字量的转换。

ADC架构框图

../../_images/image_WUQ8bpxNoohsFgxziIPcJFconQh.webp

ADC接口位置

智能主控板上ADC接口的位置如下图所示,其中Quectel Pi M1支持ADC0、ADC1,Quectel Pi L1只支持ADC0。

../../_images/image_EspbbT9JSoFy9cxeXcac1pmcngs.webp
智能主控板上ADC的位置

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输入数据。

使用方法

测试时使用可调直流电源作为输入信号源:

  • 将电源 正极 连接到 ADC0ADC1 引脚。

  • 电源 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
../../_images/image_FK3ib6g8Bo1WnkxEzX4cm6unnUb.webp
ADC读取示例输出

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。
2) 分压电阻:RH = 18 kΩ,RL = 10 kΩ。
3) ADC引脚电压 = 连接器输入电压(J0403)× (10/28)。
4) 示例:输入 3 V 时,ADC引脚电压应为 3 V × 10/28 ≈ 1.0714 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