JX 波形发生器 – 基于 Arduino 的 DDS 振荡器,带 OLED 显示屏
组件与物料
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino Nano R3 | 1 | 理论上任何 Arduino 型号均可工作 |
| SH1106 I2C OLED 显示屏 128x64 (4引脚) | 1 | |
| AD9833 DDS 模块 | 1 | |
| 带按键的旋转编码器 | 1 | 需焊接 |
| 旋转编码器模块 | 1 | 适合面包板安装 |
| 5V 继电器模块 (可选) | 1 | 用于切换 AC/DC 输出耦合模式 |
| 簧片继电器 5V 500Ω | 1 | 小信号最佳选择,可直接连接 Arduino 数字引脚 (10mA) |
| 电容 10µF | 1 | |
| 电容 10nF (聚酯电容) | 1 | |
| AC-DC 100-220V 转 5V 降压电源模块 (可选) | 1 | 非 USB 供电时使用 |
必需工具
- 电烙铁 (通用) – 仅面包板测试可不使用
应用与在线服务
- image2cpp – 将自定义图标转换为十六进制格式存入 PROGMEM
项目介绍
长期以来我一直想买示波器,买到手后发现还需要一个廉价信号发生器用于音频电路调试等爱好用途。结合电子与编程两大爱好,用 Arduino 自制是最佳选择。
主要功能
- 输出频率范围:1 Hz ~ 999,999 Hz
- 两种频率调节模式:对数步进与单数字编辑
- 三种波形:正弦波、三角波、方波
- AC/DC 输出耦合模式切换
- 支持在两个预设频率间连续扫频
- 单旋钮全功能控制
- 内置屏保延长 OLED 寿命
注意事项
使用市电电压时务必极其小心! 存在触电风险,可能造成皮肤和眼睛损伤。珍爱生命,仅此一次!
原型使用预装 10A 触点的继电器模块,因手头无微型簧片继电器。后者更适合小信号,可省去三极管、二极管和电阻。Arduino 数字引脚最大输出 40mA,不可直接驱动 120/150Ω 线圈的电磁继电器。
快速参考
包含操作界面图示与按键功能对照表。
原型照片
展示组装完成的实物,含面包板版本与 PCB 版本。
代码
项目包含三个文件:
JX_Wave_Generator_8.7.7.ino– 主程序 (版本 8.7.7)JXWG_Defs.h– 定义、常量、变量声明、EEPROM 配置结构JXWG_Graphics.h– 图标位图数据 (PROGMEM)
核心逻辑概述
主循环通过状态机处理旋转编码器事件:
- LOGARITHMIC 模式:旋钮按对数步进 (1,10,100...) 调节频率,按键进入选项菜单
- SINGLEDIGIT 模式:光标逐位修改频率数字,支持波形、耦合、工作模式切换
- SWEEP 模式:设置扫频起止频率与步进,支持启动/暂停/停止
- OPTIONS 子菜单:切换工作模式、波形类型、耦合模式
- 配置参数自动保存至 EEPROM (地址 32 起),掉电保持
- AD9833 通过 SPI (引脚 9,10,11) 驱动,I2C (A4/A5) 控制 OLED
- 屏保在 10 分钟无操作后自动启动
关键函数
DDS_FrequencySet()– 向 AD9833 写入频率与波形寄存器AutoStep()– 计算对数步进值FrequencySweep()/SweepUp()/SweepDn()– 扫频状态机saveConfig()/loadConfig()– EEPROM 读写drawInterface()/drawAllIcons()– OLED 界面绘制
原理图
提供 Fritzing 原理图与实物接线照片,展示 AD9833、OLED、编码器、继电器、电源模块与 Arduino Nano 的连接方式。
制造工艺
- Arduino Nano高速摄影控制器 – 定格水滴碰撞瞬间
- DIY 蓝牙控制 Arduino 间谍小车
- FlickMote:基于手势的智能家居红外遥控器
- DIY Arduino TV-B-Gone:万能关机遥控器
- 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- Arduino 项目优化供电方案:从按键开关到电池监测与数据记录
- DIY VR 滑板:用 Arduino、Google Cardboard 与蓝牙打造虚拟滑雪体验
- Arduino Mega 2560 接 NEO-6M GPS 模块完整教程
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- 从零构建智能 Arduino 四足机器人:完整指南
- u-blox LEA-6H GPS 模块:Arduino 与 Python 集成指南