PWM
PWM은 Pulse Width Modulation의 약자로 펄스 폭 변조를 뜻한다. 다시 말해 디지털 신호를 아날로그 신호처럼 흉내 내는 것이라고 볼 수 있다.
디지털/아날로그 신호
아날로그 신호와 디지털 신호의 특징은 아래와 같다.
- 아날로그
- sin과 같이 곡선으로 연속된 형태의 신호
- 다양한 값을 표현 => 연속적 - 디지털
- 0(Low)과 1(High)만을 이용해 데이터를 표현
- 0과 1 사이의 중간값이 존재하지 않음 => 불연속적
위와 같은 특성으로 인해 디지털 신호를 LED에 연결하면 LED가 On/Off 동작만 하게 되고, 아날로그 신호에 LED를 연결하게 되면 LED가 On/Off도 되지만 LED의 불빛 밝기도 조절이 된다. 하지만 사실상 마이크로 프로세서 등을 사용하는 컴퓨터의 입장에서 모든 신호는 디지털이다. 우리는 디지털 신호를 아날로그와 같은 형태로 표현할 수 있어야 한다. 그러므로 PWM을 이용해 일정한 주기의 디지털 신호의 출력이 HIGH인 시간과 LOW인 시간의 비율을 조정해 디지털 신호만을 사용하는 마이크로 컨트롤러에서 아날로그 신호를 만들 수 있다.
Duty Cycle
위와 같이 HIGH인 신호와 LOW인 신호의 비율을 표시하기 위해 Duty Cycle이라는 용어가 사용된다. 즉, 듀티비(Duty Cycle)는 HIGH인 신호와 LOW인 신호의 비율이다.
예를 들어 어떤 디지털 신호에서 절반은 HIGH이고 절반은 LOW인 주기가 반복되는 신호라면 우리는 그 디지털 신호를 50%의 듀티비를 가지고 있다고 말할 수 있다. 만약 Duty Cycle이 100%가 된다면 회로는 HIGH(5v)로 설정해서 계속 켜 놓은 상태와 같다. 반대로 0%인 회로는 GND와 같은 상태가 된다.
여기까지 읽어보면 알 수 있듯 PWM은 디지털 신호를 진짜 아날로그 신호로 변환한다기보다 트릭을 이용해 아날로그처럼 만드는 느낌이 강하다.
이를 설명하기 위해 LED나 형광등을 가장 많이들 예로 든다. 형광등은 60Hz로 켜졌다 꺼졌다를 계속 반복하고 있지만 우리는 그것을 잘 인지하지 못한다. 인간의 눈으로 60Hz의 깜빡임을 인지할 수 없기 때문에 항상 켜져 있는 것으로 인식하게 되는 것이다.
PWM은 모터 제어에도 사용된다. PWM을 이용해 모터가 돌았다 안 돌았다 하게 조작하여 속도를 제어할 수 있다. 만약 파형의 주기가 짧으면 더 부드럽게 동작할 것이다.
이는 전원을 껐다 켰다 반복하는 작업과 동일하고 결국 전력량을 제어하는 측면으로 이해할 수도 있다. 예를 들어 100% Duty Cycle일 때 100W를 소모하게 된다면, 50% Duty Cycle일 때는 50W 소모하게 되는 것이다.
정리하자면 디지털 신호의 0과 1의 비율을 조절하는 것이 PWM, 0과 1의 비율이 Duty Cycle이다.
Arduino LED PWM
아두이노를 이용해 간단하게 PWM을 이용한 LED의 밝기 조절 실험이 가능하다. LED는 15번 GPIO 핀에서 출력을 제어하도록 하였다. 나는 사실 아래 코드를 ESP32 보드에서 구동하였지만 아두이노를 이용해서 진행해도 똑같다.
const int LED = 13;
void setup(){
pinMode(LED, OUTPUT);
}
void loop(){
digitalWrite(LED, HIGH);
delay(10);
digitalWrite(LED, LOW);
delay(100);
}
위 코드에서 각 High, Low 아래에 있는 delay를 통해 Duty Cycle을 조절할 수 있고 이를 통해 LED 밝기 조절이 가능하다.
참고 자료
https://instrumentationtools.com/what-are-analog-and-digital-signals-differences-examples/
https://m.blog.naver.com/emperonics/221725399383
https://dokkodai.tistory.com/188