피코 보드에서 PWM으로 아날로그 형태의 신호 출력하기

피코 보드에서  PWM으로 아날로그 형태의 신호 출력하기

앞선 글들에서 라즈베리파이 피코 보드를 이용해 아날로그 신호를 입력하는 방법을 소개했다.

​

https://kongyine.com/223185316470

그러면 이와 반대로 라즈베리 파이 피코 보드에서 아날로그 값을 출력하는 것은 어떻게 할까?

방법은 PWM (Pulse Width Modulation)을 이용하는 것이다.

참고. 라즈베리파이 피코 보드에서 디지털 입력과 디지털 출력 방법

​

디지털 출력 : mypicoled=machine.pin(핀 번호, machine.Pin.OUT)

디지털 입력 : mysensor = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_DOWN)

​

라즈베리파이 피코는 내부적으로 디지털 방식으로 신호를 처리하기 때문에, 곧바로 아날로그 값을 출력할 수는 없기 때문에, 내보내어야 할 신호를 마치 수학의 미분과 유사하게 신호를 여러 개의 펄스로 나누고, 이들 각각

의 펄스의 값을 On/Off로 조절하여 아날로그와 유사한 신호를 구현하는데, PWM에서는 이들 각각의 펄스의 폭을 조절하는 방식으로 Duty를 조절하게 되므로 PWM(Pulse Width Modulation)이라고 부르며, 이러한 방법을 통해 아날로그와 유사한 신호를 출력하게 되는 것이다.

​

이처럼 출력신호를 1초당 몇 개의 펄스로 나누는지를 주파수 (frequency)라고 하는데, 장치별로 사용가능한 주파수가 정해져 있는 경우도 많으며, 다음과 같이 Datasheet에 해당 내용이 공개되는 게 일반적이다. 다음의 예는 SG90 서보 모터의 Datasheet에서 발췌한 내용이다.

​

​

실제로 PWM방식으로 해당 장치를 제어하려면 하나의 펄수 주기동안 얼마만큼 펄스를 유지할 것인가가 중요한데, 하나의 펄스 주기동안 얼마나 펄스를 Active 상태로 유지할 것인가를 Duty라고 하며, 이 duty 값으로 PWM 장치들을 제어하게 된다.

​

예를 들어, PWM을 이용하는 SG90 서보모터의 경우 다음과 같이 , datasheet에는 1msec의 폭을 갖는 펄스를 주면, 0도 위치로, 2msec의 폭을 가지는 펄스를 주면 180도 방향이 되도록 회전하게 되는 것이 제시되어 있다.

이를 이용하여 PWM출력을 하는 경우, 다음과 같이 된다.

​

이론상 0도로 동작되도록 PWM 핀으로 실제 출력되어야 하는 duty값은 : 65535 x 1.0 / 20 = 3276

이론상 90도로 동작되도록 PWM 핀으로 실제 출력되어야 하는 duty값은 : 65535 x 1.5 / 20 = 4915

이론상 180도로 동작되도록 PWM 핀으로 실제 출력되어야 하는 duty값은 : 65535 x 2.0 / 20 = 6553

 

<참고사항>

실제 test해 보면 SG90의 경우 오차 및 제작사 설게치 변경 등으로 인해 위의 값을 그대로 사용하면 0도에서 180도까지 동작하지는 않는다. 실제로는 0.5msec~2.5 msec 범위로 값을 확장해 주어야 0도에서 180도까지 동작한다. 때문에 실제로 필요한 PWM duty 출력값은 다음과 같다.

​

실제 0도로 동작되도록 PWM 핀으로 실제 출력되어야 하는 duty값은 : 65535 x 0.5 / 20 = 1638 보다 작은값

실제 180도로 동작되도록 PWM 핀으로 실제 출력되어야 하는 duty값은 : 65535 x 2.5 / 20 = 8192 보다 큰값