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

DIY 高频频率计 - Arduino Nano 实测 6.5MHz,三档测量时间可选

元器件清单

元器件数量备注
Arduino Nano R31主控,利用 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 外部时钟输入)。

DIY 高频频率计 - Arduino Nano 实测 6.5MHz,三档测量时间可选

核心原理

利用 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();
}

整形放大电路原理图

DIY 高频频率计 - Arduino Nano 实测 6.5MHz,三档测量时间可选

电路将任意波形信号转换为标准方波送入 D5 (T1)。三极管共射极放大加施密特触发(或利用单片机输入施密特特性)实现整形。输入端串联电容隔直,分压电阻设定偏置。

成品封装

将电路板、LCD、开关、输入插座安装在合适塑料盒内,即得一台实用的电子实验室仪器。

制造工艺

  1. 复古 Numitron 管时钟:Arduino Nano 驱动,低温可靠省电
  2. 用 Arduino Nano 和 Nokia 5110 LCD 自制 20kHz 示波器:简易 DIY 指南
  3. 用 Arduino Nano 自制 37 灯珠轮盘赌游戏机
  4. DIY ADXL335 地震检测仪 — 低功耗三轴加速度计项目
  5. 862D+ 电烙铁 DIY 智能温控器:精准可靠,低成本替代方案
  6. 自制 16×8 LED 矩阵俄罗斯方块游戏机:Arduino Nano + 74HC595 驱动
  7. MobBob:3D 打印智能机器人,Android 手机无缝控制,语音视觉一体
  8. 自制高精度测距轮:Arduino Nano + 旋转编码器 + 1602 LCD
  9. Never Ride Alone:骑行安全守护神——基于 Sigfox 的智能自行车报警器
  10. 设计4位组合锁:基于XOR与NOR门
  11. 万用表全解析:从模拟到数字的进化指南
  12. 交流电力系统频率与相位测量