初学者的DDS信号发生器

Lobsters Hottest 工具

摘要

详细指南,介绍如何构建一个低成本、多功能的直接数字合成(DDS)信号发生器,具有正弦波、方波、三角波、锯齿波等功能,并支持频率、幅度、占空比和调制调节。

<p><a href="https://lobste.rs/s/yq1t6f/baby_s_first_dds_signal_generator">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/05/23 14:46

# 宝宝的第一台DDS信号发生器 来源:https://tomscii.sig7.se/2026/05/Babys-First-DDS-Signal-Generator 电子实验室最核心的仪器包括:一台电源(https://tomscii.sig7.se/2024/04/300W-Linear-DualTracking-Lab-PSU)、一台示波器,以及一台信号发生器。在拥有前两者后,我决定尝试制作第三件。本文介绍一款基于DDS(直接数字合成)架构的原创设计——成本极低、功能多样且精准的基带信号发生器。 [](https://tomscii.sig7.se/images/dds-vfo/dds-vfo.jpg) *完成后的仪器。点击查看高分辨率版本(https://tomscii.sig7.se/images/dds-vfo/dds-vfo.jpg)[775 kB JPG]* ## 功能特性 - 卓越的频率和幅度稳定性。 - 可生成波形:正弦波、方波、三角波和锯齿波。 - 输出频率:0.1 Hz 至 1 MHz;可设置,分辨率 0.1 Hz。 - 输出阻抗:50Ω。 - 输出幅度:空载时 10 mVpp 至 20 Vpp;接入 50Ω 负载时减半(即最高 10 Vpp 或 24 dBm)。可设置,分辨率 10 mV。 - 方波和三角波的占空比:0 至 100%,分辨率 0.1%。 - 为生成非对称波形,可将正半周和/或负半周限制在 0 至 100%(满量程输出)之间任意电平,分辨率 0.1%。三种限制模式决定波形限制/缩放方式:饱和、半量程、满量程(后续说明)。 - 3.5mm 音频插孔(输入阻抗 1MΩ),带电平电位器,用于 AM 调制输入。 - 数字 ASK 调制,用于生成 DCF77 时间码信号。 - 直观用户界面:大尺寸 LCD、四个按钮和一个旋转编码器旋钮。 - UART 接口,用于远程控制、开发与调试。 ## 设计概述 DDS(https://en.wikipedia.org/wiki/Direct_digital_synthesis),即直接数字合成,是一种利用单一稳定时钟生成波形(原则上可以是任意波形)的方法,具有高频率分辨率和稳定性。其基本原理如下: 1. 将所需波形的一个完整周期采样值存储在存储器中; 2. 根据瞬时相位,周期性地从该数组中输出一个采样值至 DAC,从而获得模拟信号; 3. 每次采样后,按当前频率成比例地增加相位。 由于我们的需求远不止生成一个用户指定频率、固定幅度的正弦波,我们需要一个灵活、可编程的解决方案——这只有嵌入式系统才能提供。否则,我们只需使用 AD9850 这类芯片即可。首先,我们需要直接控制采样值(因为我们要支持多种波形,并能通过半周限制生成非对称信号)。一旦这些任务以及常规接口功能由 MCU 平台承担,专用 DDS 芯片的吸引力就不大了。诚然,专用芯片能生成数十甚至数百 MHz 的信号,但对于我们的第一台(入门级)信号发生器而言,“基带”或“扩展音频范围”的能力已经足够实验应用。另一方面,我们需要强劲的驱动能力,以支持较高的输出电平:10Vpp 输出至 50Ω(24 dBm)无论如何都需要专门的输出级。 因此,我们的设计挑战是:仅使用廉价、常见的部件,不使用任何复杂 IC 来实现全部功能……让我们看看能走多远? ## 完整电路 完整原理图以 PDF 格式提供(https://git.hq.sig7.se/dds-vfo.git/blob_plain/HEAD:/doc/schematic.pdf)。建议您在新窗口中打开,将其移至一旁,边阅读边参考。 下面我将详细介绍模拟信号路径,但首先列出主要功能模块及其核心组件: - 所有计算任务(DDS 核心至 DAC;状态维护;用户界面操作)由 Raspberry Pi Pico 板承担,其 RP2040 处理器运行我们的程序。DDS 以 8 MHz 时钟频率运行;输出采样值至 DAC 的代码在第二个核心上独立运行,采用紧循环。 - 128x64 像素单色图形 LCD 由 16 位寄存器(两个 74HC595 芯片)驱动,通过 SPI 馈送数据,并配有独立选通信号触发加载。 - 输入开关带有低通 RC 滤波器,用于硬件去抖。 - 我们使用 DAC0800(https://git.hq.sig7.se/dds-vfo.git/blob_plain/HEAD:/doc/contrib/DAC0800.pdf),这是一款常见的 8 位快速(并行)乘法 DAC,用于将 Pico 输出的 8 位数据位转换为模拟信号(此处为电流)。作为乘法 DAC,它通过参考电压(根据模拟输入或 ASK 数字调制引脚进行调制)实现幅度调制。 - 模拟信号由基于 DG408(https://git.hq.sig7.se/dds-vfo.git/blob_plain/HEAD:/doc/contrib/DG408.pdf)模拟开关的衰减器处理,提供 6 dB 步进的衰减,范围从 0 dB 至(标称) -42 dB。 - DAC 幅度由 Pico 的 PWM 输出经低通滤波后产生的模拟电平精确设定;该 12 位值用于在衰减器当前步进内微调幅度。通过协同使用衰减器和电平调整,可以在理想参考电流水平下操作 DAC,同时允许宽范围的输出幅度。这也便于应用校准数据来补偿频率相关行为。 - 互补晶体管级以低阻抗驱动输出。 - 电路由板载电源供电,该电源接受市电变压器的次级绕组,为模拟电路提供 ±15V,并为 Pico 板提供 +5V。 让我们仔细审视该电路的模拟部分。 ### 主模拟路径:从 DAC 到输出 [](https://tomscii.sig7.se/images/dds-vfo/sch-analog1.png) *从 DAC 到输出:总览(点击放大)* 上图是我们 DDS 的核心:从 DAC 到仪器输出的信号路径。从左至右:DAC、衰减器和功率放大器。前两个级联由 JFET 跟随器缓冲,以避免加载高阻抗信号。我们逐步分析。 模拟信号源自 DAC0800(https://git.hq.sig7.se/dds-vfo.git/blob_plain/HEAD:/doc/contrib/DAC0800.pdf),接收来自 Pico 的八位数据线 DAC[7..0]。注意,这是一个电流输出 DAC。电阻 R13 至 R16 根据 VREF 电压设定参考电流,并将输出电流转换为双极性电压 DAC_OUT。例如,若 VREF 高于地 10V,则 8 位范围内的值将转换为 DAC_OUT 上的 ±10V。 由于 DAC_OUT 处于高阻抗状态(该节点额外流入/流出的电流会改变其电压,从而引入误差),我们需要一个缓冲器将此电压传递至衰减器输入 ATT_IN。我们可以使用运算放大器,但需要何种运放?我们需要能够生成 20Vpp 信号,频率高达 1 MHz。这对应约 63V/μs 的压摆率,因此需要相当高端的运放!请记住:本设计不使用昂贵器件! 因此,我们采用简单的 JFET 跟随器。由于我们需要极高的输入阻抗但无需电压增益,它很适合这一需求。它完全能轻松应对此类压摆率。理想情况下,两个 JFET 应为同一集成双 JFET 器件的一部分,以最小化制造差异并确保热耦合。但同样,不使用昂贵器件!我们将在讨论构造时展示“穷人版双 JFET”解决方案。 微调电位器确保我们能够设定 Q1 不引入直流偏置的精确工作漏极电流。这是一次设定、永久使用的调节,主要归因于上述器件选择上的折衷。我们不想累积直流偏置,因为整个信号路径是直流耦合的(否则我们不得不限制最低频率)。 整个信号路径中没有增益,因为 DAC 本身能够产生 20Vpp 的最大幅度信号。然而,要生成更小的信号,我们不能随意降低 VREF——如果将参考电流降得太低,DAC 输出质量会变差。 解决方案是让 DAC 在健康的参考电流范围内工作,并使用可切换衰减器来达到较低的输出幅度。我们的方案是采用 0.1%(精密)电阻搭建的经典 R-2R 梯形网络,其抽头馈入 DG408(https://git.hq.sig7.se/dds-vfo.git/blob_plain/HEAD:/doc/contrib/DG408.pdf)模拟开关。每个抽头从上至下理论上将信号减半(-6 dB)。(实际上,这是频率相关的,因为分压器既有电阻性也有电容性,更不用说开关电容了。后续会详述。)Pico 输出 3 位选择信号 ATT_A[2..0] 以设定要使用的输入抽头。 由于所选抽头处于高阻抗,我们在开关输出端挂接相同类型的 JFET 跟随器电路,将电压缓冲至衰减器输出 ATT_OUT。 该信号驱动功率放大器级,由廉价常见的双极型晶体管构成。这是一个基本的推挽射极跟随器,但输出晶体管采用了略显奇特且有利的 Sziklai 对(https://en.wikipedia.org/wiki/Sziklai_pair)配置。 输出阻抗非常接近 50Ω,由 R48/R49 和 R50(总计 49Ω)加上 Q7/Q8 从集电极看入的输出阻抗(零点几欧姆)构成。 ### 电平控制与调制电路 还记得设定 DAC 参考电流(进而影响生成信号幅度)的 VREF 吗?它正是另一条模拟信号路径的输出: [](https://tomscii.sig7.se/images/dds-vfo/sch-analog2.png) *电平控制与调制电路(点击放大)* Pico 的 PWM 输出由 12 位值(0..4095)驱动,用于设定信号电平。该输出连接到 AMP_PWM 信号,经过 R12 和 C4 低通滤波后,在 U2A 的同相输入端产生 0 至 3.3V 的直流电压,该运放将其放大 5 倍,覆盖 0 至 VCC 的整个范围。 与此同时,U2B 缓冲来自 1 MΩ 电平电位器的模拟输入,该电位器控制模拟输入信号;或者,若模拟输入未插接,则控制来自 Pico 的 MOD_ASK 数字输入。(有一个跳线可禁用 MOD_ASK 输入,将其接地。)值得注意的是,该信号路径也是直流耦合的,因此输入插孔也可接收数字信号(或直流电压)来控制幅度。 电平控制与调制源由 U3 精确求和,得到 VREF。由于带宽要求适中,我们采用经典 TL072(但根据 TL072HIDR 的承诺,采用最新工艺制造),并配以精密电阻。 ## PCB 设计、制造与组装 上述电路设计是通过在无焊面包板上大量实验得出的。当拥有一个功能已验证、所有特性均能工作的原型后(照片(https://tomscii.sig7.se/images/dds-vfo/breadboard.jpg)[1.3 MB JPG]),就进入了下一阶段:PCB 设计。 首先,我必须确定仪器外壳,因为我希望 PCB 能完美适配最终选择的机箱。这成为一个迭代过程,考虑并放弃了一些备选方案。最终,我选定了一个透明蓝色盒子,它看起来*可能*容纳下市电变压器、主 PCB 以及所有其他部件(主要担忧是体积庞大的 LCD 面板),前提是 PCB 设计得当…… 经过数次迭代,我将设计压缩至 127 x 72 mm 的空间内——这是根据机箱内部在市电变压器旁剩余的空间精确测量得出的。为节省板面积并提升性能,我尽可能采用了 0805 封装的 SMD 无源器件和 SOIC 封装的芯片。按照我目前 PCB 设计的惯例,信号线仍使用 8 mil 线宽,对于低阻抗走线和电源轨则升级至 15 mil 和 40 mil。 [](https://tomscii.sig7.se/images/dds-vfo/pcb-layout.png) *PCB 布局,使用 KiCAD 9 设计。点击查看高分辨率版本(https://tomscii.sig7.se/images/dds-vfo/pcb-layout.png)[652 kB PNG]* 来自 Pico 的快速数字信号(8 位 DAC 总线和 3 位衰减器信号)通过*后端端接*处理——在走线的驱动端直接插入 140Ω 电阻,以最小化对模拟电路的干扰。(这也称为*串联端接*。)电阻值来自此阻抗计算器(https://www.pcbway.com/pcb_prototype/impedance_calculator.html),输入参数为:8 mil 线宽、35 μm 铜厚、1.6 mm 板厚,以及最佳猜测的 εr 值 4.4。 后端端接的原理是:让高阻抗(开路)接收端反射入射信号,然后在信号到达源端时吸收该反射。接收端看到的是完整信号,无反射。驱动端看到的负载是线路阻抗的两倍,但仅持续往返时间,之后负载变为开路。 *穷人版双 JFET* 作为设计中的一个巧妙之处,请注意 JFET 对 Q1-Q2 和 Q3-Q4,它们在 PCB 上背靠背放置,TO-92 封装的平面侧相对。这就是我们所说的“穷人版双 JFET”,通过热缩管将两个器件捆绑在一起,形成一个热耦合单元。(我们也可以使用这些器件的 SMD 版本,但那样就无法制作这种双 JFET 了。) PCB 由 PCBWay(https://www.pcbway.com/)制造,这是一家领先的中国工厂。他们强烈鼓励客户在订购时上传压缩成包的常规 Gerber(以及钻孔)文件,而不是直接处理 EDA 工具的项目文件。幸运的是,他们为获取此类输出提供了详细清晰的说明,例如针对 KiCAD 9(我当前的 EDA 工具)的此操作指南页面(https://www.pcbway.com/helpcenter/generate_gerber/How_to_Export_Gerber__BOM__and_Pick_and_Place_Files_in_KiCad_9_0.html),因此并不麻烦。每次上传都会由 PCBWay 工程师检查,确保数据完整且从制造角度看合理。此审查仅需几分钟,之后客户即可完成订单。 下单后,观察制造过程经历约 15 个步骤很有趣,每个步骤都通过展示工厂设施(https://www.pcbway.com/pcb-service.html)的精短视频进行了定义和解释。然后……我的板子就做好了!PCBWay 的正常交期低于 48 小时(即*无需*为加急订单支付额外费用)。无需像其他一些制造商那样等待一周左右,只为让您的设计适应他们的下一批次。 我还通过 DHL Express 以创纪录的速度收到了板子。这是我经历的 PCB 工厂周转最快的一次:4 月 23 日早上下单(中国已是下午),4 月 25 日(周六)制造完成,4 月 27 日(周一)下午我就拿到了板子。 一叠 PCB 和 SMD 钢网都专业地包装在盒子里:前者放入带有干燥剂的真空防静电袋,后者固定在两块压制的硬纸板之间。好奇者可查看此照片(https://tomscii.sig7.se/images/dds-vfo/pcbway-delivery.jpg)[1.2 MB JPG],展示已拆封的 PCBWay 包裹。 关于 PCB 服务的最后说明: - 我勾选了指定 PCBWay 生产编号位置的选项,并在板上放置了占位文本“

相似文章

一款更精美的电压表时钟

Hacker News Top

一份详细指南,介绍如何制作具有自定义贴花、CNC加工外壳和连续运动指针的模拟电压表时钟。

突破音乐供应的约束

Reddit r/LocalLLaMA

作者描述了取消音乐订阅,并使用DGX Spark、Plex和Ace-Step 1.5 XL模型构建了一个自托管的AI音乐生成系统,创造了无限的个性化音乐供应。

基于RP2040/RP2350的DIY开源超声硬件

Hacker News Top

pic0rick是一款基于RP2040/RP2350微控制器的开源超声采集板,为DIY超声成像提供了一种低成本的替代方案,替代基于FPGA的设计。

构建 TD4 4 位 CPU

Hacker News Top

本文详细介绍了基于《如何构建 CPU》一书及开源 PCB 设计,亲自动手组装并测试 TD4 4 位 CPU 的过程。