펄스폭변조(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);
}
}
}
----------------------------------------------------------------------------------------------------------------------------------
동작 영상 !!
참고 블로그