亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

自制 R-2R DAC 驱动示波器 XY 模式绘制任意图形

项目概述

利用 Arduino Uno/Nano 的端口并行输出(PORTD 8 位 + PORTB 6 位)驱动两个 R-2R 梯形 DAC,分别输出 X/Y 模拟电压,接入示波器 XY 模式即可在屏幕上绘制任意矢量图形。配套 Python Tkinter 绘图工具可将手绘轨迹自动导出为 C 数组,无需手写坐标。成本极低(仅需电阻),原理透彻,适合学习 DAC、端口操作、示波器 XY 模式及嵌入式图形生成。

核心原理:R-2R 梯形 DAC

仅需两种阻值 R 与 2R(或同阻值串联)。每一位对应一个 2R 支路,输出电压为加权和:

Vout = Vref × (b₀/2 + b₁/4 + … + bₙ₋₁/2ⁿ)

硬件清单

组件数量备注
Arduino Uno / Nano1ATmega328P,PORTD 全 8 位,PORTB 可用 6 位
10kΩ 电阻50X 轴 8×2R + 1×R,Y 轴 6×2R + 1×R,共 14×2R + 2×R = 30 个 10k;建议多备
面包板 + 跳线1 套搭建两路 R-2R 梯形网络
示波器1需支持 XY 模式(双通道)
探头 ×22分别接 X/Y 输出

端口映射与初始化


// ATmega328P 端口映射
// PORTD (PD0-PD7) -> Arduino D0-D7  全 8 位可写
// PORTB (PB0-PB5) -> Arduino D8-D13 仅 6 位可写 (PB6/PB7 接晶振)
// PORTC (PC0-PC5) -> A0-A5 仅 6 位可写

void setup() {
  DDRD = B11111111;        // D0-D7 全部设为输出
  DDRB = B00111111;        // D8-D13 设为输出 (PB0-PB5)
  // 将 8 位 Y 值映射到 6 位 (0-255 -> 0-63)
  for (byte t=0; t

核心显示循环


void loop() {
  for (int t=0; t> 2;      // 6 位右移 2 位 (等同 /4)
    delayMicroseconds(FIGURE_DELAY); // 1µs 可调,控制刷新率/亮度
  }
}

Python 绘图工具

运行方式


pip install tk  # 如未自带
python drawlog.py > arduino_list.txt

工具特性

  • 255×255 像素画布,对应 8 位坐标范围
  • 左键拖拽绘制,实时画线;松开记录坐标
  • Y 轴自动翻转 (255-y) 适配示波器坐标系
  • 自动抽稀:删除每第 2 个点,减少点数提高刷新率
  • 输出 NUM_POINTS、x_points[]、y_points[] C 数组定义

内存限制与 PROGMEM 优化

Uno/Nano SRAM 仅 2KB,byte 数组每点 2 字节,约 400 点即耗尽。社区贡献的 PROGMEM 方案可存 15,000+ 点:


const int NUM_POINTS = ...;
const byte x_points[NUM_POINTS] PROGMEM = {...};
const byte y_points[NUM_POINTS] PROGMEM = {...};

void loop() {
  for (int t=0; t> 2;
    delayMicroseconds(FIGURE_DELAY);
  }
}

STM32 Blue/Black Pill (20KB+ RAM) 可直接存数千点,无需 PROGMEM。

示波器设置

  1. 通道耦合:DC
  2. 时基:XY 模式(关闭扫描)
  3. 电压档:根据 DAC 输出幅度调整(通常 0-5V 对应 1V/div)
  4. 触发:自动/单次均可,XY 模式下触发无关
  5. 调节水平/垂直位置使图形居中

进阶玩法与扩展

  • 多图形切换:Flash 存储多组坐标数组,按键/串口切换
  • 动画循环:在数组间插值生成过渡帧,实现线条动画
  • 文字/字体渲染:将字模点阵转为矢量笔画坐标
  • 音频可视化:ADC 采样音频 → FFT → 极坐标/柱状图坐标 → 实时输出
  • 激光扫描显示:DAC 输出接振镜/电磁偏转激光,实现激光投影
  • 高速 PWM + 低通滤波替代 R-2R:引脚数从 14 降至 2,但分辨率受限于 PWM 频率与滤波器

常见问题排查

现象原因对策
图形抖动/撕裂刷新率过低/点数过多减少点数、调大 FIGURE_DELAY、使用 PROGMEM
图形变形/压扁X/Y 幅度不匹配/示波器档位不对调整示波器 V/div 使 X/Y 比例一致;代码端可乘系数补偿
只显示点不成线示波器未进 XY 模式/时基未关确认进入 XY 模式,时基旋钮通常需按下或菜单切换
编译报错内存不足数组过大超出 SRAM改用 PROGMEM 或减少 NUM_POINTS
Y 轴只有 1/4 幅度未右移 2 位 (6 位映射到 8 位寄存器)确认 PORTB = y_points[t] >> 2

总结

本项目以「R-2R DAC + 端口并行输出 + 示波器 XY 模式」为核心,用最少元件实现了矢量图形发生器。Python 工具降低了坐标获取门槛,PROGMEM 技巧突破了 AVR 内存瓶颈。该方案可作为示波器时钟、矢量游戏机、音频可视化、激光扫描等项目的基础。建议初学者先在面包板搭建单路 8 位 DAC 验证原理,再扩展双路;进阶者可移植至 STM32/ESP32 获得更高分辨率与帧率。

制造工艺

  1. 打造低成本家庭无线传感器网络:Arduino + 树莓派 + Xively 物联网平台
  2. 树莓派家庭温度监测仪表盘:实时图表展示
  3. 解锁树莓派全部潜力的必备配件推荐
  4. 自制树莓派 Google Voice HAT:低成本实现语音交互功能
  5. Arduino UNO 精准视觉反应时间测试仪
  6. 选购带锯床终极指南:核心参数与避坑要点
  7. 汽车门把手维修全攻略:省钱DIY步骤详解
  8. 汽车锈蚀修复全攻略:保护爱车延缓腐蚀
  9. PC 示波器:利用电脑声卡构建低成本波形分析仪
  10. 电阻类型详解:从电位器到热敏电阻
  11. 电阻器:基础原理、类型与实际应用
  12. 重载列车动态制动原理解析