아두이노 PWM 마스터: 원리·함수·실전 코드로 모터·LED 제어하기
아두이노 PWM(Pulse Width Modulation) 프로그래밍 완전 정복
PWM이란?
PWM(펄스 폭 변조)은 고정된 주파수의 펄스에서 듀티 사이클(Duty Cycle, ON 시간 비율)을 조절해 평균 전압/전력을 제어하는 기법입니다. 직류 전압을 가변 펄스 폭의 사각파로 변환하며, 펄스 지속 시간 기법(PDT)이라고도 합니다.
모스펫·트랜지스터 등 파워 스위칭 소자가 필요하며, 고전력 제어 시 정교한 구동 회로 요구됩니다.
왜 PWM인가? (저항 분압 대비 장점)
- 고효율: 저항으로 전압 강하 시 전력 손실 대폭 발생, PWM은 스위칭 손실만 있어 효율적
- 고전력 제어 경제성: 대전력용 고전력 저항 가격이 PWM 시스템보다 비쌈
- 정보 전달 겸용: 듀티 사이클에 정보 임베디드 가능 (예: 25% 듀티 = 특정 명령)
PWM 주요 활용 분야
- 서보 모터: 듀티 사이클에 비례해 회전각 제어
- RGB LED: R/G/B 각 채널 듀티 조절로 풀 컬러 구현
- DC-DC 컨버터: 효율적 전력 변환/제한
- DC 모터 속도 제어: 듀티 비례 평균 전압으로 회전수 제어
- 정현파 생성·전압 레벨 제어: 고급 인버터·오디오 앰프 등
PWM 주파수 선정 중요성
주파수가 너무 낮으면 모터가 펄스 간격마다 진동/저크(Jerk) 발생. 제어 대상의 기계적 시정수(Mechanical Time Constant) 고려해 주파수 선정 필수. 일반적으로 모터 제어는 수 kHz~수십 kHz 대역 사용.
아두이노 PWM 핀과 핵심 함수
Arduino UNO 기준 PWM 지원 핀: 3, 5, 6, 9, 10, 11번 (6개) — 핀 옆에 ~ 표시로 구분.
analogWrite(pin, value)
- 핵심 함수: 디지털 write가 HIGH/LOW만 가능하지만, analogWrite는 0~255 값으로 PWM 듀티 제어 (0=0%, 255=100%)
- PWM 핀에만 사용 가능
- 내부 타이머 하드웨어 활용, 소프트웨어 구현 불필요
실전 예제: LED 밝기 페이드 인/아웃
int ledPin = 3; // PWM 핀 (3번)
int brightness = 0; // 초기 밝기 0
int fadeAmount = 5; // 단계별 증감량
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
analogWrite(ledPin, brightness); // PWM 출력
brightness += fadeAmount;
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount; // 방향 반전
}
delay(30); // 부드러운 변화용 지연
}
밝기 0→255→0 무한 반복으로 자연스러운 페이드 효과 구현.
핵심 포인트 체크리스트
- 반드시 PWM 지원 핀(~ 표시) 사용
- analogWrite() 함수로 듀티 제어 (0~255)
- 주파수 변경 필요 시 타이머 레지스터 직접 설정 (고급)
- 모터 구동 시 드라이버 회로(모스펫/H브리지) 필수
함께 보면 좋은 글
- PIC18 마이크로컨트롤러 프로그래밍 단계별 튜토리얼
- MAX232 구조·동작·종류·응용
- 전기·전자 엔지니어 온라인 설계·시뮬레이션 툴 10+
- 전기·전자 엔지니어·학생 필수 안드로이드 앱 15선
- 555 타이머 박수 스위치 회로 프로젝트
- 탄화 저항값 찾는 3가지 비법