본문 바로가기
전자공학/아두이노

아두이노 PWM 이론1: PWM, 펄스파, 듀티 사이클

by 블랜드 2022. 1. 27.
반응형

아두이노 PWM 사용 이유

 아두이노는 디지털 장치이므로 아날로그 신호를 바로 출력해내지 못 한다. 보통 디지털 신호를 아날로그로 변환하기 위해서는 디지털 아날로그 변환기(DAC, Digital analog converter)가 있어야 한다. 하지만 흔히 쓰이는 아두이노 우노는 그러한 장치가 내장되어 있지 않다. 따라서 아두이노로 디지털이 아닌 아날로그 출력을 하기 위해서는 디지털 출력만으로 아날로그 신호를 만들어 낼 수 있는 기법이 필요한데, 그 때 일반적으로 쓰이는 방법이 PWM이다.

 

 PWM을 사용하여 아날로그 출력을 하면 LED의 밝기 조절, 삼색 LED의 여러 색상 표현, DC 모터의 회전 속도 조절 등을 할 수 있다.


Pulse width modulation(PWM)

  1. PWM이란 ‘펄스 폭 변조’라는 뜻으로 '펄스파(pulse wave)'의 듀티비(duty ratio)를 조절하여 펄스 폭을 변화시킴으로써 평균 전압을 가변할 수 있다.
  2. 디지털 형태의 펄스 폭을 가변함으로써 아날로그 출력의 진폭을 조절하는 효과를 얻는다.

펄스파(pulse wave)

펄스파(pulse wave)

 PWM의 원리를 이해하기 위해서는 '펄스파(pulse wave)'에 대해서 먼저 알아야 한다. '펄스파(pulse wave)'란 위 그림과 같이 생긴 파형을 가리킨다. 모양이 사각형과 비슷해서 '사각파(square wave)' 또는 '구형파()'라고도 부른다. 펄스파는 디지털 신호인 HIGH와 LOW를 번갈아 보내면 만들 수 있다. 이때 펄스파에서 파형의 주기를 '반송주기(Carrier period)'라고 한다. 펄스파를 반복적으로 내게되면 PWM 신호가 된다.


듀티 사이클(Duty cycle)

[왼쪽 그림: 펄스파(PWM 신호) / 오른쪽 그림: PWM의 Duty cycle에 따른 평균전압]

  PWM 신호의 반송주기(Tpwm)에서 HIGH 신호가 차지하는 비율을 듀티 사이클(Duty Cycle)이라고 한다. 듀티 사이클은 비율이므로 듀티 비(Duty ratio)이라고도 한다. 듀티사이클은 PWM 신호의 폭을 ON이 되는 신호가 몇 % 차지하고 있는지를 나타낸다고 할 수 있다.

  1. Tpwm = 반송주기(Carrier period) = Ton + Toff : ON, OFF가 한 쌍 나타나는 시간
  2. 반송주파수(Carrier frequency)=1/반송주기
  3. Ton = 반송주기에서 ON인 시간
  4. Toff = 반송주기에서 OFF인 시간
  5. Duty cycle = Ton/TpwmX100%: 한 주기 중 ON이 되는 시간의 비

 듀티 사이클에 따른 PWM 신호의 생김새는 다음과 같다.

Duty Cycle에 따른 PWM 파형

출처: http://www.righto.com/2009/07/secrets-of-arduino-pwm.html


듀티 사이클(Duty cycle)과 평균전압

 듀티 사이클이 왜 중요할까? 그 이유는 듀티 사이클에 따라 출력되는 평균전압이 달라지기 때문이다. 펄스파의 반복으로 나타낸 PWM 신호는 마치 DC 평균전압을 내보내는 것과 같은 효과를 가진다. 평균전압 Vavg을 수식으로 정리하면 다음과 같다. 이때 Von, Vout은 각각 디지털 신호인 펄스파의 HIGH, LOW일 때의 전압이다.

한 주기 중 ON이 되는 시간의 비인 Ton/Tpwm에 따라 평균전압 Vavg이 달라지므로 Ton/Tpwm을 Duty cycle이라고 정의해 놓은 것이다. 즉, Duty cycle은 평균전압 수식으로부터 도출되어 정의된 수식이라고 볼 수 있다. 이로부터 듀티 사이클이 의미하는 바를 알 수 있다. Duty cycle은 PWM 신호로 출력되는 평균전압 Vavg이 PWM에 사용된 디지털 신호(펄스파) 전압 V의 몇 %인지를 나타내는 지표라고 볼 수 있다. 예를 들어, 30% Duty Cycle이 뜻하는 것은 PWM 신호의 시간당 가해지는 신호의 평균전압이 디지털 HIGH 신호 전압 Von의 30%임을 의미한다. 아래에서 구체적인 예를 들어보겠다.

 

[왼쪽 그림: Duty cycle = 0%일 때의 평균전압 / 오른쪽 그림: Duty cycle = 100%일 때의 평균전압]

 만약 PWM 신호에 사용된 디지털 신호의 전압 값이 5V인 경우를 예를 들어보겠다. 실제 아두이노의 출력 전압도 5V이다.  0% Duty cycle를 갖는 PWM 신호는 디지털 신호가 ON 되어 있는 시간이 없으므로 평균전압 Vavg은 0V이다. 반대로, 100% Duty cycle을 갖는 PWM 신호는 디지털 신호가 항상 ON 되어 있으므로 평균전압 Vavg은 펄스파의 HIGH 값인 5V이다. 그림으로 나타내면 위와 같다.

 

50% Duty cycle를 갖는 PWM 신호의 평균전압은 Vavg =0.5 x 5V = 2.5V가 된다. 30% Duty Ratio를 갖는 PWM 신호의 시간당 가해지는 전압의 평균값은 Vavg =0.3 x 5V = 1.5V가 된다. 이는 디지털 신호의 30%의 전압이 가해지는 효과를 갖는다.

 

 이와 같이 보통 LOW(0), HIGH(1)와 같이 불연속적인 신호밖에 나타내지 못하는 디지털 신호를 PWM 신호를 사용하면 0~100%의 아날로그 전압을 만들어 낼 수 있다.


아두이노 PWM 수동 구현

void setup()
{
  pinMode(9, OUTPUT);
}

void loop()
{
  digitalWrite(9, HIGH);
  delay(9); // Wait for 9 millisecond(s)
  digitalWrite(9, LOW);
  delay(1); // Wait for 1 millisecond(s)
}

 위 소스코드와 같이 디지털 신호를 digitalWrite와 delay 함수를 사용하여 디지털 신호가 ON, OFF 되는 시간을 조절하면 사용자가 원하는 PWM 주파수와 Duty Cycle을 맞춰 PWM을 수동으로 구현할 수 있다. 위 코드는 아두이노 9번 디지털 핀에 LED를 연결하고 Duty Cycle을 90%, 주파수 1/10ms=100Hz로 PWM을 출력하는 코드이다. 실행 결과는 아래와 같다. 평균전압 Vavg=0.9 x 5V = 4.5V로 높게 출력되어 LED가 밝게 출력되는 것을 확인할 수 있다.

Duty Cycle = 90%일 때의 LED 밝기 상태


 만약 이 상태에서 Duty Cycle은 90%로 그대로 두고 PWM 주파수만 바꾸면 어떻게 될까? 이번에는 아래와 같이 소스코드를 고쳐보자.

void setup()
{
  pinMode(9, OUTPUT);
}

void loop()
{
  digitalWrite(9, HIGH);
  delay(900); // Wait for 900 millisecond(s)
  digitalWrite(9, LOW);
  delay(100); // Wait for 100 millisecond(s)
}

 위 코드는 delay(9)를 delay(900)으로, delay(1)를 delay(100)으로 수정한 코드다. Duty Cycle은 그대로 90%이고, PWM 주파수는 1/1000ms=1Hz로 변경되었다. 똑같은 Duty Cycle이니까 아까 위 100Hz 주파수일 때와 동일한 결과가 나올까? 실행 결과는 다음과 같다.

Duty Cycle=90%, 주파수=1Hz

 깜빡이는 결과가 보이는가? 이는 PWM 주파수가 낮아 ON, OFF 되는 시간이 길기 때문이다. 보통 LED와 같은 소자들은 빠른 주파수를 가지는 PWM 신호를 주면 곧바로 반응하지 못해서 아날로그 출력과 같은 효과를 보인다. 그러나 ON, OFF가 되는 시간이 길어지면 LED가 반응할 시간이 충분하여 단순히 ON, OFF 되는 결과를 보이는 것이다. 

 

 결론적으로 이를 통해 동일한 Duty Cycle이여도 출력 결과가 다르게 나타남을 알 수 있다. 다시 말해서, PWM은 주파수가 낮으면 단순히 껐다 켜지는 동작만 보일 뿐, 아날로그 출력과 같은 효과를 보이지 않는다. 따라서 PWM을 사용할 때는 주파수를 높게 설정해야 한다.

 

아래는 위와 같은 소스코드로 구현한 아두이노 PWM 구현 방식의 장단점을 설명해 놓은 것이다.

아두이노 PWM 수동 구현의 장점

  • 아두이노의 모든 디지털 핀을 사용할 수 있다.
  • Duty Cycle과 PWM 주파수를 원하는 값으로 설정할 수 있다.

아두이노 PWM 수동 구현의 단점

  • loop문 안에서 구현되므로 loop문 안에 다른 작업을 추가할 경우 다른 작업 동안 PWM 출력을 할 수가 없다.
  • 인터럽트가 발생할 경우 PWM 출력 도중 끊김, 지연이 발생하여 원래 의도한 PWM 신호의 Duty Cycle과 주파수에 영향을 미치게 되어 불완전한 PWM 신호가 생성된다.
  • loop문 자체도 수 마이크로 초 정도의 delay를 가지고 반복되므로 높은 주파수의 Duty Cycle에서는 오실로스코프와 같은 장치를 사용하여 Duty Cycle을 정확히 맞추지 않으면 정밀도가 높은 PWM 신호를 얻을 수 없다.

<PWM 주의사항>

  • PWM은 디지털 신호인 펄스파의 폭을 변경함으로써 평균전압을 통해 아날로그 출력과 같은 효과를 나타내는 기법이다. 따라서 실제로는 디지털 신호가 빠르게 ON, OFF 되며 출력될 뿐, 실제로 연속적인 아날로그 신호가 출력되는 것은 아니다. 단지 아날로그 신호와 같은 효과를 주는 것뿐이다.
  • 같은 Duty cycle이어도 PWM 주파수가 낮으면 단순히 ON, OFF가 될 뿐, 아날로그 출력 효과를 못 얻는다. 따라서 아날로그 출력 효과를 얻고 싶으면 PWM 주파수를 높여야 한다. 적정 PWM 주파수는 적용되는 기기마다 다르다. 대개 데이터시트를 보면 적정 주파수가 몇 Hz인지 나와 있다.  
반응형

댓글