1. 从零开始:为什么VGA需要这个“电阻网络”?
很多朋友刚开始玩单片机或者FPGA驱动VGA显示器的时候,都会遇到一个头疼的问题:我的板子输出的是0和1的数字信号,但VGA接口的R、G、B三个引脚,要求的是0到0.714V之间的模拟电压。这中间差了一道“数模转换”(DAC)的工序。去买一个专门的DAC芯片当然可以,但对于很多简单的显示应用,比如显示个菜单、做个小游戏、或者显示传感器数据,专门芯片不仅增加成本,布线也麻烦。
这时候,老司机们就会掏出一个既便宜又可靠的方案:电阻网络分压式DAC。它的核心思想特别“直男”——用一堆不同阻值的电阻,配合数字开关,像搭积木一样,组合出不同的分压比,从而把3.3V或5V的数字电平,“变成”我们想要的0-0.714V模拟电压。我最早用STM32点一块VGA屏幕的时候,就是用的这个方法,成本不到两块钱,效果却出奇地稳。
那么,这个电压范围0-0.714V是怎么来的呢?这其实是VGA标准里针对R、G、B模拟输入信号的规定。0V代表该颜色通道完全关闭(最暗),0.714V代表该颜色通道完全打开(最亮)。我们的电阻网络,目标就是要精准地复现这个范围内的任意电压值。你可能会想,这不就是个简单的分压电路吗?设计起来有什么难的?嘿,这里面的坑我踩过不少。电阻值不是随便选的,它们之间的比例关系直接决定了输出电压的精度和线性度。选不好,要么颜色显示不全(电压范围不够),要么颜色阶梯感严重(精度不够),显示出来的图像就会充满“数码味”,边缘锯齿明显,色彩过渡生硬。所以,这个看似简单的电阻网络,其设计和优化,恰恰是保证VGA显示效果是否细腻、色彩是否饱满的关键所在。
2. 核心设计:电阻值怎么选?比例是关键!
好了,现在我们知道了要用电阻网络来当DAC。那第一个问题就是:我该用几个电阻?每个电阻阻值选多大?这里就引出了一个核心概念:二进制加权电阻网络。这是最常用、也最容易理解的一种结构。
2.1 理解“二进制加权”原理
想象一下我们的数字信号,比如用RGB565格式中的红色(R)通道,它是5位。也就是说,我们可以用5根IO口线来控制,输出从00000到11111一共32个不同的数字值。我们希望这32个数字值,能对应转换成32个从0V到0.714V之间均匀分布的模拟电压。怎么对应呢?思路就是让每一个数字位(bit)控制一个电阻,而这个电阻的阻值,和它所在的“位权”成反比。
具体来说,对于最高位(MSB,比如第4位),它控制的电阻阻值最小,因为它“权重”最大,它接通(输出1)时,对输出电压的贡献最大。下一位的电阻阻值翻倍,贡献减半,以此类推。这样,当我们把不同位控制的电阻通过开关并联接入电路时,总等效电阻就会随着输入二进制代码的变化而呈阶梯状变化,再与一个固定的负载电阻(通常是VGA接口的75欧姆终端电阻)分压,就能得到阶梯状的输出电压。
那么,基准阻值怎么定呢?这需要从我们的目标电压和电源电压倒推。假设我们的数字IO高电平是3.3V,负载电阻RL是75欧姆。当所有位都输出1(即二进制全1)时,我们希望输出电压Vout尽可能接近但不超过0.714V。根据并联电阻分压公式:Vout = 3.3V * (RL / (R_parallel + RL))。其中R_parallel是所有接通电阻的并联值。我们的设计目标就是通过精心选择各个加权电阻的阻值,使得从全0到全1的所有组合下,Vout都能均匀、线性地覆盖0到0.714V的范围。
2.2 实战选型:从理论值到实际阻值
理论上,如果我们希望N位分辨率,那


512

被折叠的 条评论
为什么被折叠?



