# 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)**:将量化后的值转换为二进制数字形式 ```{image} images/image_SF73bJEMFoPDlpxnZpCcYS0EnWc.webp :width: 756px :height: 422px :align: center ``` ## 性能参数详解 ### 核心参数 #### 分辨率(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能处理输入信号的最高频率 ```{image} images/image_Gyoib5zIeoZCvuxbHdrcWxfknWc.webp :width: 575px :height: 442px :align: center ``` #### 转换时间(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参数。 - **函数原型** ```c 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*](#qosaadcchannel_e) | | *cmd* | 输入 | *qosa_adc_ioctl_cmd_e* | IOCTL命令;详见 [*qosa_adc_ioctl_cmd_e*](#qosaadcioctlcmde) | | *arg* | 输入 | void * | 命令参数指针;当cmd为 *QOSA_ADC_IOCTL_SET_SCALE* 时,指向 [*qosa_adc_aux_scale_e*](#qosaadcauxscalee) 类型的分压系数 | - **返回值说明** *QOSA_ADC_SUCCESS*:函数执行成功 其他值(详见 [*qosa_adc_errcode_e*](#qosaadcerrcode_e)):函数执行失败 ### qosa_adc_get_volt - **功能描述** 获取ADC通道电压值。 - **函数原型** ```c 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*](#qosaadcchannel_e) | | *adc_value* | 输出 | int * | 获取到的电压值;单位:mV | - **返回值说明** *QOSA_ADC_SUCCESS*:函数执行成功 其他值(详见 [*qosa_adc_errcode_e*](#qosaadcerrcode_e)):函数执行失败 ```{note} 1. 此接口耗时较长,不能在中断或回调函数中使用 2. 返回的电压值已经考虑了内部分压电阻的影响 ``` ### qosa_get_vbat_volt - **功能描述** 获取VBAT的电压值。 - **函数原型** ```c qosa_adc_errcode_e qosa_get_vbat_volt(int *adc_value); ``` - **参数说明** | **参数名** | **输入/输出** | **类型** | **说明** | | --- | --- | --- | --- | | *adc_value* | 输出 | int * | 获取到的VBAT电压值;单位:mV | - **返回值说明** *QOSA_ADC_SUCCESS*:函数执行成功 其他值(详见 [*qosa_adc_errcode_e*](#qosaadcerrcode_e)):函数执行失败 ```{note} 1. 此接口耗时较长,不能在中断或回调函数中使用 2. VBAT电压测量通常有专用的硬件电路 ``` ## 枚举定义 ### qosa_adc_errcode_e ADC操作错误码枚举定义如下: ```c 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通道选择枚举定义如下: ```c 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分压系数枚举定义如下: ```c 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命令枚举定义如下: ```c 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* | 设置分压系数 | # 应用逻辑流程图 ```{figure} images/board_OvlfwrIayh9mwKbrqVAcjunzn3e.jpg :align: center :alt: image ``` # 示例代码 完整示例代码请查看 https://github.com/UniRTOS/UniRTOS-Doc-Examples/blob/main/peripheral/adc/adc_demo.c