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的工作过程包括四个关键步骤:
采样(Sampling):在固定时间间隔内获取模拟信号的瞬时值(时间离散化)
保持(Holding):在采样期间保持信号值不变,避免转换过程中信号变化
量化(Quantization):将采样值映射到有限的离散电平(幅值离散化)
编码(Encoding):将量化后的值转换为二进制数字形式
性能参数详解¶
核心参数¶
分辨率(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能处理输入信号的最高频率
转换时间(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电压范围¶
每个ADC接口引脚的输入电压不能超过其允许的电压范围;当被测电压超出该范围时,应先通过电阻分压将其降至范围内,再接入模块ADC引脚;
在模块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):函数执行失败
备注
此接口耗时较长,不能在中断或回调函数中使用
返回的电压值已经考虑了内部分压电阻的影响
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):函数执行失败
备注
此接口耗时较长,不能在中断或回调函数中使用
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 |
设置分压系数 |
应用逻辑流程图¶
示例代码¶
完整示例代码请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/peripheral/adc/adc_demo.c