波形发生器驱动

驱动MCP4728四通道12位DAC,实现独立输出2 kHz波形(正弦、三角或方波)的功能。

  • by xingyeyuye
  • C++
  • 本地部署
  • 更新于
在 GitHub 查看 xingyeyuye/MCP4728_test_code

使用说明

MCP4728 2 kHz 波形发生器

该 PlatformIO 项目驱动 MCP4728 四通道 12 位 DAC,使每个通道都能独立输出 2 kHz 波形(正弦、三角或方波)。每个通道都具备 12 位幅度调节、可变直流偏置与 查找表相位偏移能力。

硬件与软件要求

  • 任何兼容 Arduino 的 I2C MCU(示例使用 Wire 库)
  • Adafruit MCP4728 驱动库 (Adafruit_MCP4728)
  • 建议将 I2C 设置为 Fast-mode Plus(1 MHz)以满足刷新速率

工作原理

  • 每个波形周期取 32 个采样点(32 × 2 kHz = 64 kS/s)
  • 开机时构建归一化的正弦/三角/方波查找表
  • loop() 以微秒定时步进查找表,并把缩放后的样点写入 DAC
  • 通过原生 Adafruit 驱动完成全部 DAC 更新,无需修改底层代码

配置方法

在 src/main.cpp 中调用辅助函数配置任意通道:

setChannelWaveform(
  /* 通道索引 0..3 */ 0,
  /* 波形类型 */ WaveformType::kSine,
  /* 幅度 (0..2047) */ 1800,
  /* 直流偏置 (0..4095) */ kDacMidpoint,
  /* 相位步进 (0..31) */ 0);
  • amplitude 提供 12 位分辨率;2047 是在中点对称下不失真的最大值。
  • offset 控制波形的直流偏置;纯交流输出时保持为 kDacMidpoint。
  • phaseStep 改变查找表索引,实现通道之间的相位对齐或错位。

所有通道共享同一采样时钟,因此都会保持 2 kHz,但可同时输出不同形状与幅度。

注意事项

  • 推荐使用 1 MHz I2C;若 MCU 无法维持吞吐量,可适当降低 kWaveTableSamples。
  • MCP4728 在写入数据后立即更新通道;若连接 UDAC 引脚,可修改 mcp.setChannelValue(...) 的最后一个参数改用锁存更新。