안녕하세요. 메카럽입니다.
이번 포스팅에서는 analogWrite( ) 함수와 PWM제어에 대해 알아보도록 하겠습니다.
아두이노의 아날로그 포트는 analogRead( ) 함수를 사용해 외부 아날로그 값을 읽어들이는데, analogWrite( ) 함수는 사용할 수 없습니다. 이는 디지털 포트 중 일부만 사용할 수 있습니다.
위 그림과 같이 아두이노는 몇 개의 PWM 제어용 단자를 갖고 있습니다. 아두이노 우노 보드에서 PWM 출력을 발생시킬 수 있는 포트는 D3, D5, D6, D9, D10, D11 총 6개의 단자로, 단자에 표시된 각 숫자 앞에 틸다(~)표시가 되어 있는 것을 확인할 수 있습니다. 그럼 왜! 디지털 포트로 아날로그 출력을 발생시킨다는 것일까요? 디지털 신호는 1과 0, HIGH 또는 LOW만을 출력할 수 있으므로 아날로그 값을 만들어 낼 수 없지만, 디지털 신호를 아주 빠른 속도로 ON-OFF 제어하여 아날로그 신호처럼 활용한다는 것입니다. PWM은 "펄스 폭 변조"의 앞글자를 따서 만든 단어로써 아두이노에서 출력되는 펄스 신호의 폭을 제어한다는 뜻입니다. 즉, PWM은 디지털 포트에서 출력되는 신호의 폭을 바꾸어 아날로그 방식의 출력을 얻는 기술입니다.
2.5~5V의 전압으로 작동되는 액추에이터가 있다고 가정하겠습니다. 아두이노를 활용하면 이 액추에이터는 digitalWrite( ) 함수로 제어할 수 있습니다. 그럼 회전력은 어떨까요? 회전력은 전류에 의해 결정될 수 있는데, 액추에이터의 저항값은 고정되어 있으니 전압을 바꿔 조절할 수 있습니다. 하지만 디지털 방식의 출력으로는 0V와 5V 외에는 만들어 낼 수 없습니다. 만약 디지털 출력을 아주 짧은 시간 동안 OFF 시키면 어떨까요? 그리고 굉장히 빨리 켰다 끄기를 반복한다면 어떨까요?
이런 발상에서 생겨난 것이 PWM제어입니다.
위 그림을 살펴보겠습니다. 어떤 단위시간 동안 액추에이터로 유입되는 에너지는 인가되는 전압과 단위시간의 곱과 같습니다. 그림에서 파랗게 채워진 부분의 면적이 단위시간 동안 공급되는 에너지인 것입니다. 단위시간 동안 5V가 모두 공급되면 5V, 5V가 그 반의 시간만 공급되면, 에너지 면적은 그 절반인 2.5V입니다. 어떤 신호에서 LOW 상태와 HIGH 상태의 비율을 듀티비(Duty Rate)라고 합니다. 즉, 신호의 한 주기 내에서 어떤 비율(rate)동안 HIGH 상태를 유지하고, 나머지는 LOW 상태를 출력하여 0V~5V 사이의 아날로그 값을 모사하는 것입니다.
위 그림은 0%, 25%, 50%, 75%, 100% 듀티비를 갖는 PWM 신호를 나타냅니다. 한 주기내에서 신호가 HIGH일 때의 지속시간을 펄스폭이라고 합니다. 녹색선으로 이루어진 것은 한 주기를 나타내고 있습니다. 이 주기 내에서 HIGH 신호가 표시된 폭의 비율이 듀티비이며, 0%에서는 모든 신호가 LOW 상태, 25%에서는 한 주기 시작점에서 1/4 지점까지 HIGH 신호가 확인됩니다. 50% 듀티비에서는 1/2 지점까지, 그리고 100%에서는 한 주기 내 모든 시간에서 HIGH 신호가 출력됩니다. 이처럼 PWM 제어는 디지털 신호를 굉장히 빨리 껐다 켜기를 반복하는데, 이 속도가 490Hz 또는 980Hz입니다.
1초에 490번 껐다 켜기를 반복한다는 말로도 해석이 됩니다. PWM은 analogWrite( ) 함수를 통해 490번 중 한 번 껐다 켰다 할 때의 폭을 조정합니다. 한 주기 내에서 255 단계로 HIGH, LOW를 나눌 수 있으며 다음과 같이 analogWrite( ) 함수로 제어합니다.
analogWrite(출력포트, PWM 값) |
실제 PWM 출력을 발생시키고 멀티미터로 단자를 측정해보면 위 그림의 면적에 대응되는 전압을 확인할 수 있을 것입니다. 다음 네 가지 값을 analogWrite(5, 0), analogWrite(5, 127), analogWrite(5, 191), analogWrite(5, 255) 설정해보고 멀티미터로 전압값을 측정해보면 완전한 LOW 상태로 볼 수 있는 듀티비 0%는 0V, 듀티비가 50%일때는 약 2.5V, 완전한 HIGH신호인 100%일때는 5V를 확인할 수 있으실 겁니다.
void setup( ) { pinMode(5, OUTPUT); } void loop( ) { analogWrite(5, 64); delay(5000); analogWrite(5,127); delay(5000); analogWrite(5, 191); delay(5000); analogWrite(5, 242); delay(5000); } |
지금까지 analogWrite( )함수와 PWM제어에 대해 알아보았습니다. 아직까지 배우는 단계라서 그런지 응용을 해볼 엄두가 나질 않아 걱정이 조금 되긴 하지만 일단 시작을 한 만큼 끝까지 해보도록 하겠습니다. 이번 추석연휴는 고향에 계신 부모님과 재회를 하지 못하는 상황이라 더욱 안타깝고 아쉬운 추석이 되겠지만 예전의 일상으로 돌아가기 위한 희생이라 생각하고 못가시는 분들은 부모님께 안부전화라도 해보심이 어떠실까 생각합니다. 즐거운 추석 명절 보내시고 풍성한 한가위되시기 바랍니다. 오늘 하루도 행복하세요.
'3D프린터와 아두이노 > 아두이노' 카테고리의 다른 글
아두이노에서 부저와 멜로디 재생 (옥타브와 음계별 표준 주파수 실습) (13) | 2020.10.06 |
---|---|
아두이노 서보모터에 대해서 (4) | 2020.10.05 |
아두이노 모터 드라이버 (H-bridge 회로 구성 및 모터 드리이버와 주변 구성) (10) | 2020.09.28 |
DC모터와 트랜지스터 (2) | 2020.09.25 |
자기적 스위치와 기계적 스위치 (4) | 2020.09.23 |