DIY 高频频率计 - Arduino Nano 实测 6.5MHz,三档测量时间可选
元器件清单
| 元器件 | 数量 | 备注 |
|---|---|---|
| Arduino Nano R3 | 1 | 主控,利用 Timer1 计数 |
| 1602 LCD (并行接口) | 1 | 显示频率、单位、测量周期 |
| NPN 三极管 (如 2N2222) | 1 | 构成整形放大电路 |
| 滑动开关 (三档) | 1 | 选择 0.1s/1s/10s 测量周期 |
| 轻触开关 | 1 | 切换测量周期 |
| 电阻、电容、二极管若干 | 1套 | 整形放大电路元件 |
| BNC/3.5mm 音频插座 | 1 | 信号输入接口 |
工具:电烙铁、万用表、示波器(可选,用于调试)
软件:Arduino IDE、FreqCount 库
项目简介
基于 Arduino Nano 的高频频率计,测量范围 几 Hz ~ 6.5 MHz,支持方波、正弦波、三角波。三档测量时间(0.1s、1s、10s)平衡分辨率与响应速度。仅测方波时可省去整形放大电路,直接接数字引脚 5 (Timer1 外部时钟输入)。

核心原理
利用 Arduino Timer1 的外部时钟计数模式(T1 引脚 = 数字 5),硬件级计数输入信号上升沿。FreqCount 库封装了定时器配置,主循环只需读取计数值并换算频率。测量周期越长,分辨率越高(1s 档分辨率 1Hz,10s 档 0.1Hz)。
校准方法
FreqCount 库针对 16MHz 晶振有校正系数。若实测有偏差,修改库文件 FreqCount.cpp:
// 找到原行:
#if defined (TIMER_USE_TIMER2) && F_CPU == 12000000L
float correct = count_output * 0.996155;
// 改为(16MHz 晶振):
#if defined (TIMER_USE_TIMER2) && F_CPU == 16000000L
float correct = count_output * 1.000000; // 1.000000 为校正因子
校准步骤:输入精准 1MHz 信号,观察读数,调整校正因子使读数为 1.000000 MHz。修改后重新上传草图。
完整代码
#include
#include
LiquidCrystal lcd(12, 11, 6, 4, 3, 2); // RS, E, D4, D5, D6, D7
const int periodBtn = 7; // 周期切换按钮
unsigned long freq;
float freqDisp;
int periodIdx = 2; // 0=0.1s, 1=10s, 2=1s (默认)
int btnState, lastBtnState = LOW;
unsigned long lastDebounce = 0;
void setup() {
lcd.begin(16, 2);
pinMode(periodBtn, INPUT_PULLUP);
FreqCount.begin(1000); // 默认 1s
lcd.print("Freq Counter");
delay(1000);
lcd.clear();
}
void loop() {
// 按钮防抖动切换测量周期
btnState = digitalRead(periodBtn);
if (btnState != lastBtnState) lastDebounce = millis();
if ((millis() - lastDebounce) > 50) {
if (btnState == LOW && lastBtnState == HIGH) { // 按下瞬间
periodIdx = (periodIdx + 1) % 3;
switch (periodIdx) {
case 0: FreqCount.begin(100); lcd.setCursor(0,1); lcd.print("T = 0.1 s "); break;
case 1: FreqCount.begin(10000); lcd.setCursor(0,1); lcd.print("T = 10 s "); break;
case 2: FreqCount.begin(1000); lcd.setCursor(0,1); lcd.print("T = 1 s "); break;
}
}
}
lastBtnState = btnState;
// 读取频率并格式化显示
if (FreqCount.available()) {
freq = FreqCount.read();
lcd.setCursor(0,0); lcd.print("F = ");
if (periodIdx == 2) { // 1s 档
if (freq >= 1000000) { freqDisp = freq / 1000000.0; lcd.print(freqDisp, 6); lcd.print(" MHz"); }
else { freqDisp = freq / 1000.0; lcd.print(freqDisp, 3); lcd.print(" kHz"); }
} else if (periodIdx == 0) { // 0.1s 档
if (freq >= 100000) { freqDisp = freq / 100000.0; lcd.print(freqDisp, 6); lcd.print(" MHz"); }
else { freqDisp = freq / 100.0; lcd.print(freqDisp, 3); lcd.print(" kHz"); }
} else { // 10s 档
if (freq >= 10000000) { freqDisp = freq / 10000000.0; lcd.print(freqDisp, 6); lcd.print(" MHz"); }
else { freqDisp = freq / 10000.0; lcd.print(freqDisp, 3); lcd.print(" kHz"); }
}
lcd.setCursor(10,1); lcd.print("***"); // 更新指示
}
delay(200);
lcd.clear();
}
整形放大电路原理图

电路将任意波形信号转换为标准方波送入 D5 (T1)。三极管共射极放大加施密特触发(或利用单片机输入施密特特性)实现整形。输入端串联电容隔直,分压电阻设定偏置。
成品封装
将电路板、LCD、开关、输入插座安装在合适塑料盒内,即得一台实用的电子实验室仪器。
制造工艺
- 复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电
- 用 Arduino Nano 和 Nokia 5110 LCD 自制 20kHz 示波器:简易 DIY 指南
- 用 Arduino Nano 自制 37 灯珠轮盘赌游戏机
- DIY ADXL335 地震检测仪 — 低功耗三轴加速度计项目
- 862D+ 电烙铁 DIY 智能温控器:精准可靠,低成本替代方案
- 自制 16×8 LED 矩阵俄罗斯方块游戏机:Arduino Nano + 74HC595 驱动
- MobBob:3D 打印智能机器人,Android 手机无缝控制,语音视觉一体
- 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
- Never Ride Alone:骑行安全守护神——基于 Sigfox 的智能自行车报警器
- 设计4位组合锁:基于XOR与NOR门
- 万用表全解析:从模拟到数字的进化指南
- 交流电力系统频率与相位测量