Arduino Nano 自制 1MHz 方波发生器:简易 PWM 电路
元器件与材料
- Arduino Nano R3 ×1
- 1602 LCD 液晶显示模块(白字蓝底)×1
- 轻触按键开关 ×3
- 10kΩ 单圈电位器 ×1
软件与在线服务
- Arduino IDE
项目简介
这是一个简单的方波发生器,利用 TimerOne 库在引脚 9 输出 PWM 信号,频率范围约 5Hz~1MHz,占空比 0~100% 可调。电路极简,仅包含 Arduino Nano、LCD 显示屏、三个上拉电阻和三个按键。

通过连接在数字引脚 6、7 的按键调节脉冲重复周期,引脚 13 的按键调节占空比。LCD 第一行显示周期(微秒)和占空比百分比,第二行显示频率(Hz)。最小调节步进为 1μs,因此频率呈离散变化:1μs 对应 1MHz,2μs 对应 500kHz,3μs 对应 333.333kHz……频率越低调节越平滑。高频段调节不够连续,但这是以简易换取的代价。我此前曾用专用 DDS 芯片制作过类似设备,性能更优但电路更复杂。
输出信号用单通道示波器观测。最终装入合适外壳,成为电子实验室又一实用工具。
代码
#include
#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7
unsigned long t = 1000, f, k = 512; // 默认 1000μs (1kHz), 方波, 50%占空比
byte k1, kn, kn1, kn2;
int drive = 0, drive0 = 0;
void setup() {
lcd.begin(16, 2);
pinMode(9, OUTPUT);
pinMode(6, INPUT); // 减周期按键
pinMode(7, INPUT); // 加周期按键
pinMode(13, INPUT); // 调占空比按键
}
void loop() {
Timer1.initialize(t); // 设置周期
Timer1.pwm(9, k); // 设置占空比 (0-1023)
kn = digitalRead(6); // 减周期
kn1 = digitalRead(7); // 加周期
kn2 = digitalRead(13); // 调占空比
// 长按加速逻辑:按住时间越长,步进越大
if (kn == HIGH) {
drive++;
if (drive < 30) t -= 1;
else if (drive < 60) t -= 10;
else if (drive < 100) t -= 100;
else t -= 1000;
} else drive = 0;
if (kn1 == HIGH) {
drive0++;
if (drive0 < 30) t += 1;
else if (drive0 < 60) t += 10;
else if (drive0 < 100) t += 100;
else t += 1000;
} else drive0 = 0;
// 限制周期范围
if (t == 0 || t > 300000) t = 1;
if (t > 200000 && t < 300000) t = 200000;
f = 1000000 / t; // 计算频率
k1 = k * 100 / 1024; // 计算占空比百分比
if (kn2 == HIGH) { // 循环调节占空比
k += 16; // 步进 16/1024 (可改 8 更平滑)
if (k == 1024) k = 0;
}
// LCD 显示
lcd.setCursor(0, 0);
lcd.print("T="); lcd.print(t); lcd.print(" us");
lcd.setCursor(12, 0);
lcd.print(k1); lcd.print(" %");
lcd.setCursor(0, 1);
lcd.print("F="); lcd.print(f); lcd.print(" Hz");
delay(300);
lcd.setCursor(0, 0); lcd.print(" ");
lcd.setCursor(0, 1); lcd.print(" ");
}
原理图

制造工艺
- 自制LUMAZOID:基于Arduino的音乐可视化灯光控制器
- DIY Arduino单词时钟 – 极简优雅的实时文字显示
- 用 Arduino Nano 和 Nokia 5110 LCD 自制 20kHz 示波器:简易 DIY 指南
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- JX 波形发生器 – 基于 Arduino 的 DDS 振荡器,带 OLED 显示屏
- 自制简易红外避障传感器:IR LED + 光电二极管 + Arduino
- DIY VR 滑板:用 Arduino、Google Cardboard 与蓝牙打造虚拟滑雪体验
- Arduino 串口简易计算器:两数四则运算演示
- 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
- 轻松打造 Arduino 秒表:按钮触发计时器
- Arduino 洗手计时器:抗击 COVID-19 的简易 DIY 工具
- 理解方波信号:基础与应用