아날로그 PWM 출력 방법 : analogWrite()
PWM, 아두이노에서 아날로그 출력 방법 과 예제
에 대해 작성하였습니다.PWM
PWM은 Pulse Width Modulation으로 사각파의 펄스폭(듀티비) 변조를 의미 합니다. 이 PWM은 아래 그림과 같이 듀티비 조절로 평균값을 변화시켜 아날로그 전압처럼 사용할 수 있습니다.
PWM 파형
이 PWM 파형이 LED 출력 회로에 연결 되면 아래 그림과 같이 LED On, LED Off 시간을 조정하여 LED 의 밝기를 제어하는 용도로 사용될 수 있습니다. LED의 밝기는 듀티비에 의존하고, 이 듀티비는 디지털 파형의 평균 값과 동일합니다. 이와 같은 방법으로, DC 모터의 속도를 제어하거나, 조명장치의 밝기 조정 등 다양한 곳에 사용될 수 있습니다.
PWM 파형과 LED 밝기
아두이노의 PWM 출력
Hardware
아두이노에서 PWM 출력이 가능한 핀은 정해져 있습니다. 보드 마다 다르지만, Arduino Uno 보드는 아래 그림에서 나타내는 핀이 PWM 출력이 가능한 핀입니다. 아두이노 보드에서 핀 번호 앞에 ~ 문자가 있는 핀이 PWM 이 출력 가능한 핀입니다.
Arduino Uno 아날로그 출력핀
Software
아두이노에서는 아날로그 출력(PWM 출력)으로 analogWrite() 함수를 지원 합니다. analogWrite() 함수 사용법은 아래와 같습니다. 아래 표는 Arduino Uno 보드 기준으로, 다른 아두이노 보드를 사용하는 경우 지원하는 핀 번호와 PWM 주파수가 다르므로 확인이 필요합니다. 1
Syntax
- analogWrite(pin, value)
Parameters
- pin : 아날로그 출력 핀 (Arduino Uno Board : 3,5,6,9,10,11)
- value : 0 ~ 255 사이의 숫자 (Datatype : int)
Returns : 리턴 값 없음
Remark
- 490 Hz : 3,9,10,11 pin
- 980 Hz : 5,6 pin
Example
analogWrite(9, 63): 9번 핀에 듀티비 25%의 PWM 파형 출력 (63/255 * 100%)
※ 아날로그 출력 모드로 사용될 핀은 analogWrite() 함수를 사전에 pinMode() 함수를 사용하여 출력핀으로 설정 되어야 합니다.
PWM 출력 써먹어 보기
예시2 : 보드 내장 LED Dimming
아래 코드는 보드 내장 LED 의 밝기를 조정하는 예제입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | const int ledPin = 11; void setup(){ pinMode(ledPin, OUTPUT); } void loop(){ for(int i = 0; i <= 255 ; i++) { analogWrite(ledPin, i); delay(3); //LED Dimming 속도 천천히 } for(int i = 255; i >= 0 ; i--) { analogWrite(ledPin, i); delay(3); //LED Dimming 속도 천천히 } } | cs |
LED DImming 회로도
예제2 : 가변저항으로 LED Dimming
아래 코드는 가변저항으로 LED 를 Dimming 하는 코드 입니다. 아날로그 입력으로 10kΩ 가변저항을 사용했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | const int ledPin = 11; const int potentionmeterPin = A0; void setup(){ pinMode(ledPin, OUTPUT); pinMode(potentionmeterPin, INPUT); } void loop(){ int value = analogRead(potentionmeterPin); int duty = map(value, 0, 1023, 0, 255); analogWrite(ledPin, duty); delay(2); } | cs |
가변저항으로 LED DImming 회로도
마무리
본 포스트에서는 PWM에 대한 설명과 analogWrite() 함수 출력 방법과 예제에 대해 작성하였습니다. 예제에 사용했던 GPIO 초기화 함수 또는 for문 사용법에 대한 내용을 모르시는 분은 아래의 이전 포스트를 참고부탁드립니다.
끝까지 읽어주셔서 감사합니다.^^
- anlaogWrite() 보드별 스펙 차이 : https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/ [본문으로]
'Embedded > Arduino' 카테고리의 다른 글
아두이노 강좌 #15 시리얼 통신 포트 추가로 사용하기 SoftwareSerial.h (0) | 2020.07.14 |
---|---|
아두이노 강좌 #14 타이머 인터럽트 MsTimer2.h (1) | 2020.07.13 |
아두이노 강좌 #12 아날로그 입력 analogRead() 와 map() 함수 (1) | 2020.07.11 |
아두이노 강좌 #11 시리얼 UART 수신 인터럽트 serialEvent() (5) | 2020.07.10 |
아두이노 강좌 #10 디지털핀 인터럽트 (EXTI, digitalPin Interrupt) (1) | 2020.07.09 |