아두이노 우노로 정밀 주파수 & 듀티 사이클 측정기 만들기
부품 및 소모품
| 부품 | 수량 |
| 아두이노 우노 (Arduino UNO) | 1 |
| 20x4 영숫자 LCD (알파뉴메릭) | 1 |
필요 도구
앱 및 온라인 서비스
프로젝트 소개
아두이노의 pulseIn() 함수를 활용하여 펄스 신호의 주파수, 하이 펄스 폭(Ton), 로우 펄스 폭(Toff), 듀티 사이클을 측정하고 20x4 LCD에 실시간 표시하는 계측기 프로젝트입니다.
회로 구성
- 펄스 입력: 아두이노 디지털 핀 7
- LCD 연결 (4비트 모드):
- RS → D9, EN → D8, RW → GND
- D4~D7 → D10~D13
- VSS(1), LED-(16) → GND; VDD(2), LED+(15) → 5V
- VO(3) → 10kΩ 가변저항 중간단 (콘트라스트 조절)
동작 원리
- 핀 7에서 HIGH 펄스 감지 대기 →
pulseIn(pin, HIGH)로 Ton(µs) 측정
- 이후 LOW 펄스 폭 측정 →
pulseIn(pin, LOW)로 Toff(µs) 측정
- 주기 = Ton + Toff
- 주파수 = 1,000,000 / 주기 (Hz)
- 듀티 사이클 = (Ton / 주기) × 100 (%)
- 1초 주기로 반복 측정 및 LCD 갱신
활용 분야
- 통신 분야 주파수 측정
- DC 모터 속도 제어(PWM), 서보 모터 각도 제어 펄스 폭 확인
- 디지털 신호 수신기/리피터의 펄스 대칭성 검사
소스 코드
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 10, 11, 12, 13); // RS, EN, D4, D5, D6, D7
#define pulse_ip 7
int ontime, offtime, duty;
float freq, period;
void setup() {
pinMode(pulse_ip, INPUT);
lcd.begin(16, 4);
lcd.clear();
lcd.print("Freq:"); lcd.setCursor(0,1); lcd.print("Ton:");
lcd.setCursor(0,2); lcd.print("Toff:"); lcd.setCursor(0,3); lcd.print("Duty:");
}
void loop() {
ontime = pulseIn(pulse_ip, HIGH);
offtime = pulseIn(pulse_ip, LOW);
period = ontime + offtime;
freq = 1000000.0 / period;
duty = (ontime / period) * 100;
lcd.setCursor(5,0); lcd.print(freq); lcd.print("Hz");
lcd.setCursor(4,1); lcd.print(ontime); lcd.print("us");
lcd.setCursor(5,2); lcd.print(offtime); lcd.print("us");
lcd.setCursor(6,3); lcd.print(duty); lcd.print('%');
delay(1000);
}
회로도