ADC 接口技术总结:原理、寄存器配置与工程考量

一、ADC的本质与信号链

模拟-数字转换器(ADC)完成从连续时间连续幅值的模拟电压信号到离散时间量化编码的数字信号的映射。嵌入式系统中,这一转换是传感器数据进入数字处理单元的唯一途径。ADC本身不直接感知温度、压力或光照,其输入端始终为电压信号。传感器将物理量转换为电压或电流,电流型输出通常经采样电阻转为电压,而后送入ADC。

此处的"模拟信号"是狭义的电平信号。物理世界中的温度、应变、光强等连续变化量,经过换能器变为电压,再经ADC量化,数字系统才能执行滤波、补偿、控制算法。信号链中任一环节的非理想特性------传感器非线性、参考源温漂、ADC量化误差、电源噪声------都会叠加到最终测量结果中。

二、SAR ADC的逐次逼近原理

笔记中给出的代码片段精确描述了逐次逼近型(SAR)ADC的核心算法。该结构在中等分辨率(8~16位)和中等采样率(几kSPS~几MSPS)范围内占据主导地位。逐次逼近的本质是二分搜索:

  • 参考电压V0V0​被分割为2n2n个阶梯。比较器一端接输入电压V1V1​,另一端接内部DAC输出的逼近电压。

  • 从最高有效位(MSB)开始:设当前逼近电压NN初始为0。首先比较N+V0/2N+V0​/2与V1V1​。若小于V1V1​,则该位置1,NN更新为N+V0/2N+V0​/2;否则该位置0,NN保持不变。

  • 移至下一位,位权值为V0/4V0​/4,重复比较N+V0/4N+V0​/4与V1V1​。依次进行至最低有效位(LSB)。

  • 循环结束后,寄存器data中的二进制数即为量化结果。

该算法每一比较周期仅改变一位,内部DAC需建立时间。因此采样保持电路与比较器的速度、DAC的线性度直接决定整体转换精度。笔记中循环变量Nb代表总位数,V0/2随循环右移,这一实现方式在硬件中由逐次逼近寄存器(SAR)控制逻辑完成。

三、IMX6ULL ADC模块硬件连接

核心板原理图中,ADC模块集成于SoC内部,参考电压高电平引脚为ADC_VREFH。该引脚必须外接稳定的电压源,其值直接决定输入量程。若VREFH接3.3V,则ADC输入范围0~3.3V;若接5V,范围0~5V。底板原理图显示GPIO1_IO07可作为模拟输入,对应ADC1_IN7通道。使用时需将该引脚复用功能设置为模拟模式,关闭上拉/下拉电阻及数字输出驱动。

SoC提供ADC1_IN0~ADC1_IN9共10个单端输入通道。各通道共享同一个采样保持器和SAR核心,通过模拟多路选择器切换。切换通道后需等待足够的采样时间,使内部采样电容充电至输入电压值。采样时间不足会导致转换结果偏低,误差依赖于信号源阻抗。

四、寄存器详细解析

ADC模块的控制与状态寄存器映射于外设地址空间。以下逐一分析笔记中列出的寄存器及位域的实际作用。

4.1 控制寄存器 ADCx_HC0

  • AIEN (bit7):转换完成中断使能。置1时,每次转换结束触发中断请求;置0时需轮询COCO0标志。

  • ADCH (bit0~4):通道选择码。共5位,可编码32个通道,但实际芯片仅支持10个模拟输入及若干内部通道(如温度传感器、VREF输出)。写入新通道值立即启动一次转换(若触发模式配置为软件触发)。

4.2 状态寄存器 ADCx_HS

  • COCO0 (bit0):转换完成标志。每次转换结束硬件置1,读该寄存器后自动清零(或通过写1清零,具体取决于设计,IMX6ULL为读后自动清除)。软件轮询时需注意清除行为。

4.3 数据结果寄存器 ADCx_R0

  • CDATA (bit0~11):12位转换结果。右对齐存储。若配置为10位或8位模式,有效位分别占用bit0~9或bit0~7,高位补零。

4.4 配置寄存器 ADCx_CFG

  • OVWREN (bit16):数据覆盖使能。允许新转换结果覆盖尚未读取的旧数据。禁用时,若上次数据未被读取而新转换完成,则COCO0不置位且结果丢失。

  • AVGS (bit15~14):硬件平均次数选择。00为4次平均,01为8次,10为16次,11为32次。使能硬件平均可节省CPU开销,但会降低有效采样率。

  • ADTRG (bit13):转换触发源。0为软件触发(写HC0即启动),1为外部硬件触发(如PWM定时器)。

  • REFSEL (bit12~11):参考电压源选择。00为VREFH/VREFL(外部引脚),其他选项对应内部1.2V带隙基准或备用参考。

  • ADHSC (bit10):高速配置。置1时提高ADC时钟频率上限,但可能降低线性度。

  • ADSTS (bit9~8):采样时间选择。决定采样阶段持续多少个ADC时钟周期。高阻抗信号源需要更长采样时间。

  • ADLPC (bit7):低功耗配置。置1降低功耗,但限制最高转换速度。

  • ADIV (bit6~5):时钟分频。00为1分频,01为2分频,10为4分频,11为8分频。

  • ADLSMP (bit4):长采样时间。置1时采样时间扩展为正常值的数倍。

  • MODE (bit3~2):分辨率。00为8位,01为10位,10为12位,11保留。

  • ADICLK (bit1~0):时钟源选择。00为IPG时钟,01为IPG/2,11为异步时钟ADACK。ADACK由内部振荡器产生,与总线时钟去耦,可降低数字开关噪声耦合。

4.5 通用控制寄存器 ADCx_GC

  • CAL (bit7):校准启动。写1触发校准序列,校准完成后硬件自动清零。校准期间不能启动转换。

  • ADCO (bit6):连续转换使能。置1时,完成一次转换后自动启动下一次,无需重新写HC0。

  • AVGE (bit5):硬件平均使能。需与AVGS配合。

  • ACFE (bit4):比较功能使能。可将转换结果与预设阈值比较,结果匹配时触发中断或置标志。

  • ACFGT (bit3):比较模式选择。0为小于阈值时触发,1为大于阈值时触发。

  • ACREN (bit2):范围比较使能。将结果与上下限比较。

  • DMAEN (bit1):DMA请求使能。转换结果可直接通过DMA传输至内存。

  • ADACKEN (bit0):异步时钟输出使能。使ADACK时钟从专用引脚输出,供外部电路使用。

4.6 通用状态寄存器 ADCx_GS

  • CALF (bit1):校准失败标志。若校准序列未正确完成,该位置1。需软件写1清除。

五、校准原理与流程

ADC内部的电容DAC存在失配和偏移。IMX6ULL ADC提供自动校准机制:将输入切换到内部零电平(VREFL)和内部满量程(VREFH),测量偏移误差和增益误差,计算修正系数并存入专用寄存器。校准流程如下:

  1. 确保ADC处于空闲状态,无正在进行的转换。

  2. ADCx_GC寄存器的CAL位为1。

  3. 轮询CAL位,等待其硬件清零。

  4. 检查ADCx_GSCALF位。若为0,校准成功;若为1,校准失败,需写1清除CALF后重新校准。

校准应在系统初始化阶段执行一次。若参考电压或温度发生显著变化,需重新校准。在校准完成之前启动的任何转换结果不可靠。

六、采样与滤波策略

6.1 单次采样代码结构

复制代码
// 配置ADC_CFG, ADC_GC等(一次初始化)
// 选择通道
ADCx_HC0 = (0 << 7) | (channel & 0x1F);
// 等待转换完成
while (!(ADCx_HS & (1 << 0)));
// 读取结果
uint16_t result = ADCx_R0 & 0xFFF;

6.2 均值滤波

对同一通道连续采样N次(N一般取4、8、16、32),求和后除以N。该法抑制零均值随机噪声,信噪比改善与√N成正比。IMX6ULL硬件平均模式可自动完成,无需软件循环。软件实现的优点是可以剔除野点(如去除最大最小值后再平均),但消耗更多CPU时间。

6.3 采样时间考量

输入等效电路包含采样开关电阻(约数kΩ)和采样电容(约数pF)。采样时间常数τ = R_source × C_sample + R_switch × C_sample。为使电容充电至1/2 LSB误差内,需等待至少ln(2^(n+1))个时间常数。对于12位ADC,至少需要约9个τ。若信号源阻抗为10kΩ,C_sample=5pF,τ=50ns,则最小采样时间450ns。实际配置时应留有裕量,选择ADSTSADLSMP提供足够长的采样窗口。

七、电压换算与分辨率

对于n位ADC,量化阶梯数为2^n。设参考电压为V_ref(VREFL通常为0V),转换结果D(十进制,0≤D≤2^n-1)对应的输入电压为:

Vin=D2n×VrefVin​=2nD​×Vref​

笔记中示例:8位ADC,V_ref=5V,D=194,得194/256×5=3.7890625V。12位ADC,V_ref=3.3V,D=194,得194/4096×3.3≈0.1563V。

分辨率一词存在两种含义:一是位数(如12位),二是最小可分辨电压(LSB大小),即V_ref/2^n。注意分辨率不等同于精度。精度指标包括:

  • 偏移误差:零输入时输出非零。

  • 增益误差:满量程转换值与理论值的斜率偏差。

  • 微分非线性(DNL):相邻码元之间实际步长与1 LSB的偏差。

  • 积分非线性(INL):传递曲线与理想直线之间的最大偏差。

高分辨率(如16位)ADC若DNL较大,有效位数(ENOB)可能远低于标称值。

八、光敏电阻分压电路分析

光敏电阻(LDR)阻值随光照强度指数级下降。常用电路为LDR与固定电阻R_fixed串联,分压点接ADC输入。设LDR阻值为R_ldr,输入电压V_in = V_ref × R_fixed / (R_ldr + R_fixed)。光照增强时R_ldr减小,V_in升高(若R_fixed接V_ref,LDR接地);或V_in降低(若LDR接V_ref,R_fixed接地)。

该分压电路输出电压与照度呈非线性关系,实际应用中需分段线性化或查表映射。同时注意LDR响应速度较慢(毫秒至秒级),不适用于快速变化的光信号。环境温度变化也会引起LDR暗电阻漂移,校准或差分测量可减轻此影响。

九、工程选型与配置原则

  1. 量程匹配:输入信号最大幅值应略低于V_ref,最小幅值略高于VREFL(通常为0V)。信号过小则使用同相放大电路;信号过大则电阻分压或使用高V_ref。注意分压电阻引入的噪声和分压比温漂。

  2. 分辨率选择:根据所需最小可检测电压变化决定位数。测量0~5V信号,要求分辨1mV,需log2(5/0.001)≈12.3位,选12位或以上。测量锂电池电压(3.0~4.2V,变化范围1.2V),1mV分辨率对应log2(1200)≈10.2位,12位足够。但若需检测微伏级变化,则需16~24位Σ-Δ ADC。

  3. 精度验证:查阅数据手册中的总未调整误差(TUE)、INL、DNL、失调和增益误差的温度系数。对精密仪器,需定期校准或选用自校准ADC。高精度ADC价格指数上升,需在成本与指标间权衡。

  4. 抗混叠滤波:采样定理要求输入信号带宽小于采样率的一半。ADC前的低通滤波器(RC或运放有源滤波器)用于衰减高于奈奎斯特频率的噪声分量,避免混叠。

  5. 电源与去耦:ADC的V_ref和模拟电源应使用独立LDO供电,与数字电源隔离。V_ref引脚附近放置1μF~10μF钽电容并联0.1μF陶瓷电容。PCB布局时模拟地与数字地单点连接。

十、总结

ADC驱动开发涉及信号特性分析、寄存器配置、时序控制及后处理滤波。SAR型ADC的分辨率和速度由内部DAC建立时间和比较器响应决定。IMX6ULL的ADC模块提供灵活的时钟选择、硬件平均、自动校准和多种触发模式,适应传感器采集、电池监测等常见场景。实际工程中应首先明确输入信号范围与阻抗,选择参考电压和分辨率,配置采样时间,执行校准,并视情况加入软件滤波。理解寄存器每一位的功能而非机械复制代码,才能在调试中快速定位问题。本文梳理的概念和寄存器细节可作为基于该平台ADC开发的参考。

相关推荐
Flamingˢ3 小时前
ZYNQ+OV5640+VDMA+HDMI视频链路搭建实录:从摄像头采集到实时显示
arm开发·嵌入式硬件·fpga开发·vim·音视频
晚安Jellyfish4 小时前
驱动---ARM系统移植
arm开发
Hello World . .5 小时前
ARM裸机学习9——ADC模块详解与应用实践
arm开发·嵌入式硬件
惶了个恐5 小时前
嵌入式硬件第九弹——ARM(5)
arm开发·单片机·嵌入式硬件·arm·硬件工程
进击的小头5 小时前
第4篇:嵌入式处理器内核全解析:ARM Cortex-M_R_A系列核心差异与选型指南
arm开发·单片机·嵌入式硬件
Hello World . .1 天前
ARM裸机学习3——用汇编语言点亮 LED
arm开发
ShineWinsu1 天前
常见网络连接问题分类
arm开发
Flamingˢ2 天前
ZYNQ + OV5640 + HDMI 视频系统调试记录:一次 RGB888 与 RGB565 引发的黑屏问题
arm开发·嵌入式硬件·fpga开发·vim·音视频
Flamingˢ2 天前
YNQ + OV5640 视频系统开发(二):OV5640_Data IP 核源码解析
arm开发·嵌入式硬件·网络协议·tcp/ip·fpga开发·vim·音视频