基于RP2040 Raspberry-pi-Pico实现的极简任意波形发生器设计方案

描述

  在这个项目里,我大约花了60欧元(合计410人民币)构建了这个带有简单用户界面的任意波形发生器工具 (AWG)。

  用户可以选择基本波形,设置频率、幅度、偏移和其他一些参数。

  基本规格:

  频率范围:20Hz - 15MHz 正弦波(并非所有波形都能很好地工作到 15MHz)

  DAC 分辨率 8 位或 10 位

  用于 AC/DC 耦合和输出电阻的输出开关 Zout low/50Ohm

  输出电压 6Vpp 无负载,2.8Vpp 带 Zout 开关至 50Ohm 和 50 Ohm 终端

  波形:正弦波、脉冲(锯齿波、三角波、方波)、高斯、sinc、指数、噪声(全部重复使用 rgco 的软件)

  我在一个 6.5 厘米 x 13 厘米的带有铜条纹的原型板上构建。

  在这个教程中,我将专注于如何构建一个独立的 AWG,如果您按照说明构建自己的 AWG 工具,您应该具备一些手工焊接电子元件的基本技能。如果需要调试,使用(简单)示波器很方便。我建议你在他的 github 网站上阅读 rgco 的教程和 Peter Hinch 的自述文件。

  补给品

  

AWG

  构建 AWG 的主要部分是:

  1 个树莓派 Pico 板

  1 2.8“ 彩色 LCD TFT 显示屏,带 SPI 接口

  19 个精密电阻器 10x 2k .1% 和 9 x 1k .1%

  1 AD8055(300MHz电压反馈放大器)

  NTE2633和NTE2634晶体管各1个。作为替代方案,我测试了 2N2219 和 2N2905 晶体管,它们也运行良好。频率上限为~5MHz

  2个晶体管散热器

  1 个 79L05 和 78L05 稳压器为 AD8055 供电

  +-12V 电源

  1 6.5cm x 13cm 原型板

  用于连接显示器、开关和编码器的面包板线

  还有一些小零件电阻、电容、排针、电线……

  请参阅随附的所有电子元件材料清单。

  我正在使用通孔组件,因为它们更容易焊接,而且大部分都在我的“组件库存”中。最终,我选择将所有部件放在一个漂亮的外壳中。

  关于电源的备注:我开始使用Meanwell 5V,+-12V开关电源,只是为了得知发电机的信号被电源的开关噪声严重失真。我最终使用 2x15V 变压器构建了一个简单的线性电源,两个桥式整流器带有两个 1000uF 电解电容器和稳压器 7812,7912(输出缓冲器为 +-12V)和 Pico 的 L7805CV。我在所有三个稳压器上都放了一个散热器。

  第 1 步:概念概述

  

AWG

  AWG 由三个主要功能块组成:

  用户界面,选择波形并可以输入/调整波形的所有参数。选择波形时,将相应的参数设置为默认值。

  AWG 内核,用于计算波形样本并将其存储在内存中。使用 RP2040 的 PIO 和 DMA 功能从内存开始输出波形。

  输出缓冲级,其中信号被放大 2 倍,AB 类输出级将提供低输出阻抗和短路保护。通过开关,输出阻抗可以在低阻抗和 50 欧姆之间切换,也可以选择交流或直流耦合。对于低频,建议使用直流耦合。

  用户界面和 AWG 内核在运行于 Pico 的 RP2040 CPU 上的 micro-python 中实现。

  备注:我正在使用 RP2040 的两个内核进行实验,一个用于生成器,一个用于用户界面。这工作正常,但没有优势。所以,为了简单起见,我决定在一个内核上运行整个程序。(AWG_overview.pdf)

  第 2 步:构建硬件

  

AWG

  

AWG

  在示意图中,您可以找到被“蓝框”包围的三个功能块。使用 AWG 的 8 位或 10 位版本的原理图来构建您自己的。

  所有部件都焊接到原型板上。按照示意图从左到右。确保有一个中央接地点,将电源的接地线连接到 Pico 板的接地引脚、两个稳压器和输出连接器。我在开始时创建了接地回路,这会在输出信号上产生额外的噪声。

  注意事项:

  如果您不需要输出缓冲级的全部 20MHz 带宽,请将 Q1 和 Q2 替换为 2N2219 和 2N2905。这些晶体管更便宜并且具有更好的可用性。测试显示带宽上限约为 5MHz。还要为这些晶体管添加散热器。

  如果您不需要低输出阻抗,您可以简化输出级,只使用 AD8055。取 R6 之后的信号(参见示意图中的“TP 1”)。然后,AWG 可以将负载驱动至约 50 欧姆。

  相关附件下载:

  AD8055.pdf

  AWG10bit_schematics.pdf

  AWG8bit_schematics.pdf

  第 3 步:安装软件包

  

AWG

  

AWG

  AWG 是使用 micro-python 实现的。作为第一步,请将micropython加载到 Pico。使用版本 1.17 ( rp2-pico-20210902-v1.17.uf2 ) 或更新版本。旧版本无法使用,因为它们缺少 micro-gui 所需的功能。

  本教程假设您对如何使用 Pico 板、将 micro-python 和 python 模块加载到 Pico 有一些基本知识。如果您需要帮助,请在raspberry pi pico 上找到开始使用 micropython的分步指南。

  由于我无法在此处附加档案或压缩文件,请安装以下软件包:

  1. 安装micro-gui。如果您使用的是 Linux,请创建一个项目目录并使用 git 将 micro-gui 复制到项目目录。例如:git clone https://github.com/peterhinch/micropython-micro-gui。

  使用 mpfshell、rshell 或您喜欢的 micropython IDE 将 micro-gui 模块复制到 Pico。

  如果您使用的是 Windows,请访问micro-gui github站点,单击“代码”按钮并下载 zip 文件(见图)。您可以使用您喜欢的工具将文件下载到 Pico。

  2. 安装硬件驱动程序。将 AWG 驱动程序文件复制到 Pico:

  hardware_setup.py - 复制到根目录,包含按钮、编码器和显示驱动程序的信息

  colors.py - 替换原始模块,因为 AWG 使用更多颜色,将附件复制到 Pico 上的 gui/core 目录

  3. 安装 AWG 文件:

  8 位和 10 位版本的 AWG 文件不同。由于我无法附加包裹,因此我将包裹分成了这个教程的两个步骤。

  从第 8 步下载 8 位版本的软件

  从第 9 步下载 10 位版本的软件

  然后将文件复制到 pico。10 位版本的文件名显示在下面的文本中的括号 [ ] 中。

  ui.py [ui10.py] - 复制到根目录,这是AWG主程序

  wave_gen.py [wave_gen10.py] - 复制到根目录,该模块计算波形并对 Pico 的 PIO 和 DMA 进行编程

  main.py - 复制到根目录,启动后调用模块,导入 ui.py [ui10.py] 启动 AWG

  我添加了一张图片来显示 Pico 上文件和目录结构的图形表示。图片仅显示 AWG 所需的文件。如果您将 micro-gui 作为一个整体下载,您将获得更多文件,例如 micro-gui 的演示或其他字体,这些文件不被 AWG 使用。您可以只复制所需的文件,如图所示。

  备注:我已经清理了这个教程,只附上了最新版本的文件。如果您已经构建了 AWG,建议您升级到具有 8 位 DAC 或 10 位 DAC 的版本的最新版本。

  代码下载:

  hardware_setup.py

  颜色.py

  第 4 步:AWG 的核心

  python 模块wave_gen.py [wave_gen10.py] 包含用于计算波形和对 Pico 的 PIO 和 DMA 进行编程的代码。我重用了 Rgco 创建的代码。附加的模块支持六种基本波形。AWG 可以做更多事情,例如将两个波相加或相乘,如果您需要更多功能,请参阅Rcgo 的教程。

  对原代码的改动:

  代码有两种版本,一种用于 8 位 DAC,一种用于 10 位 DAC。

  Pico 超频了,CPU 运行在 250MHz 而不是 125MHz

  我正在使用 DMA 通道 2 和 3 而不是 0 和 1。DMA 通道 0 和 1 由其他功能使用,例如 TFT 显示器的 SPI 接口

  在测试时,我观察到“内存不足错误”,因此我在计算完成后调用垃圾收集器 (gc) 模块并填充波缓冲区以释放未使用但仍分配的内存。

  备注:Pico 的 CPU 和 USB 连接在 250MHz 下运行非常可靠

  第 5 步:用户界面

  

AWG

  用户界面 (UI) 由两个按钮、一个带按钮的旋转编码器、2.8” TFT 显示器和 python 模块ui.py [ui10.py] 组成。该模块定义了屏幕布局和 AWG 控件。在简而言之,当按下按钮或旋转编码器时会发生什么。在以下 UI 元素中以斜体字母显示,例如setup指向屏幕上的设置按钮。您可以在下一步。

  用户界面原则:

  所有用户输入都被收集并存储在一个名为“wave”的字典中。按下设置生成器按钮后,模块 wave_gen [wave_gen10] 使用存储在字典中的数据来计算和输出波形。

  AWG 在屏幕上显示其当前状态。状态是以下之一——初始化——、计算波、运行或停止。每个状态都非常自我解释,并在模块 ui.py [ui10.py] 中进行了简要描述。

  UI 允许通过功能下拉菜单选择波形。When a wave is selected the parameters of the wave are set to default values, which are “mid points” of the parameters. 如果您使用默认值按下设置生成器按钮,您会得到一个工作正常的波形。通常,您希望根据需要调整频率。

  如果您选择不同的波形,频率不会改变,但所有其他参数都设置为默认值。

  在 UI 中,只有与所选波形相关的参数处于活动状态并且可以更改。不需要的参数是“灰色的”。

  显示使用的样本数和波形的结果输出频率。

  备注:AWG 是一种数字波发生器。这意味着例如频率、幅度和偏移量会逐步变化,这会导致一些限制:

  输出频率可能会偏离 UI 中设置的频率,例如,如果设置频率“介于”两个数字频率步长之间。

  第 6 步:AWG 快速参考指南

  

AWG

  用户界面硬件由硬件中的两个按钮和一个旋转编码器组成。AWG 控件和设置/停止发生器按钮在 UI 软件中实现。

  Next按钮将焦点移动到下一个控件,该控件变为活动状态。焦点由白色边框表示。例如,在图片中,您可以看到具有焦点的功能下拉列表。

  上一个按钮将焦点移回上一个控件。

  旋转编码器必须起作用。(a) 按下编码器作为输入按钮, (b) 转动编码器增加或减少一个值或在下拉列表中上下移动。

  有关详细信息,请参阅随附的快速参考指南。

  备注:如果输出信号被削波或失真,请尝试调整幅度、偏移或参数。这样做通常会减少削波或失真。微调参数以优化输出,例如对于脉冲:不要将上升和下降时间设置为 0,而是将其设置为较小的值,例如 0.05。这通过限制压摆率来减少信号的过冲。

  第 7 步:限制和改进

  

AWG

  AWG 的设计易于使用、易于复制和低成本。

  实施了六个基本波。如果 Pico 板连接到 PC 上,基本上任何波形都可以通过在模块 wave_gen.py 中添加波形的公式来产生。如果波形应该在 AWG 中持久存在,请将波形名称和控件添加到 ui.py 模块。

  AWG 的输出级是基本的 AB 类设计。它经过短路验证并提供 6V pp 摆幅。可以添加一个输出滤波器来降低较高频率的数字噪声。

  为 AWG 10 位实施了包围。根据要求可以移植到 AWG 8 位。

  在最近的软件中,显示更新(SPI 接口)在 AWG 启动时会关闭。这显着降低了输出信号上的数字噪声(见图)。在原型板上构建或进行 PCB 布局时,请注意避免走线或电缆之间的串扰,从而进一步降低噪声。

  为了进一步降低噪音,使用两个 Pico 板也可以降低输出噪音。一个用于发生器的 Pico 板和一个用于用户界面的 Pico 板,将它们与例如串行接口连接。非常欢迎任何改进和评论。

  第 8 步:用于 AWG 的软件,带有 8 位 DAC

  附上使用 8 位 DAC实现 AWG 时要上传到 Pico 的三个文件。(参见第 3 步)

  在停止生成器时保留参数值,而不是每次都初始化它们。

  sinc 和指数参数现在被“括起来”,因此它们无法设置为导致波形不可用的值。

  ui.py

  wave_gen.py

  主文件

  第 9 步:带 10 位 DAC 的 AWG

  附上使用 10 位 DAC实现 AWG 时要上传到 Pico 的三个文件。(参见第 3 步)

  一些用户要求在停止生成器时保留参数值,而不是初始化它们。

  sinc 和指数参数现在被“括起来”,因此它们无法设置为导致波形不可用的值。

  ui10.py

  wave_gen10.py

  主文件

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分