4、模拟前端设计(二):信号调理电路——使用OPA356构建可变增益放大器(VGA)、增益控制电压生成

上一章我们把输入阻抗匹配和衰减网络搞定了。信号进来了,幅度也初步调整了,但问题来了——你想想看,一个1mV的信号和一个10V的信号,能直接用同一个放大倍数去处理吗?显然不行。

这就是我们今天要聊的核心:可变增益放大器(VGA)。说白了,就是让放大倍数能跟着输入信号的幅度自动变化。我最早做示波器时,在这块踩过不少坑,今天一并分享给你。

4.1 为什么需要VGA?

示波器的垂直分辨率通常是8位,也就是256个量化等级。如果ADC的满量程是2V,那么1个LSB对应的电压就是7.8mV。你想想,一个10mV的信号进来,只占1-2个LSB,波形细节全丢了。

所以我们需要把信号放大到ADC的满量程附近。但不同通道、不同档位下的信号幅度差异巨大,固定增益放大器根本搞不定。这时候VGA就派上用场了。

核心思路:根据输入信号的幅度,动态调整放大倍数,让输出信号始终接近ADC的满量程范围。

4.2 OPA356——我为什么选它?

OPA356这颗芯片,我在好几个项目里都用过。它有几个特点特别适合做示波器的VGA:

  • 带宽够用:200MHz的增益带宽积,处理几十MHz的信号完全没问题
  • 压摆率:300V/μs,信号边沿不会失真
  • 单电源供电:2.5V到5.5V都能工作,简化电源设计
  • 轨到轨输出:充分利用ADC的输入范围

我记得有一次,我试着用LMH6624做VGA,结果功耗太大,板子烫得不行。后来换成OPA356,性能没差多少,温度直接降了20度。嗯,选型这事,有时候真得靠经验。

4.3 经典VGA电路结构

我们用的是最经典的反相放大器加模拟开关切换反馈电阻的方案。结构其实不复杂:

输入信号 → 输入电阻 Rin → 运放反相输入端
                             │
                          ┌──┴──┐
                          │ OPA356 │
                          └──┬──┘
                             │
                          ┌──┴──┐
                          │ 反馈网络 │
                          │ (多路电阻 │
                          │ + 模拟开关)│
                          └──────┘
                             │
                          输出到ADC

增益计算公式很简单:

Gain = -Rf / Rin

负号表示反相,实际应用中我们更关心幅度,相位问题后面再处理。

4.4 增益档位设计

我习惯把增益分成几个固定的档位,用模拟开关切换。这样比连续可调更稳定,也更容易校准。

档位 增益(dB) 增益(倍数) Rf(Ω) 适用信号范围
1 0 1 1k 1V - 10V
2 10 3.16 3.16k 300mV - 1V
3 20 10 10k 100mV - 300mV
4 30 31.6 31.6k 30mV - 100mV
5 40 100 100k 10mV - 30mV
6 50 316 316k 1mV - 10mV

这里Rin我固定为1kΩ,只切换Rf。为什么?因为输入阻抗要保持一致,否则会影响前级衰减网络的匹配。

小技巧:电阻尽量用1%精度的,增益误差会小很多。我试过5%的电阻,校准起来太痛苦了,每个档位都要单独补偿。

4.5 模拟开关选型

模拟开关是VGA的关键器件。它直接串在反馈回路里,性能不好会严重影响信号质量。

我推荐用ADG1414或者MAX14550。它们的特点:

  • 导通电阻低:典型值只有几欧姆,对增益影响小
  • 带宽高:能到几百MHz,不会限制信号
  • 电荷注入小:切换时不会产生明显的毛刺

曾经有一次,我贪便宜用了CD4051,结果切换档位时输出端出现了一个几百mV的尖峰,直接把后级ADC烧了。从那以后,模拟开关我再也不敢省钱了。

4.6 增益控制电压生成

增益控制电压,说白了就是告诉模拟开关该切到哪个档位。这个电压从哪里来?

我通常用DAC + 比较器的方案:

  1. MCU通过SPI控制DAC输出一个参考电压
  2. 这个电压与输入信号的峰值进行比较
  3. 比较结果反馈给MCU,MCU再决定切换哪个档位

具体实现是这样的:

// 伪代码示例
uint8_t auto_gain_control(float peak_voltage) {
    if (peak_voltage < 0.01) return 6;  // 50dB档
    if (peak_voltage < 0.03) return 5;  // 40dB档
    if (peak_voltage < 0.10) return 4;  // 30dB档
    if (peak_voltage < 0.30) return 3;  // 20dB档
    if (peak_voltage < 1.00) return 2;  // 10dB档
    return 1;  // 0dB档
}

实际代码里还要加迟滞,防止在临界点来回切换。我一般加个20%的迟滞窗口,效果不错。

4.7 布局布线注意事项

嗯,这里要特别提醒你。VGA这部分电路,布局布线直接影响性能:

  • 反馈路径要短:Rf和模拟开关尽量靠近运放引脚
  • 电源去耦:每个运放引脚放一个100nF的陶瓷电容,位置越近越好
  • 地平面完整:不要在反馈回路下面走其他信号线
  • 模拟开关的电源:单独走线,不要和数字电路共用

警告:千万不要把模拟开关放在运放的输出端!我见过有人这么干,结果开关的导通电阻和运放的输出阻抗形成了分压,增益完全不准。模拟开关一定要放在反馈回路里。

4.8 实测效果

按照上面的方案,我实际搭了一个测试板。输入一个10mV、1MHz的正弦波,自动增益控制后,输出稳定在1.8Vpp左右(ADC满量程是2V)。波形几乎没有失真,信噪比在60dB以上。

说实话,这个性能已经可以媲美一些入门级的商用示波器了。成本嘛,核心器件加起来不到20块钱。性价比相当高。

下一章我们会聊ADC驱动和采样保持电路,到时候你会看到,VGA的输出质量直接决定了整个示波器的性能上限。所以这一章的内容,一定要吃透。