관리 메뉴

개발자비행일지

[펌글]PWM이란? 본문

▶ Ardupilot

[펌글]PWM이란?

Cyber0946 2021. 2. 24. 14:52

PWM

https://learn.sparkfun.com/tutorials/pulse-width-modulation?

펌글 : 출처 

https://smartstore.naver.com/bearfabmall

이번 강좌에서는 PWM이 무엇인지 알아보고 실제 아두이노에서 어떻게 사용할 수 있는지에 대해서 알아보도록 하겠습니다.

PWM이란?

PWM은 디지털 신호 중 특정한 형태를 띈 신호를 일컷는 용어인데요. 이 PWM은 회로제어에 다양한 용도로 활용되고 있습니다. 가장 손쉽게 PWM을 사용한 예는 RGBLED의 색상변경이나 서보모터의 방향 전환에서 목격할 수 있습니다. 양 쪽의 예 모두 디지털신호일지라도 PWM을 사용하면 아날로그 신호와 유사한 효과를 낼 수 있다는 점에 기인한 방법인데요. 이 방법은 일정한 주기의 디지털 신호의 출력이 HIGH인 시간과 LOW인 시간의 비율을 조정해서 아날로그 효과를 내는 방법이므로 디지털 신호만을 사용하는 마이크로 컨트롤러에서 아날로그 신호를 만들 필요가 있을 때 매우 유용하게 사용됩니다.

서보모터에 의해 구동되는 로봇팔(서보모터는 pwm으로 제어됨)

PWM의 원리

PWM의 작동 원리를 알 수 있게 간단한 예시를 들어 보겠습니다. 아두이노 보드(우노)를 사용해서 LED 하나를 켜고 끄는 회로를 구성했습니다. 이때 DigitalWrite( ) 함수를 사용하면 5V 또는 0V만을 출력할 수 있습니다. 이 말은 LED가 완전히 켜져 있거나 꺼져 있는 상태를 의미합니다.

1초간 LED가 켜지고 1초간 꺼짐

그런데 여러분들이 DigitalWrite( )함수를 사용해서 원래 밝기의 50%로 LED가 켜지게 하고 싶을 때는 어떻게 해야 할까요?

일단 주기를 빠르게 바꾸기 위해 딜레이 시간을 50ms로 줘 보도록 하겠습니다.

딜레이 시간을 50ms로 줌

50ms 동안 켜져있고 50ms동안 꺼져있음.

빠르게 깜박이네요. 이제 딜레이 시간을 더 줄여서 아래와 같이 5ms를 줘보겠습니다.

이제 깜박이는 것이 거의 안보이고 거의 LED가 완전히 켜져 있는것처럼 보이기 시작합니다.(밝기는 줄었죠?)

이때 신호의 주파수는 어떻게 될까요? 5ms동안 HIGH이고 5ms동안 LOW였으므로 전체 시간은 10ms가 됩니다. 10ms는 0.01초이므로 주파수는 1/0.01 = 100Hz가 됩니다.

즉 사람의 눈에는 신호의 주파수가 100HZ가 넘어가기 시작하면 깜박임을 감지할 수 없는 상태가 된다는 의미 입니다. 그리고 HIGH인 신호와 LOW인 신호의 비율만큼 신호의 강도가 나타나게 됩니다.(이말은 디지털 신호로 아날로그 신호를 만들었다는 의미입니다. 50%밝기로 LED를 켜게 된 것이죠!)

여기서 신호의 주파수는 100Hz를 유지한 채 HIGH인 신호와 LOW인 신호의 시간을 바꿔보면 어떻게 될까요?

1대 9의 비율로 신호의 주기를 바꾸니 이제 더 어두워 졌네요.(카메라로 찍으니 비슷해 보이는데 실제로는 더 어두워 보입니다.) 이 신호는 원래 빛 강도의 1/10로 켜지게 되었습니다.

원래 밝기의 1/10 강도

놀랍지 않나요? 이런 방식으로 디지털 신호를 아날로그 신호인 것처럼 보이게 만들 수 있습니다.

참고로 아두이노에서 실제로 PWM신호를 만들때는 위와 같이 시간을 일일히 지정하지 않고 내장된 함수(analogWrite함수)와 지정된 핀을 사용하는데요. 아두이노 우노의 경우 디지털3, 5, 6, 9, 10, 11번 핀을 PWM출력으로 사용할 수 있습니다. 이 때 5, 6번 핀은 980Hz를 3, 9, 10, 11번 핀은 490Hz를 PWM신호의 주파수로 사용합니다.

듀티비(Duty Cycle)

위와 같이 HIGH인 신호와 LOW인 신호의 비율을 표시하기 위해 듀티사이클이라는 용어가 도입되었는데요. 듀티비는 이 HIGH인 신호와 LOW인 신호의 비율을 말합니다.

예를들어 어떤 디지털 신호에서 반은 HIGH이고 반은 LOW인 주기가 반복되는 신호라면 우리는 그 디지털 신호를 50%의 듀티비를 가지고 있다고 말합니다. 만약 50%가 넘는 듀티비이면 하나의 주기에서 HIGH인 신호가 LOW인 신호보다 더 많은 비율을 차지하고 있는것이고 50%이하면 HIGH가 LOW보다 더 적은 비율을 차지하게 되는 것입니다.

아래 그래프는 위 설명에 대한 그림입니다.

각각 50% 듀티비, 75% 듀티비, 25% 듀티비인 디지털 신호

만약 100% 듀티비인 신호는 어떻게 될까요?

100% 듀티비인 신호는 회로는 그냥 HIGH(5v)로 설정해서 계속 켜 놓는 것과 같습니다. 반대로 0%인 회로는 GND이나 마찬 가지 겠죠?

PWM 활용 예시

PWM은 아날로그 신호를 만들 필요가 있는 곳에 다양하게 응용되어 사용되는데요. 가장 간단한 예는 아마도 RGBLED가 아닐까 합니다.

PWM은 LED의 밝기 조절에 사용됩니다.

RGBLED는 빨강, 초록, 파랑의 세가지 색의 값을 조절해서 원하는 빛의 색을 만들 수 있는 LED인데요.

색상혼합

위 예에서 세개의 색상값의 강도가 동일하면 위 그림처럼 힌색 빛을 발산하게 됩니다. 만약 파랑과 초록이 같은 강도로 혼합되면 CYAN이 되고 빨강을 최고 강도로 초록을 50%의 강도로 파랑을 완전히 끄면 오렌지 색이 됩니다.

pwm을 활용해서 RGBLED 제어

PWM을 사용하는 또다른 대표적인 예는 서보모터 입니다. 서보모터는 모터에 기계적 움직임이 가능한 회전팔을 부착하는 데요. 이 회전팔을 정확한 위치로 돌리기 위한 신호로 PWM신호를 사용합니다.

pwm신호로 제어되는 서보모터

서보모터는 일반적으로 50Hz의 신호를 수신합니다.(이말은 20ms의 주기를 가진 신호를 받아 들인다는 말과 같습니다.) 이때 듀티사이클은 5%에서 10%의 신호(High인 신호가 1ms에서 2ms사이)여야 하며 7.5%의 듀티사이클 신호가 보내지면 서보의 팔이 90도 위치를 유지하게 됩니다. 5%이면 0도이고 10%이면 180도 위치이겠죠? 이 사이의 듀티값을 지정하면 0에서 180도 사이의 모든 위치로 이동이 가능합니다.

PWM을 사용해서 실제 서보모터를 제어하는 실습은 아래 포스트를 참고해 주세요.

오늘은 여기까지 하겠습니다. 그럼 이만^^


'▶ Ardupilot' 카테고리의 다른 글

Attitude Control Algorithm for drone  (0) 2021.03.24
Drone-Gyroscope 계산과정  (0) 2020.12.06
Drone -Gyro Sensor  (0) 2020.12.06
매틀랩 단축키  (0) 2020.10.08
C++ 초기화 리스트  (0) 2020.09.03