电子工程师调试电路时,信号发生器是必备工具之一。需要给放大器送一个干净的正弦波看增益够不够、给滤波器送测试信号看截止频率、给ADC送已知信号看采样精度……一个好的信号发生器能省很多事。今天就从零开始讲正弦信号发生器的几种实现方案,从简单的LC振荡到DDS芯片,甚至自己DIY一个低成本信号源。
正弦信号发生器的核心需求就三个:频率稳定、波形干净(谐波小)、频率可调。下面按实现原理从老到新讲四种方案。
方案一:LC振荡电路(正弦波振荡器)。这是最传统的方案,用LC回路的选频特性和晶体管/运放的放大能力构成正反馈振荡。典型的文氏桥振荡器(Wien Bridge Oscillator):运放的同相输入端接一个RC选频网络(电阻电容串联和并联),反馈回路接一个非线性元件(比如灯泡或者二极管+电位器)来稳定振幅。文氏桥振荡器频率公式 f = 1/(2πRC),改变R或C就能调频率,一般能做1Hz-1MHz范围。优点:电路简单、波形干净(如果电阻电容配对好的话,THD总谐波失真可以低于0.01%)、成本低。缺点:频率覆盖范围有限、用模拟器件温度漂移大、频率调节精度不够。适合做固定频率或者窄范围可调的信号源。
方案二:压控振荡器VCO。用变容二极管的结电容随偏置电压变化的特性,把变容二极管接入LC回路,调偏置电压就能改变振荡频率。VCO是锁相环PLL的核心部件,也广泛用于射频电路中。优点:频率可以用电压或数字控制,方便做成自动频率调节系统。缺点:相位噪声比LC振荡稍大、温度系数也需要额外补偿。现在信号发生器里纯用VCO的不多了,基本被DDS取代。
方案三:DDS直接数字频率合成(Direct Digital Synthesis)。这是现在信号发生器的主流方案。DDS的原理特别精巧:用一个高速时钟驱动相位累加器(32位的话就是2^32=4294967296个相位点),相位值作为地址去查正弦ROM表(存了每个相位对应的正弦值),ROM输出的数字量经DAC转换后变成模拟波形,再通过低通滤波器滤掉DAC的采样毛刺。频率控制字决定了相位累加器每次累加的步进值,步进值越大,一个周期内经过的相位点越少,频率越高。频率分辨率 = 系统时钟 / 2^N(N是相位累加器位宽),一个50MHz时钟的32位DDS,频率分辨率约为0.0116mHz——这精度简直逆天。DDS的频率切换速度也是纳秒级,适合需要快速跳频的应用。
最常用的DDS芯片是Analog Devices的AD9850(300MSPS,10位DAC)和AD9833(25MSPS,10位DAC,更便宜更简单)。AD9850有40脚,支持并行和串行控制;AD9833只有10脚,通过SPI接口控制,外围电路极简,适合新手入门。AD9850的引脚接线:FWORD0-4是频率调谐字、PWORD0-4是相位调谐字、WCLK是写时钟、FQ_UD是频率更新、RESET是复位。用单片机控制AD9850,通过并行口送频率控制字,就能输出0到最高Nyquist频率(系统时钟的一半)的正弦波。
方案四:用FPGA自己搭DDS。如果你有FPGA开发板,完全可以自己用Verilog写DDS模块。核心就三部分:相位累加器(计数器+加法器)、正弦查表ROM(可以用MATLAB生成正弦值存进去)、DAC控制逻辑。FPGA内部的RAM就能当ROM用,查表速度极快。DAC如果板上没有,可以外接一个AD9708或者DAC0808,FPGA输出8位数字信号给DAC,DAC输出接运放做缓冲+滤波+电平偏移。
想自己DIY一个低成本信号发生器?推荐组合:STM32F103C8T6(开发板几十块)+ AD9833芯片(几块钱)+ 一个1602液晶屏(几块钱)+ 几个按键。总成本不到50块。接线:AD9833的SDI→STM32的MOSI、SCLK→SCK、SYNC→CS、RESET→GPIO。STM32通过SPI给AD9833送频率控制寄存器(FREQREG)和相位控制寄存器(PHEREG)的值。频率控制字计算公式:FREQREG = (目标频率 / 系统时钟) × 2^28(AD9833内部时钟默认25MHz,28位相位累加器)。比如要生成10kHz正弦波:FREQREG = 10000 / 25000000 × 268435456 ≈ 107374。注意:AD9833输出的是单极性0-3.3V信号,要得到双极性正负电压的波形,需要接一个运放电路做电平偏移(把0-3.3V的中点1.65V作为静态工作点,交流分量叠加在上面)。
关于波形质量。无论哪种方案,输出端都要加低通滤波器——LC方案本身就是带通,DDS方案输出端要加截止频率在期望最高频率以上的低通,滤掉DAC的采样高频分量。滤波器类型看用途:二阶RC滤波器简单但衰减慢,有源滤波器(如Sallen-Key多反馈)Q值可控,LC滤波器衰减好但调电感麻烦。如果对THD要求很高(比如音频测试、精密测量),还要注意电阻电容的选型:金属膜电阻、C0G或NP0电容、运放选低谐波失真的型号(如OPA2604、LM4562)。
方案对比总结。LC振荡:便宜、THD好,但频率调节不便、温度漂移大,适合固定频率。VCO:能被电压控制频率,但相位噪声稍大。DDS:频率精度高、切换速度快、能输出任意波形(ROM里存什么输出什么),但DAC有限、高频时THD稍差。现在主流信号发生器用的基本都是DDS或者DDS+VCO混频的组合(低频用DDS直接输出,高频用DDS低频信号混频上变频)。
如果你只是日常调试用,淘宝上100多块钱的"函数信号发生器"(其实就是DDS+单片机方案)完全够用。如果想做项目练手,AD9833+STM32是最好的入门组合,成本低、代码量小、外围电路简单。如果需要射频级别的信号源(GHz以上),就得上专门的射频DDS芯片或者VCO+PLL方案了。