简介:《程控电流放大器的设计》文档面向电子信息、自动化等专业学生及参加电子设计竞赛的读者,围绕可编程增益与电流放大电路方案展开。内容从系统框图入手,梳理前级AD603两级级联放大、AGC反馈、后级分立元件推挽互补输出,以及ADUC812单片机程控增益和输出电压有效值显示等模块;并对AD7520数控衰减、集成芯片与分立元件后级等方案作比较,附LM317T稳压电源等电路分析,便于课程设计、竞赛题复盘与硬件调试参考。资源包共1个doc文件,约246KB,篇幅集中,适合快速查阅整体设计思路与关键参数。已有406人学习,可为需要搭建程控放大链路、理解增益分配和输出级设计的读者提供较完整的方案参照。
1. 一套 60dB 的程控放大器设计:增益分配比选芯片更值得先算清楚
程控电流放大器的设计里最容易走偏的一步,是先盯着芯片选型,把增益预算留到最后。手上这套方案的电路图由三块拼起来:AD603 两级级联的可控增益前级(带 AGC)、分立元件搭的单电源互补推挽后级、以 ADUC812 为核心的控制与显示模块,输出有效值要求做到 8V 以上。它的价值不在用了多贵的器件,而在于把 60dB 总增益拆成前级可调 40dB、后级固定 20dB 两段,每段都能单独拿出来测、单独排查。适合正在做程控放大器课程设计、或者要把毫伏级小信号推到几伏有效值输出的人。下面按信号从输入到输出的顺序,把这套设计里能抄的部分和会翻车的地方一次讲清。
2. 前级增益链路:AD603 两级级联怎么分掉 40dB
2.1 三条增益控制路线的取舍:分立三极管、AD7520 电阻网络、AD603
分立元件方案的电路图看着最“基础”,实际上最难调。为了凑到 60dB,得做好几级三极管放大,再用二极管检波产生反馈电压去改前级的工作点做自动增益。问题是每级的工作点都互相牵扯,温度一变静态电流就飘,增益的定量调节基本靠试;多级级联之后分布电容和电源内阻把相位裕度吃掉,自激是家常便饭。这条路能出波形,但出不了可重复的指标,做课程设计想拿分不建议碰。
AD7520 那条路走的是另一套思路:用 10 位 D/A 的电阻权网络去改反馈系数,输出 Vout = Dn × Vref / 1024,理论上有 1024 挡,精度和数控性都不错。坑在参考电压——AD7520 对 Vref 的幅度有要求,想让输入信号从 mV 到 V 每个数量级都放大得准,得在它前面加一级适应性放大,再让前后级增益积正好等于 1024 去抵消衰减。这个配平一旦算错,整条链路的增益就是非线性的;而且它的带宽只有几 kHz,频带要求一上来直接判死。
AD603 把 R-2R 梯形衰减网络和固定增益放大器封在一颗片子里,衰减量由加在增益控制口的电压决定,控制口输入电阻高达 50MΩ,外接电路几乎不用考虑负载效应。直流到 30MHz 以上可用,单级实际工作能给出 20dB 以上,两级级联 40dB 以上,再接后级就能在高频段做到 60dB。三条路线的对比如下:
| 方案 | 增益调节方式 | 可用带宽 | 定量精度 | 主要风险 |
|---|---|---|---|---|
| 分立三极管多级 | 检波反馈改工作点 | 取决于管子和级数 | 差,难以定量 | 工作点漂移、级联自激 |
| AD7520 电阻网络 | 10 位 D/A 改反馈系数 | 几 kHz | 1024 挡,理论精度高 | Vref 幅度限制、非线性误差 |
| AD603 级联 | 控制电压 Vg 连续调节 | 90MHz / 9MHz 两档 | 与 Vg 线性相关 | 输入阻抗仅 100Ω,需匹配 |
选 AD603 的真正理由不是“集成度高”这种空话,而是增益和控制电压之间有一条能写进代码的线性关系,单片机才能查表赋值。
2.2 增益公式 GAIN = 40 × Vg + 20 与 5、7 脚的三种接法
AD603 的增益只跟两个控制脚之间的差值有关,Vg = Vpos − Vneg,与各自对地的绝对电压无关。线性区的经验式是:
G(dB) = 40 × Vg + 20 (-0.5V ≤ Vg ≤ +0.5V)把 Vg 从 −0.5V 扫到 +0.5V,单级纸面增益就从 0dB 走到 40dB。注意这是控制电压到增益的映射关系,实际能取到多少还受 5 脚和 7 脚的接法限制:
| 5 脚与 7 脚 | 增益范围 | −3dB 带宽 | 典型用途 |
|---|---|---|---|
| 断开 | 9~51dB | 9MHz | 大增益、窄带场合 |
| 短接 | −11~+31dB | 90MHz | 宽带、中小增益 |
| 之间串电阻 | 窗口平移 | 介于两者之间 | 定制增益区间 |
这套设计取的是短接(宽带)模式。原因是每级只工作在 20dB 附近,离 31dB 上限还有 11dB 余量,相位裕度大,两级级联后不容易在高频段累积相移而自激;断开模式虽然单级能顶到 51dB,但带宽压到 9MHz,两级串起来在几百 kHz 以上就开始看出群时延带来的波形畸变。做实物时把这一点定下来,后面调自激会省很多事。
增益预算用一段脚本算清楚,别在纸上拍脑袋:
import math vin, vout = 10e-3, 8.0 # 标称输入 10mVrms,目标输出 8Vrms g_total = 20 * math.log10(vout / vin) print(f"总增益需求 {g_total:.1f} dB") # 约 58.1dB,按 60dB 设计留余量 g_pre = 40.0 # 前级两级 AD603 各 20dB print(f"后级固定增益取 {g_total - g_pre:.1f} dB,实做 20dB(10 倍)") for g_stage in (10, 20, 30): # 单级增益 -> 控制电压 -> D/A 码值 vg = (g_stage - 20) / 40 code = round((vg + 0.5) / 1.0 * 1023) # -0.5~+0.5V 映射到 0~1023 print(f"单级 {g_stage:>2}dB -> Vg={vg:+.3f}V, AD7520 码值 {code}")脚本输出里最有用的一行是“单级 20dB → Vg = 0.000V → 码值 512”。这意味着中点码值就是标称工作点,零点漂移一眼能看出来:上电后量 AD603 的 1 脚,只要明显偏离 0V,先查 D/A 的参考和运放偏置,别急着怀疑芯片。参数上还有一条:Vg 的有效区间是 ±0.5V,但实际只用到 −0.5V~0V 这一段覆盖 0~40dB,剩下半段留给 AGC 和校准余量,这是刻意的,不是浪费。
2.3 输入端的射极跟随器:100Ω 输入阻抗必须先抬起来
AD603 的差分输入阻抗只有 100Ω,信号源内阻稍微大一点就是实打实的分压损失,而且前后级的阻抗匹配会变得很难看。常见做法是在最前面加一级射极跟随器,用高频三极管搭,取 β ≈ 150、发射极电阻 Re = 1kΩ,输入阻抗按 Rin ≈ β × Re 估,能到 150kΩ 量级,对前级信号源基本不构成负载。
这里有个血泪经验:β × Re 只是上限估算,实际输入阻抗还要并联基极偏置电阻。如果偏置分压取 10kΩ 和 10kΩ,实际输入阻抗直接掉到 5kΩ 附近,前面那级跟随器就白搭了。稳妥的取值是偏置电阻抬到 100kΩ 以上,或者用自举把偏置网络对交流“抬起来”。另外跟随器本身有约 0.6~0.7V 的直流偏移和 0.95 左右的交流传输系数,做增益预算时要把它算进去,别到最后一测总增益差 0.5dB 找不到原因。
单端输入时还有一个容易忽略的点:运放另一个输入端要和信号输入端做阻抗平衡,否则在共模干扰下会把这部分干扰转成差模信号放大出去。做法是在另一个输入端串一只和信号源内阻等值的电阻到地。
2.4 级间 104 电容:用高通滤波顺手把 50Hz 工频切掉
两级 AD603 之间串一只电容,和下一级的 100Ω 输入阻抗构成一阶高通,转折频率按 f = 1/(2πRC) 算。取 C = 0.1μF(104 磁片)、R = 100Ω:
import math def hpf_c(f_target, r=100.0): return 1 / (2 * math.pi * r * f_target) for f in (15.9e3, 10e3, 3.4e3): print(f"转折 {f/1e3:>4.1f}kHz -> C = {hpf_c(f)*1e6:.3f} μF") print(f"0.1μF + 100Ω 的实际转折: {1/(2*math.pi*100*0.1e-6)/1e3:.1f} kHz")0.1μF 配 100Ω 算出来约 15.9kHz。实做时用频谱看,10kHz 附近就已经掉 3dB 了,比算出来的低——原因是前级跟随器的输出阻抗、PCB 走线电感和 AD603 输入端的寄生电容一起把等效 R 抬大了,转折点自然往低走。这个偏差不是错误,反而是好事:20kHz 以上幅频特性平坦,同时 50Hz 工频和它的低次谐波被压得很干净。如果做的版本低频段要求下探到 1kHz,把电容换到 0.47μF,转折推到 3.4kHz 左右,同时要重新确认级间不会因为容抗变小而引入额外相移。
3. 后级功率级:分立推挽怎么把 8V 有效值顶出来
3.1 集成芯片方案为什么被放弃:AD811 与 HA-2539 的稳定性代价
前级两级 AD603 出来的是电压,摆幅有限,要顶到 8V 有效值(约 11.3V 峰值)必须再加一级功率放大。最省事的想法是找颗高压摆的集成运放,AD811、HA-2539 这类片子输出电压幅度是够的,电路图也简单,照数据手册搭就能出波形。问题出在稳定性上:这类高带宽电流反馈型运放对负载电容极其敏感,PCB 上多几厘米走线、示波器探头挂上去那十几 pF,就足以让它在几百 kHz 处振起来;反馈电阻的取值窗口很窄,换一批片子可能要重新调。
更麻烦的是这类失稳往往不是持续振荡,而是“大信号时才发作”,静态测一切正常,一加输入就出毛刺,排查起来像黑匣子。所以最后走了分立元件自行搭推挽的路子:设计麻烦、调试繁琐,但输入输出阻抗、放大倍数、静态电流全是自己算出来的,电阻电容想换就换,出问题能一层层量下去。
3.2 单电源互补对称输出级:静态工作点必须死磕在 Vcc/2
后级电路图是一个典型的单电源供电互补对称结构。T1、T2 组成前置放大级,T3、T4 组成对称输出级,输出对管选高频孪生对管(B649A 与 D669A 这一对),ft 高,带宽才不会被输出级拖死。输入为 0 时调 R1 的阻值给三极管合适的偏置,使 R9 和 R10 之间的电位落在 Vcc/2;静态输出点必须稳定在这个值,否则正负半周不对称,大信号一来先削一边。
工作点稳定性靠 R9、R10 和 C5 把输出端反馈回 T1、T2 的输入端来保证:R9、R10 采样输出直流电平,C5 对交流呈短路,形成交流负反馈但直流反馈系数为 1,把中点牢牢钉住。闭环电压增益近似为:
A_cl ≈ (R9 + R10) / R10取 R9 = 9.1kΩ、R10 = 1kΩ,A_cl ≈ 10.1,即 20.1dB,正好补上前级剩下的那段增益。这里别用 1 + R9/R10 去套,反馈取自输出端分压点而不是反相输入端,两种写法差一个量级,算错了输出会小一半。
有源负载的频率特性和噪声特性都差,所以电路里用电阻做负载,牺牲一点增益换带宽和噪声。输入阻抗在指标允许的前提下尽量压低,减少空间辐射耦合进来的干扰——这跟前级抬阻抗的做法方向相反,别把两级的思路搞混。
单电源输出必须隔直,耦合电容按下限频率算:
import math def coupling_c(f_min, r_load): return 1 / (2 * math.pi * f_min * r_load) c = coupling_c(20, 50) print(f"20Hz、50Ω 负载需要 C ≥ {c*1e6:.0f} μF,取 1000μF/50V") print(f"1000μF 在 20Hz 的容抗 {1/(2*math.pi*20*1000e-6):.1f}Ω," f"对 50Ω 负载衰减 {20*math.log10(50/math.hypot(50, 1/(2*math.pi*20*1000e-6))):.2f} dB")算下来 20Hz 时容抗约 8Ω,相对 50Ω 负载只带来 0.1dB 左右的衰减,可以接受;如果负载是 600Ω,同样的电容容抗占比更小,反而更宽裕。注意电容耐压要按 Vcc/2 往上留一倍余量,+30V 供电就选 50V 规格。
3.3 电源:LM317T 扩出 +10V 与 +30V 两路非标电压
+5V 给单片机、数码管和锁存器,±15V 给运放,这两路用 7805、7815、7915 这类固定三端稳压就能解决。麻烦的是前级 AD603 要的 +10V 和后级推挽要的 +30V,市面上没有对应的固定输出型号,得用 LM317T 这类可调稳压扩出来。输出电压由两只电阻决定:
Vout = 1.25 × (1 + R2 / R1)R1 取 240Ω,反算 R2:
def lm317_r2(vout, r1=240.0): return r1 * (vout / 1.25 - 1) for v in (10.0, 30.0): print(f"{v:>4.1f}V 输出 -> R2 = {lm317_r2(v):.0f} Ω")+10V 对应 R2 = 1680Ω,+30V 对应 R2 = 5520Ω,都用 1% 金属膜电阻,实际值会有几十毫伏偏差,靠后级标定补掉。ADJ 端对地并一只滤波电容,纹波抑制比能明显改善,前级小信号放大对电源干净程度很敏感,这一只电容不要省。
保护二极管不能漏:输入端意外掉电时,输出电容上的电压会比输入高,电流倒灌进 LM317T 会直接损坏芯片,在输入输出之间反接一只二极管把这条通路短路掉。功耗也要算:输入取 35V、输出 30V、负载电流 150mA,压差 5V 就是 0.75W,TO-220 封装必须加小散热片,别指望裸片扛。
| 输出轨 | 器件 | 主要负载 | 电流预算 | 备注 |
|---|---|---|---|---|
| +5V | LM7805 | ADUC812、数码管、74LS373 | 300mA | 数码管动态扫描时峰值较高 |
| ±15V | LM7815 / LM7915 | 运放、检波电路 | 100mA | 与数字地分开走 |
| +10V | LM317T | 两片 AD603 | 60mA | 每片约 20~30mA |
| +30V | LM317T | 后级推挽 | 200mA | 加散热片,注意压差功耗 |
3.4 前后级增益预算表:把每一段都摊开算
把前面几节的数字合到一张表里,调试时逐段对,哪一段对不上就查哪一段,比整体瞎调快得多:
| 环节 | 电压增益 | 分贝 | 输出摆幅 | 备注 |
|---|---|---|---|---|
| 输入射极跟随器 | 0.95 | −0.4dB | 跟随输入 | β=150,Re=1kΩ |
| AD603 第一级 | 1~10 可调 | 0~20dB | ≤2Vrms | 宽带模式,5、7 脚短接 |
| 级间高通 | ≈1(通带内) | 0dB | — | 0.1μF + 100Ω,转折约 16kHz |
| AD603 第二级 | 1~10 可调 | 0~20dB | ≤2Vrms | 与第一级同 Vg 控制 |
| 后级推挽 | 10.1 | 20.1dB | ≥8Vrms | R9=9.1k,R10=1k |
| 合计 | — | 20~60dB | ≥8Vrms | 输入 10mVrms 时满量程 |
表里“≤2Vrms”这一列是前级的输出上限,AD603 在 +10V 供电下摆幅有限,两级都想吃到 10 倍是不现实的。实际调的时候让第一级吃大部分增益、第二级留小一点,噪声系数更好看;反过来把增益堆在第二级,第一级的噪声会被一起放大,输出本底明显变差。
4. 数字控制与有效值显示:ADUC812 那一侧怎么接
4.1 内置 D/A 为什么被弃用:控制电压纹波会直接变成输出噪声
ADUC812 片内自带 D/A,最省事的做法是直接用它产生 AD603 的增益控制电压。实际一试就翻车:输出纹波大且不好滤,因为片内 D/A 和数字电路共地,数码管动态扫描的开关电流全耦合进来。这个纹波加在 AD603 的增益控制脚上,等于对信号做幅度调制,输出端听到的是“沙沙”的本底,示波器上能看到包络随扫描频率起伏。
控制电压这条路对纹波的要求比一般偏置严得多:增益对 Vg 的斜率是 40dB/V,也就是 1mV 的控制电压波动对应 0.04dB 的增益抖动,看着不大,但两级级联再乘以后级 10 倍增益,输出幅度抖动就到了能听出来的程度。所以改成外置方案:电阻网络 D/A 负责产生基准电压,两级运放做 I/V 转换和电平搬移,中间加 RC 滤波。多花几颗件,换的是输出本底的干净程度。
4.2 AD7520 加 74LS373:控制电压链路与 −0.5~+0.5V 的电平搬移
链路是这样的:单片机 → 74LS373 锁存 → AD7520 → 第一级运放做 I/V 转换 → 第二级运放做电平搬移和缩放 → 送到两片 AD603 的 1 脚。AD7520 本身没有锁存器,数据总线上必须挂 373 保持,否则写别的端口时 D/A 输出会跟着乱跳。
第一级把 AD7520 的电流输出转成电压:Vout1 = −Vref × D / 1024,取 Vref = +2.5V,则 D 从 0 到 1023 对应 Vout1 从 0 到 −2.5V。第二级要做的是把 0~−2.5V 映射到 −0.5~+0.5V,斜率是 −0.4,截距 −0.5V。用反相求和放大实现:
Vout2 = −(0.4 × Vout1 + 0.5) 取 Rf = 10kΩ,Vout1 支路 R1 = 25kΩ,+2.5V 基准支路 R2 = 50kΩ对着算一遍:D=0 时 Vout1=0,Vout2=−0.5V;D=1023 时 Vout1=−2.5V,Vout2=+0.5V。两端都对得上,中间线性。写进单片机的就是下面这段:
#include <REG812.H> sbit LE = P3^0; /* 74LS373 锁存使能 */ #define DAC_BUS P0 /* AD7520 是 10 位并行输入,低 8 位走 P0 经 373 锁存,高 2 位走 P2.0/P2.1 <p> <a href="https://download.csdn.net/download/w516780018/3090763" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>