본문 바로가기

아두이노/아두이노 공부하기!

9. [Tutorial] 아두이노 PWM

펄스폭변조(PWM (Pulse Width Modulation))

PWM은 디지털 신호를 이용해 아날로그 회로처럼 제어하는 방법이다.

말 그대로 펄스의 폭을 변조한다는 것이다. PWM으로 주파수를 제어하는 것은 다른 얘기다.

아날로그 신호는 시간에 따라 연속적인 값의 변화를 보이는 반면, 디저털 신호는 "0 또는 1"의 값만을 갖는다.
 
즉, 펄스폭변조(PWM)방식을 이용하면 디지털 신호 (1 or 0)을 마치 아날로그 신호처럼 동작하여 다양한 값으로 출력할 수 있다.

----------------------------------------------------------------------------------------------------------------------------------

그럼 어떻게 아날로그 신호처럼 제어할 수 있을까???

이는 디지털 신호의 한 주기 안에서 ON과 OFF의 비율을 조절하여 아날로그 신호처럼 제어한다.

좀 더 자세하게 설명하자면, (아래 파형 참조)

1. 한 주기(Period)안에서 신호가 'ON' 상태인 시간을 지속시간 (Pulse Width)

2. 'ON'시간과 'OFF'시간의 비율을 Duty Cycle.


** 주기의 경우(t) 1/f 로 표현된다. t=1/f(주파수)



이 두 가지의 지속시간과 Duty Cycle을 이용하여 PWM을 제어하게 된다.

----------------------------------------------------------------------------------------------------------------------------------

여기서 확실하게 짚고 넘어가야할 문제는, PWM을 이해하기 위해서는 전류를 이해해야 한다.

이는 PWM이 곧 전류로 제어한다는 것을 의미한다.

왜 전류일까????

PWM은 시간의 개념이 적용되어 전류를 제어하여 아날로그 처럼 출력시킨다.

근데 전기의 개념 중 시간의 개념으로 해석이 되는 것은 바로 "전류"이다.

시간의 개념인 전류를 이용하여 지속시간을 설정하고 이를 통해 Duty Cycle의 %를 정할 수 있다.

전압은 위 아래로 동작하기 때문에 변동사항이 없다.(0 ~ 5V).

펄스의 폭은 시간의 개념을 갖고 있기 때문에 좌 우로 움직인다. 고로 전류로 제어가 가능하다.

그래서 전류를 이해해야 PWM을 정확하게 이해할 수 있다.

전류에 대해 잘 모르겠다면, 먼저 아래 전기의 이해에서 전기의 성질을 이해하여 전압,전류,저항의 관계를 이해해야 한다.



다시 돌아가, 전류는 시간에 관계 된다고 설명했다.

이 말의 의미는 아두이노가 1A로 동작한다고 하면, 아두이노를 1시간 동작시켰을 때의 1A라는 것을 의미한다.

이는 A(암페어)라는 단위가 시간으로 1시간을 의미하는 것이다.

----------------------------------------------------------------------------------------------------------------------------------

그리고 analogWrite() 함수에 대해서 짚고 넘어가자.


void analogWrite(pin, value)


매개변수

pin: PWM 파형이 출력될 핀의 번호. (아두이노 보드에 PWM이라 기재되어 있음.)

value: Duty Cycle을 나타내는 0 ~ 255사이의 값. 0은 Duty 0%를 나타내고 255는 100%를 나타낸다. 50%의 경우 127을 넣으면 된다.


----------------------------------------------------------------------------------------------------------------------------------

아두이노 우노의 경우 PWM주파수가 980Hz (5,6번 핀)와 490Hz(3, 9, 10, 11번 핀)로 고정되어 있다.

즉, PWM 전용핀을 사용하면 주파수가 정해져있다.

그러면 analogWrite() 함수를 사용하기만 하면 Duty Cycle을 정해서 제어할 수 있다.

그래서 이를 LED의 밝기를 조절한다고 하면 !

10번에 LED를 연결했다고 하자. 그러면 PWM 주파수는 490Hz로 동작할 것이다.

여기에 analogWrite(10, 127) 을 하게되면, 핀 10번은 490Hz로 50% Duty Cycle로 출력을 할 것이다.


위 동작 원리는 핀 10번으로 490Hz로 50% Duty Cycle로 출력을 하면, 1초에 490번 진동하여 50% Duty Cycle로 출력하게 된다.

이 말은 LED가 1초에 490번 깜빡깜빡 거리는것을 반복한다는 것을 의미한다.


사람의 눈은 일정 이상으로 깜빡이는 것에 대해서는 그 깜빡임이라는 동작 자체를 인식 못하는 특징이 있다. 

마치 우리가 보는 만화같은 것도 여러개의 컷을 그려놓고 연속적으로 사람에게 보여주면 그걸 하나의 연속된 동작이라고 착각하게 되는 것과 같은 의미이다.

---------------------------------------------------------------------------------------------------------------------------------

근데 !! 아두이노에는 tone() 이라는 함수가 존재한다.

위 함수는 Duty Cycle을 50%로 맞춰놓고, 주파수를 움직이는 함수이다.

따라서, 위 함수는 PWM과는 다르다.

----------------------------------------------------------------------------------------------------------------------------------

PWM의  실습을 해보자.

// Arduino PWM LED 밝기 컨트롤 예제

const int ledPin =  13;     // LED 핀 선언 D13

const int ledSW = 2;        // LED Control SW 선언 D2


void setup() {

  pinMode(ledPin, OUTPUT); // LED 출력설정

  pinMode(ledSW, INPUT); // LED SW 입력설정

}


void loop(){

  int i;

  // LED PWM Test

  if(digitalRead(ledSW) == LOW// 스위치가 'ON' 되면

  {

    for(i = 0; i < 255; i++)

    {

      /*LED를 아날로그출력으로 0 ~ 255까지 값을 순서대로 출력한다.

        1, 2, 3.. 값이 올라갈 수록 밝기가 밝아진다.*/

      analogWrite(ledPin, i);

      delay(50);

    }

    for(i = 255; i > 0; i--)

    {

      analogWrite(ledPin, i);

      delay(50);

    }

  }

}

----------------------------------------------------------------------------------------------------------------------------------

동작 영상 !!


참고 블로그

아두이노 기초 - http://studymake.tistory.com/113


  • 11번 2017.10.19 19:31

    13번핀으로 어떻게 아날로그 라이트를 하죠?

    • Favicon of https://openstory.tistory.com BlogIcon Edward AHN 2017.11.04 20:32 신고

      코드를 보시면 const int ledPin = 13; 라고 13번으로 지정되어있구요. 해당 핀을 pinMode(ledPin, OUTPUT); 으로 출력설정을 했고 analogWrite(ledPin, i); 으로 LED를 ON했는데, analogWrite 함수는 PWM을 사용하기 위한 함수입니다. DigitalWrite함수를 이용해서 LED를 ON/OFF할 수 있습니다.

  • ㅇㅇ 2018.04.17 22:55

    490Hz로 50% Duty Cycle로 출력을 하면, 1초에 490번 진동하여 50% Duty Cycle로 출력하게 된다. 이 말이요..
    50%니까 1초에 245번이 되어야하는거 아닌가요? ㅠㅡㅠ 아니면 0.5초 동안 490라던가..