아두이노 PWM(pulse width modulation) 펄스폭변조란?

아두이노를 처음 공부하는 분들에게는 좀 어려울 수도 있는 주제인 PWM에 대해서 알아보겠다. pulse width modulation 을 해석해보면 아날로그 pulse(파장,파형)를 디지털 신호의 네모파장을 모듈화 해서 흉내낸다는 것이다.

쉽게말해 디지털 신호를 가지고 아날로그 신호를 흉내낸다는 뜻이다.

잘 모르시는 분도 있겠지만 아날로그 신호화 디지털신호의 그래프를 그리면 아날로그 신호는 sin함수 또는 cos 함수처럼 곡선형태로 연결되어 있는 반면에 디지털 신호는 0 또는 1 두가지 값만 가지므로 y=1, y=0 의 두 함수가 시간(x축)에 따라서 연결된 형태로 설명할 수 있다.

아날로그 파형은 높낮이가 변하면서도 곡선 위의 점들이 연속적으로 연결되어 있다. 반면에 디지털 신호는 0 또는 1(꼭대기값) 두 값만 가진다. 0에서 1로 변할 때 중간 값들을 거치지 않고 바로 0에서 1로 변하며 1에서 0으로 변할 때 역시 마찬가지다.(여기서 0 또는 1의 값을 갖는다고 했는데 1은 디지털 회로에서 신호가 있음을 의미한다. 보통 전압이 걸린 상태를 1의 신호를 가진다고 하며 전압의 크기는 아두이노의 경우 보통 5V의 전압이 걸린다. 전압이 걸리지 않은 상태는 0으로 표시한다.)

이런 차이점으로 인해서 아날로그 신호와 디지털 신호의 쓰임새에도 차이가 생긴다.

예를들어 앞서 blink 예제처럼 on, off 두가지 상태를 제어하는 데는 디지털 신호를 사용하는 것이 편리할 것이다. 그런데 LED 불빛의 세기를 제어하고 싶다면 어떻게 할까? 불빛의 세기를 수치로 나타낸다고 하면 0부터 제일 밝은 값 사이에 수많은 상태를 가질 수 있다. 이런 처리는 디지털 신호가 아닌 아날로그 신호로 제어해야할 것이다. 마찬가지로 빛의 세기 뿐아니라 모터의 속도 제어에도 아날로그 신호가 적격일 것이다.

보통 디지털신호를 아날로그 신호로 변경하려면 DAC(디지털 아날로그 컨버터)를 사용해야 한다. 또다른 방법으로는 PWM을 사용하는데 이 방법은 실제로 아날로그 신호로 변경하는 것이 아니라 디지털 신호를 아날로그 신호처럼 보이도록 하는 것이다. 일종의 눈속임? 이라고 볼 수 있다.

아두이노는 내부 DAC가 없으므로 PWM을 사용한다. 단, 모든 디지털 핀을 PWM로 사용할 수는 없고 PWM이 사용가능한 핀에는 ~(물결표)가 있다.

위 그림에서 디지털 핀(3, 5, 6, 9, 10, 11) 번호 옆에 ~(PWM)표시를 볼 수 있다. 

PWM

그럼 PWM의 원리를 간략히 살펴보도록 하자. 우선 디지털 신호는 단 2가지 상태만 가질 수 있음을 명심해야 한다. 그러면 어떻게 해서 2가지 값을 가지고 다양한 값드을 표현할 수 있을까? 이것은 일종의 눈 속임이다. 

예를들어 모터에 5V의 전압을 10초 동안 걸었을 때 모터의 총 회전수가 100회라고 해보자. 그렇다면 5V의 전압을 5초 동안 걸었다면 모터의 총 회전수는 50회가 될 것이다. 그러면 1초동안 걸었다면? 모터의 회전수는 10회가 될 것이다.

이번에는 1초간 5V 전압을 걸고 1초동안 0V, 다시 1초간 5V의 전압을 반복적으로 10초간 주었다고 하자. 결과적으로 5V의 전압을 5초간 준 셈이므로 이론상 모터의 회전수는 총 50회가 될 것이다.


그러면 이번에는 5V의 전압을 주는 시간과 0v의 전압을 주는 시간을 0.01초씩으로 하여 10초간 번갈아 주어보면 어떻게 될까? 결과적으로 앞서 예처럼 5V의 전압이 토탈 5초간 걸린 것과 동일하며 0V와 5V의 중간 값인 2.5V의 전압이 10초간 모터에 걸린 것과 같이 동작하게 된다. (모터의 회전 속도가 반으로 줄어듦)

이렇게 5V의 전압을 거는 시간과 0V의 전압을 주는 시간의 비율이 1:1면 평균 2.5V의 전압을 주는 것처럼 눈속임을 할 수 있게 된다. 그렇다면 이 비율을 조절하면 다양한 전압을 주는 것처럼 눈속임이 가능하다.

예를들어 5V의 전압을 주는 시간과 0V의 전압을 주는 시간의 비율을 1:4로 해보자.

이렇게 전압을 주면 마치 1V의 전압을 주는 것과 비슷한 효과를 낼 수 있을 것이다. 실제로는 모터가 돌아가다 멈췄다를 반복하지만 아주 빠르게 반복하기 때문에 

일정한 속도로 돌아가는 것 처럼 보이는 것이다.

이런 방식으로 디지털 신호를 마치 아날로그 신호처럼 만들 수가 있으며 모터의 속도나 불빛의 세기를 조절할 수 있다.

예제(analogWrite)

기본적으로 아두이노에서 PWM으로 표현할 수 있는 값은 범위는 8bit(0~255)다. LED의 빛의 세기를 조절한다면 256가지 세기를 나타낼 수 있다는 뜻이다. 하지만 실제로 256가지 세기를 나타내는 것이 아닌 단 두가지 상태(0V, 5V)값의 비율을 조절하여 눈속임을 하는 것이라는 점을 기억하도록 하자.

우선 출력에 사용할 핀의 pinMode를 OUTPUT으로 설정한 후에 analogWrite 함수를 사용하여 0~255까지의 출력 값을 넣어주기만 한다.

PinMode(3, OUTPUT);

3번 핀을 출력 핀으로 사용한다.

alalogWrite(3, 5); 

analogWrite는 PWM를 사용하는 함수로 첫 번째 인자(3)를 핀 번호로 두 번째 인자를 출력의 크기로 하여 출력한다. 즉 3번핀에 PWM 방식으로 5의 크기의 출력을 준다는 뜻이다.(앞서 말한 것 처럼 가장 큰 출력은 255, 가장 작은 출력은 0이다.) 5는 아주 낮은 값이므로 LED의 빛이 희미해 보인다.


3번핀을 +출력으로 하고 -극으로 GND에 연결하였다. 그리고 저항을 직렬로 꼭 같이 연결하도록 하자. LED 자체에도 저항이 있지만 더 큰 저항이 필요하다. V=IR에서 R의 값이 0에 가까우면 I의 값이 커져서 회로가 버틸 수 있는 크기 이상의 전류가 흘러 아두이노가 데미지를 입을 수 있기 때문이다. LED의 경우 적절한 저항은 보통 250Ω 이상이며  LED가 0.02mA의 전류를 요구할 때 그렇다. (0.02 x 250 = 5V)

이번에는 analogWrite 함수에 출력의 크기를 255로 해보았다.


최대 크기의 출력이므로 LED 전구의 밝기가 최대로 밝아진 것을 볼 수 있다.

이 댓글을 비밀 댓글로
    • 2020.02.15 15:42
    비밀댓글입니다
    • dd
    • 2021.09.10 12:23
    좋은 글 감사합니다!