아두이노 나노로 제작한 주파수 측정기입니다. 사각파, 사인파, 삼각파 모두 측정 가능하며, 측정 범위는 수 Hz ~ 6.5MHz입니다. 측정 시간은 0.1초, 1초, 10초 3단계로 전환 가능합니다. 사각파만 측정한다면 증폭 회로 없이 디지털 핀 5번에 직접 입력하면 됩니다.
구성 요소
아두이노 나노 마이크로컨트롤러
파형 변환 증폭기 보드 (사인파/삼각파 → 사각파 변환)
LCD 디스플레이 (16x2)
입력 파형 선택 스위치
입력 잭
측정 시간 선택 스위치 (0.1s / 1s / 10s)
보정(캘리브레이션) 방법
FreqCount 라이브러리의 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.000000MHz가 나오도록 보정 계수를 조정하세요. 수정 후 스케치를 다시 업로드하면 됩니다.
코드
#include <FreqCount.h> // https://github.com/PaulStoffregen/FreqCount
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 6, 4, 3, 2); // RS, E, D4, D5, D6, D7
void setup() {
lcd.begin(16, 2);
pinMode(7, INPUT); // 모드 스위치
FreqCount.begin(1000); // 기본 1초 게이트
}
unsigned long f; float f0;
int x, n=3, r;
void loop() {
// 모드 스위치로 게이트 타임 변경
if(digitalRead(7) == HIGH) { n++; x=0; delay(100); }
lcd.setCursor(0,1);
if(n==1) { x++; if(x==1) FreqCount.begin(100); r=-1; lcd.print("T = 0.1 s "); }
if(n==2) { x++; if(x==1) FreqCount.begin(10000); r=1; lcd.print("T = 10 s "); }
if(n==3) { x++; if(x==1) FreqCount.begin(1000); r=0; lcd.print("T = 1 s "); }
if(n>3) n=1;
lcd.setCursor(0,0); lcd.print("F = ");
// 단위 자동 변환 표시
if(f>=1000000 && n==3) { f0=f/1000000.0; lcd.print(f0,6+r); lcd.print(" MHz"); }
if(f<1000000 && n==3) { f0=f/1000.0; lcd.print(f0,3+r); lcd.print(" kHz"); }
if(f>=100000 && n==1) { f0=f/100000.0; lcd.print(f0,6+r); lcd.print(" MHz"); }
if(f<100000 && n==1) { f0=f/100.0; lcd.print(f0,3+r); lcd.print(" kHz"); }
if(f>=10000000 && n==2) { f0=f/10000000.0; lcd.print(f0,6+r); lcd.print(" MHz"); }
if(f<10000000 && n==2) { f0=f/10000.0; lcd.print(f0,3+r); lcd.print(" kHz"); }
if(FreqCount.available()) {
f = FreqCount.read();
lcd.setCursor(10,1); lcd.print("***");
}
delay(200);
lcd.clear();
}