아두이노 강좌 #13 아날로그 출력 PWM 와 analogWrite()
Lucy Archive
Lucy / Facilitate4U
2020. 7. 11. 18:33

아날로그 PWM 출력 방법 : analogWrite()

  일반적으로 아날로그 전압 출력을 할 수 있는 주변장치(Peripheral)는 고급 마이크로컨트롤러(MCU)나 특수 목적 용 MCU에 존재합니다. 아두이노는 아날로그 출력을 하기 위해 analogWrite() 함수를 지원합니다. 이 analongWrite() 함수는 아날로그 전압을 출력하는 것은 아니고, PWM(Pulse Width Modulation)으로 구형파(사각파)의 듀티비를 제어하는 방법으로 아날로그 전압 출력이 되는 것처럼 사용 가능합니다. 본 포스트에서는

PWM, 아두이노에서 아날로그 출력 방법 과 예제

에 대해 작성하였습니다. 
관련포스트

본 포스트는 아날로그 출력 방법에 대해 작성하였습니다. 아날로그 입력 방법에 대한 대용이 필요하시면 참고해주세요.

2020/07/11 - [Arduino/Basic] - 아두이노 강좌 #12 아날로그 입력 analogRead() 와 map() 함수


PWM

  PWM은 Pulse Width Modulation으로 사각파의 펄스폭(듀티비) 변조를 의미 합니다. 이 PWM은 아래 그림과 같이 듀티비 조절로 평균값을 변화시켜 아날로그 전압처럼 사용할 수 있습니다.

PWM 파형PWM 파형

이 PWM 파형이 LED 출력 회로에 연결 되면 아래 그림과 같이 LED On, LED Off 시간을 조정하여 LED 의 밝기를 제어하는 용도로 사용될 수 있습니다. LED의 밝기는 듀티비에 의존하고, 이 듀티비는 디지털 파형의 평균 값과 동일합니다. 이와 같은 방법으로, DC 모터의 속도를 제어하거나, 조명장치의 밝기 조정 등 다양한 곳에 사용될 수 있습니다. 

PWM 파형과 LED 밝기PWM 파형과 LED 밝기


아두이노의 PWM 출력

Hardware

아두이노에서 PWM 출력이 가능한 핀은 정해져 있습니다. 보드 마다 다르지만, Arduino Uno 보드는 아래 그림에서 나타내는 핀이 PWM 출력이 가능한 핀입니다. 아두이노 보드에서 핀 번호 앞에 ~ 문자가 있는 핀이 PWM 이 출력 가능한 핀입니다.

Arduino Uno 아날로그 출력핀Arduino Uno 아날로그 출력핀

Software

아두이노에서는 아날로그 출력(PWM 출력)으로 analogWrite() 함수를 지원 합니다. analogWrite() 함수 사용법은 아래와 같습니다. 아래 표는 Arduino Uno 보드 기준으로, [각주:1]다른 아두이노 보드를 사용하는 경우 지원하는 핀 번호와 PWM 주파수가 다르므로 확인이 필요합니다.

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 회로도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, 010230255);
    analogWrite(ledPin, duty);
    delay(2);
}
cs

가변저항으로 LED DImming 회로도가변저항으로 LED DImming 회로도


마무리

  본 포스트에서는 PWM에 대한 설명과 analogWrite() 함수 출력 방법과 예제에 대해 작성하였습니다. 예제에 사용했던 GPIO 초기화 함수 또는 for문 사용법에 대한 내용을 모르시는 분은 아래의 이전 포스트를 참고부탁드립니다.

  끝까지 읽어주셔서 감사합니다.^^

관련포스트

👉 아두이노 아날로그 입출력 관련글 목록 보기

👉 아두이노 전체 포스트 목록 보기 

  1. anlaogWrite() 보드별 스펙 차이 : https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/ [본문으로]