ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

微机原理核心:DAC与ADC如何连接数字世界与模拟世界

微机原理核心:DAC与ADC如何连接数字世界与模拟世界 1. 从“0”和“1”到真实世界为什么我们需要DAC与ADC如果你玩过单片机或者接触过任何嵌入式系统你肯定知道一个基本事实微处理器、CPU、MCU这些数字世界的“大脑”它们只认识“0”和“1”。它们处理的是离散的数字信号高电平代表逻辑“1”低电平代表逻辑“0”。但真实世界是连续的、模拟的。温度是连续变化的声音是连续波动的光线强度也是连续渐变的。这就产生了一个根本性的矛盾数字系统如何感知和控制这个模拟世界这就是数模转换DAC和模数转换ADC存在的全部意义。它们是连接数字世界与模拟世界的“翻译官”和“桥梁”。没有它们你的电脑无法播放音乐因为音频信号是模拟的你的手机无法拍照因为光线强度是模拟的智能家居也无法感知室温因为温度是模拟的。在微机原理与接口技术这门课里学习DAC和ADC本质上就是在学习如何让8086、8051这类古老的CPU或者现代的ARM、RISC-V内核具备与现实世界交互的基本能力。这不仅是考试的重点更是所有硬件工程师、嵌入式开发者的核心技能之一。很多人觉得这部分内容抽象、难懂公式一堆。但在我看来只要抓住“为什么”和“怎么做”这两个核心一切都会变得清晰。我们不是为了背下DAC0832的引脚定义而是要理解它如何把8位二进制数变成电压我们也不是为了记住ADC0809的转换时序而是要掌握如何通过编程让CPU准确地读取一个模拟量。结合Proteus这类仿真工具你甚至可以在电脑上亲手搭建电路、编写程序亲眼看到数字量如何驱动一个LED亮度变化或者一个可调电阻如何被CPU“读”出来。这种从理论到仿真的闭环是掌握这门技术最高效的路径。2. 数模转换器如何让数字命令控制模拟输出让我们先来看DAC它是“发令官”。CPU下达一个数字命令DAC负责把这个命令“翻译”成对应的模拟电压或电流输出。这个过程的核心思想是“按权相加”。2.1 DAC的核心原理T型电阻网络与“按权相加”最经典、也最易于理解的DAC结构是R-2R T型电阻网络。为什么是它因为它只用两种阻值的电阻R和2R非常适合集成电路制造精度和一致性都很好。它的工作原理可以用一个简单的4位DAC来理解。假设我们有一个4位二进制数D3 D2 D1 D0D3是最高位。每一位控制一个电子开关。当某一位为“1”时开关将对应的2R电阻连接到参考电压Vref为“0”时则接地。神奇之处在于这个T型网络的结构。无论从哪个节点向左或向右看等效电阻都是2R。这就保证了电流在每一级被精确地平分。具体来说D3位最高位的电流为I3 Vref / (2R)如果D31。这个电流流到下一个节点时由于左右对称会被分成两半一半流向输出另一半继续向右。因此D2位贡献的电流是I3/2D1位是I3/4D0位是I3/8。最终流向运放求和点的总电流Iout就是各个位电流的和Iout (Vref / (2R)) * (D3/1 D2/2 D1/4 D0/8)运放将这个电流转换成电压Vout -Iout * RfRf是反馈电阻。于是一个离散的数字量就被线性地映射到了一个连续的模拟电压上。数字量的每一位的“权重”不同1, 1/2, 1/4, 1/8…这就是“按权相加”。注意这里的公式是理想化的。实际DAC芯片内部集成了这些电阻网络和开关我们只需要关心数字输入和模拟输出之间的关系。理解这个原理能帮你看懂芯片手册上的传递函数Vout (Vref * Digital Code) / (2^n)其中n是位数。2.2 经典芯片DAC0832深度拆解在8086时代的微机原理实验中DAC0832是绝对的明星。它是一片8位分辨率的DAC芯片。所谓8位意味着它的输入数字量范围是0~2552^8256个等级它能将这些等级转换成相应的电流输出。DAC0832为什么设计成电流输出这是一个关键点。早期的工艺制造高精度、低温漂的电阻网络相对容易但制造一个精准的电压输出级集成运放更难。所以DAC0832选择输出电流用户可以在外部根据自己的需要灵活地搭配运算放大器来转换成电压并调整放大倍数通过改变反馈电阻Rf。这给了设计者更大的自由度。我们来拆解它的引脚和内部结构这直接关系到如何编程控制它数字输入线 DI7~DI08位数据输入直接连接CPU的数据总线如通过8255并行接口芯片。控制线这是编程的关键。ILE输入锁存允许高电平有效。它是内部第一级锁存器的开关。CS片选和WR1写信号1当CS和WR1都为低电平时如果ILE为高则输入数据DI7~DI0被锁存到第一级“输入寄存器”中。注意此时数据并未送到DAC转换器因此输出不会改变。XFER传输控制和WR2写信号2当XFER和WR2都为低电平时第一级寄存器中锁存的数据会被传输到第二级“DAC寄存器”中。就在这个时刻DAC内部的转换开始模拟输出电流Iout1和Iout2随之改变。模拟输出Iout1和Iout2。两者关系为Iout1 Iout2 常数。通常我们将Iout1接入运放的反相输入端Iout2接地或接参考端通过运放实现电流到电压的转换。DAC0832的三种工作模式你选哪种这是实际应用中的核心选择取决于你对速度和接口的要求。直通模式将两级寄存器的控制信号全部置为有效ILE接高CS、WR1、WR2、XFER全部接地。这样数据总线上的任何变化都会立刻引起输出变化。不推荐因为这会令输出产生大量毛刺且CPU无法并行处理其他任务。单缓冲模式这是最常用的模式。让其中一级寄存器直通另一级受控。通常让第一级输入寄存器受控由CS和WR1控制锁存而让第二级直通XFER和WR2接地。这样CPU执行一次写操作CS和WR1有效数据就直接进入DAC寄存器并开始转换。接口简单速度较快。双缓冲模式两级寄存器都受控。这种模式用于需要同步更新多个DAC输出的场合。例如要控制X-Y示波器绘图需要同时更新X坐标和Y坐标的电压值。CPU可以先分别把X、Y数据写入两个DAC0832的第一级寄存器然后同时给两个DAC0832的XFER端一个有效信号让它们同时开始转换从而实现输出的精确同步。2.3 实战编程用8086和DAC0832产生一个锯齿波理论懂了我们来点实在的。假设我们在Proteus里搭建了一个电路DAC0832工作于单缓冲模式数据线通过一片8255A连接到8086的系统总线DAC的输出经运放转换成0~5V电压。我们的目标编写8086汇编程序让DAC输出一个从0V线性增长到5V然后瞬间归零再重复的锯齿波。步骤一硬件连接与地址分析首先需要确定8255A的端口地址。假设通过地址译码8255的A口地址为60H控制口地址为63H。我们将DAC0832的8位数据线连接到8255的A口并将DAC0832配置为单缓冲模式假设CS已接地或由地址译码选中WR1连接8255的写信号ILE接高电平XFER和WR2接地。步骤二8255初始化我们需要将8255的A口设置为方式0输出。MOV AL, 10000000B ; 控制字A口方式0输出B口、C口无关可设为输入 OUT 63H, AL ; 将控制字写入8255控制口步骤三生成锯齿波的算法锯齿波的本质是输出数字量从0线性增加到最大值255然后跳回0。每个数字量对应一个电压台阶Vout (5V / 256) * N其中N为数字量。因此电压是阶梯上升的由于台阶很小约19.5mV在宏观上看起来就是连续的斜线。汇编程序核心循环如下START: MOV CX, 0FFH ; 设置循环次数为255次0~255共256个点从0开始加 MOV AL, 0 ; 初始数字量为0 LOOP_WAVE: OUT 60H, AL ; 将AL的值通过8255 A口输出到DAC0832 CALL DELAY ; 调用一个延时子程序控制每个台阶的持续时间从而改变波形频率 INC AL ; 数字量加1 LOOP LOOP_WAVE ; 循环 JMP START ; 跳回开始形成周期波形 DELAY PROC NEAR ; 一个简单的软件延时子程序 PUSH CX MOV CX, 0FFFFH DELAY_LOOP: LOOP DELAY_LOOP POP CX RET DELAY ENDP为什么需要延时如果不加延时CPU以MHz速度输出数据DAC转换速度跟不上DAC0832建立时间约1μs而且产生的波形频率会高到无法观察。延时决定了波形的周期。DELAY子程序的时间乘以256就近似是锯齿波的周期。实操心得在Proteus仿真中你可以用虚拟示波器观察输出波形。你会看到一个完美的阶梯上升波形。尝试修改DELAY子程序的循环次数观察波形频率的变化。更进阶的你可以修改程序产生三角波先INC后DEC、方波在0和255之间跳变甚至正弦波需要预先计算好正弦表查表输出。这就是DAC在信号发生器中的基础应用。3. 模数转换器如何让数字系统“感知”世界如果说DAC是“发令官”那么ADC就是“侦察兵”。它的任务是将连续的模拟信号如传感器输出的电压转换成数字系统可以处理的二进制数字。这个过程可以分解为四个步骤采样、保持、量化、编码。3.1 ADC的核心原理与关键参数采样与保持模拟信号在时间上是连续的。ADC不可能处理无限个点。它需要以固定的时间间隔采样周期Ts对信号进行“抓拍”获取瞬时值。这个间隔的倒数就是采样频率Fs。奈奎斯特采样定理指出为了能无失真地还原原始信号采样频率必须大于信号最高频率分量的两倍。例如要采集音频最高20kHz采样率至少需要40kHzCD标准定为44.1kHz就是为了满足这个定理。采样到的瞬时电压值需要被保持住以便后续电路有稳定的时间进行量化。这就是“采样保持电路”的作用。量化与编码这是产生误差的根本环节。ADC的位数决定了它的分辨率。一个8位ADC参考电压Vref5V那么它能区分的最小电压变化称为1 LSB - Least Significant Bit就是5V / 256 ≈ 19.5mV。任何在0~19.5mV之间的输入电压都会被量化为数字量019.5~39mV之间的被量化为1以此类推。这个过程就像用一把刻度尺去测量长度。尺子的最小刻度是1厘米相当于1 LSB那么任何在0~1厘米之间的长度你都会读作“0厘米”。这个“四舍五入”或“舍去”的过程就是量化误差。它是固有误差无法消除只能通过提高ADC位数用更精密的尺子来减小。关键参数选择分辨率位数如8位、10位、12位、16位。位数越高量化误差越小能分辨的细节越多。转换时间完成一次完整的A/D转换所需的时间。决定了ADC的最大采样速率。转换类型主要有逐次逼近型SAR、双积分型、并行比较型Flash等。SAR型在速度、精度和成本上取得了很好的平衡是应用最广泛的类型我们接下来要讲的ADC0809就是SAR型。3.2 经典芯片ADC0809实战解析在8086系统中ADC0809是另一个里程碑式的芯片。它是一个8通道、8位分辨率、逐次逼近型的ADC。所谓8通道是指它内部有一个8选1的模拟开关可以轮流对8路模拟信号进行转换这对于多路数据采集系统非常有用。ADC0809的引脚与工作流程模拟输入IN0~IN78路输入。地址选择ADD A, ADD B, ADD C。这三位地址用于选择8路输入中的哪一路进行转换。例如CBA000选择IN0CBA001选择IN1以此类推。控制与状态线START启动转换信号上升沿清零内部寄存器下降沿开始转换。这是一个正脉冲。ALE地址锁存允许信号上升沿将ADD A/B/C上的通道地址锁存到内部地址锁存器。通常与START短接同时有效。EOC转换结束信号。转换开始时变为低电平转换结束后恢复高电平。这是CPU判断转换是否完成的关键。OE输出允许信号。高电平时转换结果数字量出现在数据线D7~D0上。时钟CLK。需要外部提供时钟信号典型频率为640kHz它决定了转换的节拍。转换一次需要64个时钟周期因此转换时间约为64 * (1/640kHz) 100μs。ADC0809与CPU的接口方式查询 vs 中断这是微机接口设计的经典问题CPU如何知道ADC转换完成了查询方式这是最简单直接的方式。CPU启动ADC后就不断地去读EOC引脚的状态可以通过一个三态缓冲器连接到数据总线的某一位。当检测到EOC从低变高说明转换完成CPU就可以发出OE信号读取转换结果。优点程序简单无需中断控制器。缺点CPU在等待期间被完全占用效率极低。中断方式将EOC信号作为中断请求信号连接到CPU的中断控制器如8259A。当转换完成EOC变高向CPU发出中断请求。CPU响应中断后在中断服务程序中读取转换结果。优点CPU在ADC转换期间可以执行其他任务效率高。缺点需要配置中断系统程序结构更复杂。在学习和仿真阶段查询方式更易于理解和调试。我们接下来的实战也基于此。3.3 实战编程用8086和ADC0809读取电位器电压我们在Proteus中搭建一个经典电路ADC0809的模拟输入IN0连接一个电位器模拟可变电压源数据输出线通过一片74LS245总线驱动器连接到8086的数据总线。控制线START、ALE、OE由8086通过地址译码和写/读信号产生。EOC状态通过一个三态门如74LS125连接到数据总线的D0位供CPU查询。目标编写程序循环读取IN0通道的电压值并将其转换成0~255的数字量显示出来例如通过8255驱动数码管或简单地将数据存入内存观察。步骤一硬件地址映射假设通过译码电路我们为ADC0809分配了三个“虚拟端口”启动/通道选择口地址80H。向此端口写入数据时数据的低3位用于选择通道会被锁存同时产生START和ALE脉冲。状态查询口地址81H。从该端口读取数据其D0位就是EOC的状态。数据读取口地址82H。当转换完成后向此端口执行读操作会生成OE信号从而将转换结果读入CPU。步骤二汇编程序实现查询方式DATA SEGMENT RESULT DB ? ; 定义一个字节单元用于存放转换结果 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MAIN_LOOP: ; 1. 启动转换并选择通道0 (IN0) MOV AL, 00000000B ; 低3位为000选择IN0通道 OUT 80H, AL ; 写入启动/通道选择口产生ALE和START脉冲 ; 2. 延时一小段时间等待EOC变低转换开始 CALL SHORT_DELAY ; 3. 查询EOC状态等待转换完成 POLL_EOC: IN AL, 81H ; 从状态查询口读取状态 AND AL, 01H ; 只保留D0位EOC状态 JZ POLL_EOC ; 如果EOC0转换未完成继续查询 ; 如果EOC1转换完成继续向下执行 ; 4. 转换完成读取转换结果 IN AL, 82H ; 从数据读取口读取数据此操作会同时使OE有效 MOV RESULT, AL ; 将结果保存到内存单元 ; 5. 此处可以添加显示或处理RESULT的代码 ; 例如将RESULT发送到8255控制的数码管上显示 ; 6. 延时一段时间然后开始下一次转换 CALL LONG_DELAY JMP MAIN_LOOP ; 短延时用于等待EOC变低 SHORT_DELAY PROC NEAR PUSH CX MOV CX, 10H SD_LOOP: LOOP SD_LOOP POP CX RET SHORT_DELAY ENDP ; 长延时用于控制采样间隔 LONG_DELAY PROC NEAR PUSH CX MOV CX, 0FFFFH LD_LOOP: LOOP LD_LOOP POP CX RET LONG_DELAY ENDP CODE ENDS END START程序逻辑深度解析启动转换OUT 80H, AL指令执行时地址总线出现80H写信号有效。我们的译码电路识别到这个地址会生成一个低电平有效的脉冲这个脉冲同时连接到ADC0809的ALE和START引脚。ALE的上升沿锁存了AL低3位的通道地址000紧接着START的下降沿启动了A/D转换过程。为什么需要SHORT_DELAY从START下降沿到EOC变低芯片内部有一个极短的延迟。如果紧接着就去查询EOC可能读到的是转换前的状态高电平导致误判。一个短暂的延时可以规避这个问题。查询等待POLL_EOC循环不断读取状态口81H并检查D0位。IN AL, 81H指令会使能连接EOC的三态门将EOC电平状态送到数据总线D0位。当转换完成EOC由低变高JZ条件不满足循环退出。读取结果IN AL, 82H指令是关键。当地址82H出现在总线上且读信号有效时译码电路产生OE有效信号ADC0809内部的输出三态门被打开转换结果出现在数据总线上被CPU读入AL寄存器。踩坑实录在Proteus仿真中最常见的错误就是时序问题。如果EOC查询不到高电平或者读到的数据一直是0或FF请按以下顺序排查时钟信号ADC0809的CLK引脚是否连接了频率合适的时钟~640kHz没有时钟芯片根本无法工作。参考电压Vref和Vref-是否接对了它们决定了输入电压的范围。通常Vref接5VVref-接地0V这样输入电压范围就是0~5V。控制时序用Proteus的逻辑分析仪或示波器同时抓取START、ALE、EOC、OE和CLK的波形。对照ADC0809的时序图检查START脉冲宽度是否足够OE信号是否在EOC变高后才发出。软件延时SHORT_DELAY是否太短可以适当增加循环次数。LONG_DELAY决定了采样率太短可能导致下次转换启动时上次转换还未完全结束。4. 超越芯片系统级设计与性能考量当你能够熟练使用DAC0832和ADC0809完成基本功能后你的思考应该从“如何用”上升到“如何用好”。这就涉及到系统级的考量和一些进阶概念。4.1 精度与干扰如何让你的数据更可靠在实际电路中ADC读到的值很少是绝对稳定的总会有跳动。DAC输出的波形也可能有毛刺。这背后是精度和干扰的问题。对于ADC提高测量精度参考电压源的质量Vref的稳定性直接决定ADC的精度。不要直接用系统的5V电源作为Vref它噪声大、有波动。应该使用专用的基准电压源芯片如TL431、REF5025等它们能提供非常稳定、低温漂的电压。模拟输入端的滤波在ADC的模拟输入引脚前增加一个RC低通滤波器例如一个1kΩ电阻和一个0.1μF电容到地。这个滤波器可以滤除高频噪声防止噪声干扰被采样进来。滤波器的截止频率应略高于你关心的信号最高频率。接地与布局模拟地和数字地一定要分开布线最后在电源入口处单点连接。ADC芯片的电源引脚附近要加去耦电容0.1μF和10μF并联。模拟信号走线要远离数字信号线尤其是时钟线。对于DAC提高输出质量输出缓冲与滤波DAC的输出尤其是电流输出型如DAC0832需要接一个运算放大器构成I-V转换电路。这个运放的选择很重要要关注它的压摆率Slew Rate和建立时间Settling Time这会影响输出波形的速度和保真度。同样在运放输出后可以加一个简单的RC低通滤波器平滑掉阶梯波形中的高频分量使波形更接近理想的模拟信号。“毛刺”问题当DAC输入的数字量发生多位同时变化时例如从01111111变到10000000由于内部开关动作速度的微小差异会在输出端产生一个短暂的尖峰脉冲称为“毛刺”。在精密应用中可以在DAC输出后接一个采样保持电路只在数字量稳定后才更新输出。4.2 与8086系统的接口优化直接存储器存取在我们之前的例子中无论是DAC产生波形还是ADC采集数据CPU都深度参与其中循环输出、查询等待。当需要高速、连续的数据流时如音频处理、高速数据采集这会大量消耗CPU资源导致系统无法处理其他任务。此时就需要引入DMA直接存储器存取技术。DMA控制器如Intel 8237可以在外设如ADC和内存之间直接传输数据而无需CPU干预。一个高速数据采集系统的设想架构ADC0809转换完成EOC信号不仅作为状态信号也作为DMA的DREQDMA请求信号。DMA控制器收到请求后向CPU发起总线请求HOLD。CPU在当前总线周期结束后释放总线控制权并回应HLDA保持响应。DMA控制器接管总线将ADC数据口的地址82H放到地址总线上同时发出读信号IOR和内存写信号MEMW将ADC数据直接写入内存中预先设定好的缓冲区。传输完一个字节后DMA内部地址计数器加1准备下一次传输。当设定的传输次数完成后DMA向CPU发出中断通知CPU一批数据已采集完毕。这种方式下CPU只在DMA传输开始和结束时参与中间过程被完全解放可以处理更复杂的算法或任务实现了高速数据吞吐。4.3 从8位到现代技术演进与选型思考虽然DAC0832和ADC0809是经典的教学模型但现代电子系统中它们已基本被更先进的芯片取代。了解它们的局限有助于你理解现代芯片的进步。集成度现代ADC/DAC往往是单片数据采集系统。一颗芯片内部可能集成了多路ADC、DAC、可编程增益放大器PGA、基准电压源、温度传感器甚至微控制器内核如MCU内的ADC模块。这大大简化了外围电路设计。接口并行接口如DAC0832的8位数据线占用引脚多速度在当今标准下也不算快。现代芯片普遍采用串行接口如SPI、I2C。只需2-4根线就能实现高速通信节省了宝贵的MCU引脚和PCB空间。性能分辨率从8位普及到12位、16位甚至24位用于高精度测量。转换速度从几十kSPS千次采样每秒发展到几MSPS甚至GSPS。功耗也越来越低。当你为一个新项目选择ADC/DAC时应该问自己这几个问题需要多少精度分辨率8位256级12位4096级这决定了你能分辨多小的信号变化。需要多快的速度采样率/建立时间要采集音频~44kHz还是视频信号MHz这决定了转换器的类型SAR、Sigma-Delta、Flash等。有多少路信号单端输入还是差分输入差分输入抗共模干扰能力更强。接口形式并行速度快但引脚多还是串行节省引脚供电和功耗是否是电池供电设备对功耗极其敏感微机原理课程中这些看似“古老”的知识恰恰是理解这些现代芯片参数和接口协议的基础。当你理解了ADC0809的时序再看STM32的ADC库函数配置你就会明白那些“采样时间”、“对齐方式”、“扫描模式”寄存器位到底在控制什么。当你用DAC0832产生过波形你就更容易理解为何要配置DMA来给DAC送数据以生成高质量音频。这些底层原理和经验是跨越具体芯片型号的通用能力。
返回列表