Skip to content
EERNINUOPublic

About

ArbWave30 – 30MHz 任意波形发生器 | FPGA + 高速DAC | SCPI 可控

Topics

Resources

Stars

50 stars

Watchers

1 watching

Forks

Latest commit

 

History

276 Commits

Folders and files

Repository files navigation

ArbWave30

30MHz 任意波形发生器 | FPGA + 高速DAC | SCPI 可控

仓库状态 GitHub 仓库星标 GitHub 仓库分支
许可证 许可证 许可证


⚠️ 注意:你当前查看的是 develop 开发分支,内容可能不稳定。 推荐使用稳定发布版本:查看 Releases

⚠️ 更新状态

作者正在参与《0854 不相信眼泪》,本项目暂停更新,承诺 2026.12.25 恢复更新并发布第一个 Release。(你问我为什么不是 20 号就更新?好不容易解放了我不得爽玩几天)

✨ 特性

硬件指标(V1.0)

  • 波形:正弦、方波、三角波、噪声波、直流
  • 正弦波最高 30MHz,方波最高 5MHz
  • 电压范围(高阻):20Vpp(DC~10MHz),14Vpp(10~20MHz),10Vpp(20~30MHz)
  • 幅值分辨率:2mV(典型),偏移范围 ±10V
  • 总谐波失真(THD):< -50dBc @10MHz 满幅(目标值)
  • 相位噪声:-100dBc/Hz @10kHz offset(30MHz 载波)(目标值,受限于测试条件,目前无法标定)
  • 输出阻抗:50Ω
  • 参考时钟:内部 TCXO(±1ppm)或外部 10MHz 输入

硬件指标(MVP)

  • 波形:正弦、方波、三角波、噪声波、直流
  • 正弦波最高 30MHz,方波最高 5MHz
  • 电压范围(高阻):4Vpp(DC~10MHz),2.8Vpp(10~20MHz),2Vpp(20~30MHz)
  • 幅值分辨率:2mV(典型),偏移范围 ±2V
  • 总谐波失真(THD):< -50dBc @10MHz 满幅(目标值)
  • 相位噪声:-80dBc/Hz @10kHz offset(30MHz 载波)(目标值,受限于测试条件,目前无法标定)
  • 输出阻抗:50Ω
  • 参考时钟:内部 TCXO(±1ppm)

控制与接口

  • USB 2.0(USB CDC 类),支持 SCPI-1999 命令集
  • SMA 输出,SMA 触发 I/O,SMA 外部时钟输入
  • 电源输入:24V DC,功耗 <24W

软件与扩展路线

  • V1.0:单通道 + 基础波形 + 核心 SCPI
  • V2.0:双通道 + 调制 + 扫频
  • V3.0:Linux GUI + 任意波(16kpts)

🚦 项目状态

当前阶段:MVP 硬件、MCU/FPGA 核心程序验证完成,已能通过 SCPI 控制输出,正在进行模拟前端进一步调优

✅ 已完成

  • PCB 设计与打样(4层板,信号完整性设计)
  • 模拟前端调试通过
  • DAC 上电参数配置正常(SPI 接口通信稳定)
  • 正弦 DDS 核(IP 核实现,48位相位累加器)
  • 方波/直流/三角波/噪声波生成
  • 幅度控制模块
  • 相位控制模块
  • SPI Slave 通信接口与寄存器组
  • 模拟板驱动库(MCU 端)
  • SCPI 协议栈移植
  • 7阶椭圆滤波器焊接调试
  • 输出性能粗略标定(THD、SFDR)
  • 软件幅度校准

🏗️ 开发中

  • 谐波性能优化

📋 待办(MVP 之后)

  • 滤波器性能优化(重构滤波器,调整群延时,减少快速边沿的过冲/振铃)
  • 分板思路调整(电源板、模拟板、控制板)
  • 模拟板完整版设计(加入 硬件幅度控制、直流偏置、外部触发、外部时钟输入)
  • 输出性能精确标定(需要专业频谱仪,目前无法进行)
  • 上位机控制软件

📸 当前进展

正弦波输出(SDS824X HD 示波器实测):

正弦波满幅输出波形: 10MHz正弦波满幅输出波形 30MHz正弦波满幅输出波形

方波满幅输出波形: 5MHz方波满幅输出波形

当前版本方波有约 13.5% 的过冲,为滤波器群延时特性所致,后续将通过优化通道设计解决,详见重构滤波器调试笔记。

10MHz正弦波FFT结果:

10MHz正弦波FFT结果

经上图数据可计算出1: THD ≈ -60.2 dBc @10MHz, SFDR2 ≈ 63.26 dBc @10MHz


⚠️ 已知问题

  • 当前版本方波有约 13.5% 的过冲,为滤波器群延时特性所致,后续将通过优化滤波器设计解决。
  • 当前版本在运行一段时间后,在输出 25 MHz 以上正弦波时,有概率出现固定大小/方向的偏置抖动,怀疑是 FPGA 发热导致时序漂移,后续将通过优化 FPGA 时序约束和增加散热解决。
  • 当前分板设计会导致成品过长过细(约 225mm x 90mm),后续将调整分板方案,分为电源板、模拟板、控制板。

🧱 仓库结构

ArbWave30/  
├── docs/ # 设计文档  
│    ├── pic/ # 文档图片  
│    ├── adr/ # 决策记录  
│    ├── 硬件设计文档/ # 硬件设计文档  
│    ├── 设计笔记/ # 设计笔记
│    ├── 用户手册/ # 用户手册  
│    └──  LICENSE # CC BY-SA 4.0  
├── hardware/ # 原理图、PCB源文件   
│    ├── analog_board/ # 模拟板 PCB设计  
│    ├── control_board/ # 控制板 PCB设计  
│    └── LICENSE # CERN-OHL-S-2.0   
├── firmware/ 
│    ├── fpga/ # FPGA 设计源代码(Verilog)  
│    │    ├── Application/ # 项目代码   
│    │    └── FPGA_Test_Hardware/ # FPGA 硬件测试代码   
│    │         ├── FPGA_Clodck_Test/ # 时钟测试代码   
│    │         └── FPGA_Hardware_Test/ # FPGA 硬件测试代码   
│    ├── mcu/ # MCU 固件源代码(C/C++)   
│    │    ├── Application/ # 项目代码   
│    │    ├── MCU_Test_Hardware/ # MCU 硬件测试代码   
│    │    │    └── min_system_test/ # MCU 最小系统测试代码   
│    │    └── SCPI_Test/ # SCPI-parser 移植测试工程   
│    └── Clock_Generator_Config/ # 时钟发生器配置     
├── simulink/ # LTspice 仿真文件  
├── datasheets/ # 组件数据手册,参考设计  
├── scripts/ # 自动化测试脚本(PyVISA)  
│    ├── test_filter/ # 滤波器测试脚本  
│    └── test_diff_to_single # 差分转单端输出测试脚本   
├── LICENSE # GPL-3.0  
└── README.md  

🚀 快速开始

项目处于 最小可行产品(MVP)验证阶段,未来会出现破坏兼容性的变更,正在进行 MVP 版本软硬件联调,待 MVP 验证完成后,将提供:

  • 打样 PCB 的 Gerber 文件及 BOM
  • FPGA 比特流烧录方法(通过 JTAG 加载)
  • 固件编译与升级步骤

当前你可以浏览 docs/ 中的设计文档,了解详细的技术规格和设计思路; 或查看 hardware/ 中的原理图和 PCB 设计文件与 firmware/ 中的代码框架,了解硬件与软件的构成,并提出您的宝贵意见。


📡 SCPI 命令示例

import pyvisa

# 1. 指定纯 Python 后端(无需安装 NI-VISA 驱动)
rm = pyvisa.ResourceManager('@py')

# 2. 列出所有资源,找到你的 COM 口(通常是 'ASRL3::INSTR' 类似格式)
# print(rm.list_resources())

# 3. 打开串口资源,并配置终止符
inst = rm.open_resource('ASRL3::INSTR')  # 请替换为实际的 ASRL 端口号
inst.baud_rate = 115200        # 串口波特率,对于 USB CDC 类设备并不重要
inst.read_termination = '\n'   # 非常重要:库默认是 '\n',但最好显式声明
inst.write_termination = '\n'  # 发送时自动追加换行符

# 4. 现在你可以像用 USBTMC 仪器一样使用 query
print(inst.query('*IDN?'))
inst.write('SOUR:FREQ 1000')
inst.write('SOUR:STAT ON')

# 5. 查询
freq = inst.query('SOUR:FREQ?')
print(f"Freq: {freq}")

inst.close()

完整命令集参见 docs/SCPI_reference.md。

🧪 自动化测试

测试脚本位于 scripts/(持续更新中),使用 PyVISA 与设备通信。你可以运行对应的脚本进行自动化测试,或者根据你的需求,参考这些脚本自行编写测试用例。

📄 文档

设计文档、测试报告和用户手册位于 docs/,持续更新中。

📅 版本路线图

阶段 功能 描述
V1.0 单通道,基础波形(正弦、方波、三角、噪声、DC) 支持频率、幅值、偏置、相位连续可调;支持SCPI命令(少量核心指令)
V2.0 双通道 增加第二路输出,支持频率/相位同步,相位差可调
AM调制 内/外部调制源,调制深度0~100%
V3.0 嵌入式GUI 基于Linux + LVGL,通过LCD触摸屏直接控制
任意波 支持用户自定义波形表,存储深度≥16kpts

📜 许可证

Copyright © 2026 EERNINUO

本项目采用多许可证策略,不同部分适用不同许可证:

组成部分 许可证
固件 (MCU/FPGA 代码) GNU General Public License v3.0
硬件设计文件 (原理图、PCB、BOM) CERN Open Hardware Licence Version 2 - Strongly Reciprocal
文档、图片、README Creative Commons Attribution-ShareAlike 4.0 International

这意味着:

  • 你可以自由使用、修改、分享固件代码,但任何衍生代码也必须以 GPL-3.0 开源。
  • 你可以基于硬件设计文件制作、分发物理设备,但必须同时开源你对设计文件的修改,并保留署名。
  • 你可以复制和修改文档,但必须同样以 CC BY-SA 4.0 分享,并注明原作者。

商标声明:ArbWave30 名称及标志未经授权不得用于商业产品。

🤖 AI 辅助声明

本项目文档框架由 GitHub Copilot / DeepSeek 辅助生成。 作者已逐一审查并测试,但如有任何问题欢迎提交 Issue。

⚠️ 免责声明

注意:本项目为个人学习与开源作品,不保证商业级可靠性。使用前请仔细阅读免责声明。

📫 联系方式

项目主页: https://github.com/EERNINUO/ArbWave30

⭐ Star History

如果您觉得这个项目有帮助,请给一个 Star ⭐,谢谢!

Footnotes

  1. 由于示波器自身产生的谐波不可忽略,该值仅供参考,实际值需频谱分析仪复测。 ↩

  2. SFDR 分为两种定义:1、含谐波;2、不含谐波。由于表中没有非谐波分量,故采用第一种定义。 ↩

About

ArbWave30 – 30MHz 任意波形发生器 | FPGA + 高速DAC | SCPI 可控

Topics

Resources

Stars

50 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages