ADC

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


功能概述

基本概念与原理

ADC定义

ADC(Analog-to-Digital Converter,模数转换器) 是一种将连续变化的模拟信号转换为离散数字信号的电子器件,是物理世界与数字系统之间的桥梁:数字芯片需要借助ADC才能获取外部环境中的模拟量。

模拟信号是指在时间上连续变化的信号,任意时刻都有确定的取值,用于传达温度、湿度、压力、长度、电流等连续变化的物理量。这些物理量须先转换为电信号,才能被电路传输和处理。

数字信号是指在时间和幅值上均离散取值的信号,在计算机中以二进制形式存储。

以工作电压为3.3 V的处理器为例,其内部电路只识别0 V(逻辑0)和3.3 V(逻辑1)两种电平。物理世界中一个1 V的模拟电压信号无法被CPU直接识别,须先经ADC转换为CPU能够识别的二进制数字信号。

ADC工作原理

ADC的工作过程包括四个关键步骤:

  1. 采样(Sampling):在固定时间间隔内获取模拟信号的瞬时值(时间离散化)

  2. 保持(Holding):在采样期间保持信号值不变,避免转换过程中信号变化

  3. 量化(Quantization):将采样值映射到有限的离散电平(幅值离散化)

  4. 编码(Encoding):将量化后的值转换为二进制数字形式

../../_images/image_SF73bJEMFoPDlpxnZpCcYS0EnWc.webp

性能参数详解

核心参数

分辨率(Resolution)

  • 定义:ADC输出数字代码所能表示的最小输入电压变化量

  • 表示:通常用位数表示(8位、10位、12位等)

  • 公式:分辨率 = Vref / (2^N),其中N是位数

  • 示例:12位ADC,Vref = 3.3 V时,LSB ≈ 0.8 mV

采样率(Sampling Rate)

  • 定义:ADC每秒完成模数转换并输出数字结果的次数

  • 单位:SPS、kSPS、MSPS、GSPS

  • 意义:决定了ADC能处理输入信号的最高频率

../../_images/image_Gyoib5zIeoZCvuxbHdrcWxfknWc.webp

转换时间(Conversion Time)

  • 定义:从ADC启动一次转换到转换完成所需的时间

  • 关系:采样率 = 1 / 转换时间(对于单次转换架构)

精度参数

积分非线性(INL)

  • 衡量ADC在整个输入范围内,实际转换特性曲线偏离理想直线的最大偏差

  • 单位:LSB(最低有效位)

微分非线性(DNL)

  • 衡量ADC相邻两个输出码对应的实际输入电压差与理想电压差的最大偏差

  • DNL > |1| LSB 可能导致输出码失码

偏移误差和增益误差

  • 偏移误差:输入电压为零时,实际输出码与理想输出码的偏差

  • 增益误差:实际传输特性曲线的斜率与理想斜率之间的偏差

动态性能参数

信噪比(SNR)

  • 输出信号中基波信号成分与噪声成分的比值

  • 单位:dB

  • 越高表示量化噪声和电路内部噪声越小

信噪失真比(SINAD/THD+N)

  • 基波信号成分与谐波成分加噪声成分的比值

  • 更能全面反映转换器对信号的保真度

有效位数(ENOB)

  • 将理想ADC的信噪失真比代入SNR公式计算出的等效位数

  • 计算公式:ENOB = (SINAD - 1.76) / 6.02

  • 实际应用中比标称分辨率位数更能体现ADC的真实性能

常见问题

ADC电压范围

  1. 每个ADC接口引脚的输入电压不能超过其允许的电压范围;当被测电压超出该范围时,应先通过电阻分压将其降至范围内,再接入模块ADC引脚;

  2. 在模块VBAT未供电的情况下,禁止向ADC接口输入任何电压,以免损坏模块。

ADC位宽

ADC位宽指ADC转换结果用多少位二进制数表示。位宽越大,分辨率越高,采集越精准。例如1 V电压经10位ADC转换后,每个量化级(1 LSB)对应1/1024 V。模块ADC返回的是经处理后的电压值。

ADC API

头文件

qosa_adc.h

函数概览

函数名

功能描述

qosa_adc_ioctl()

配置ADC参数

qosa_adc_get_volt()

获取ADC通道电压值

qosa_get_vbat_volt()

获取VBAT的电压值

函数详解

qosa_adc_ioctl

  • 功能描述
    配置ADC参数。

  • 函数原型

qosa_adc_errcode_e qosa_adc_ioctl(qosa_adc_channel_e adc_id, qosa_adc_ioctl_cmd_e cmd, void *arg);
  • 参数说明

参数名

输入/输出

类型

说明

adc_id

输入

qosa_adc_channel_e

ADC通道选择;详见 qosa_adc_channel_e

cmd

输入

qosa_adc_ioctl_cmd_e

IOCTL命令;详见 qosa_adc_ioctl_cmd_e

arg

输入

void *

命令参数指针;当cmd为 QOSA_ADC_IOCTL_SET_SCALE 时,指向 qosa_adc_aux_scale_e 类型的分压系数

  • 返回值说明
    QOSA_ADC_SUCCESS:函数执行成功
    其他值(详见 qosa_adc_errcode_e):函数执行失败

qosa_adc_get_volt

  • 功能描述
    获取ADC通道电压值。

  • 函数原型

qosa_adc_errcode_e qosa_adc_get_volt(qosa_adc_channel_e adc_id, int *adc_value);
  • 参数说明

参数名

输入/输出

类型

说明

adc_id

输入

qosa_adc_channel_e

ADC通道选择;详见 qosa_adc_channel_e

adc_value

输出

int *

获取到的电压值;单位:mV

  • 返回值说明
    QOSA_ADC_SUCCESS:函数执行成功
    其他值(详见 qosa_adc_errcode_e):函数执行失败

备注

  1. 此接口耗时较长,不能在中断或回调函数中使用

  2. 返回的电压值已经考虑了内部分压电阻的影响

qosa_get_vbat_volt

  • 功能描述
    获取VBAT的电压值。

  • 函数原型

qosa_adc_errcode_e qosa_get_vbat_volt(int *adc_value);
  • 参数说明

参数名

输入/输出

类型

说明

adc_value

输出

int *

获取到的VBAT电压值;单位:mV

  • 返回值说明
    QOSA_ADC_SUCCESS:函数执行成功
    其他值(详见 qosa_adc_errcode_e):函数执行失败

备注

  1. 此接口耗时较长,不能在中断或回调函数中使用

  2. VBAT电压测量通常有专用的硬件电路

枚举定义

qosa_adc_errcode_e

ADC操作错误码枚举定义如下:

typedef enum
{
    QOSA_ADC_SUCCESS = 0,
    QOSA_ADC_EXECUTE_ERR = 1 | QOSA_ADC_ERRCODE_BASE,
    QOSA_ADC_GET_VALUE_ERR,
    QOSA_ADC_INVALID_PARAM_ERR,
    QOSA_ADC_MEM_ADDR_NULL_ERR,
} qosa_adc_errcode_e;

成员

说明

QOSA_ADC_SUCCESS

函数执行成功

QOSA_ADC_EXECUTE_ERR

执行错误

QOSA_ADC_GET_VALUE_ERR

获取值错误

QOSA_ADC_INVALID_PARAM_ERR

参数无效

QOSA_ADC_MEM_ADDR_NULL_ERR

内存地址为空

qosa_adc_channel_e

ADC通道选择枚举定义如下:

typedef enum
{
    QOSA_ADC0_CHANNEL = 0,
    QOSA_ADC1_CHANNEL = 1,
    QOSA_ADC_CHANNEL_MAX,
} qosa_adc_channel_e;

成员

说明

QOSA_ADC0_CHANNEL

ADC0通道

QOSA_ADC1_CHANNEL

ADC1通道

QOSA_ADC_CHANNEL_MAX

通道数量上限(占位值)

qosa_adc_aux_scale_e

ADC分压系数枚举定义如下:

typedef enum
{
    QOSA_ADC_SCALE_LEVEL_0 = 0,
    QOSA_ADC_SCALE_LEVEL_1,
    QOSA_ADC_SCALE_LEVEL_2,
    QOSA_ADC_SCALE_LEVEL_3,
    QOSA_ADC_SCALE_LEVEL_4,
    QOSA_ADC_SCALE_MAX,
} qosa_adc_aux_scale_e;

成员

说明

QOSA_ADC_SCALE_LEVEL_0

无内部分压电阻;最大范围:1.6 V

QOSA_ADC_SCALE_LEVEL_1

分压系数1/2;最大范围:3.2 V

QOSA_ADC_SCALE_LEVEL_2

分压系数1/4;最大范围:3.3 V

QOSA_ADC_SCALE_LEVEL_3

分压系数1/8;最大范围:3.3 V

QOSA_ADC_SCALE_LEVEL_4

分压系数1/16;最大范围:3.3 V

QOSA_ADC_SCALE_MAX

分压系数档位上限(占位值)

qosa_adc_ioctl_cmd_e

ADC IOCTL命令枚举定义如下:

typedef enum
{
    QOSA_ADC_IOCTL_NONE,
    QOSA_ADC_IOCTL_SET_SCALE,
} qosa_adc_ioctl_cmd_e;

成员

说明

QOSA_ADC_IOCTL_NONE

无操作(占位值)

QOSA_ADC_IOCTL_SET_SCALE

设置分压系数

应用逻辑流程图

image

示例代码

完整示例代码请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/peripheral/adc/adc_demo.c