2015년 5월 29일 금요일

아두이노 아날로그 출력(PWM) 주파수 바꾸기

 아두이노 우노의 경우 PWM주파수가 980Hz (5,6번 핀)와 490Hz(3, 9, 10, 11번 핀)로 고정되어 있다. 보통의 경우(LED의 밝기를 제어한다든가 소형 모터를 돌릴 때)에는 이 주파수를 사용하는 것에 별 문제는 없다.
[표 1] 아두이노 우노의 pwm 주파수
핀 번호
PWM 주파수
5, 6
980Hz
3, 9, 10,11
490Hz
하지만 중소형 이상의 DC모터를 구동하는 경우에는 보통 10KHz 이상의 PWM 주파수를 사용하므로 아두이노에서 제공하는 기본 주파수로는 DC모터를 구동하기에 적절하지 않다. 이 주파수가 중요한 이유는 만약 PWM주파수가 너무 낮다면 모터의 속도를 정밀하게 제어할 수 없으며 모터에서 소음이 발생하는 경우도 있기 때문이다.
 
 이런 경우에 PWM 주파수를 변경해야 하는데 아두이노의 표준 API에는 아쉽게도 PWM의 주파수를 조절할 수 있는 함수를 제공하지 않지만 사용자가 만들어 놓은 라이브러리가 있다. 아래의 페이지에 자세하게 설명되어 있다.
다운로드 받은 파일의 압축을 풀면 세 개의 폴더가 있는데 이 중 PWM 폴더를 아래의 폴더에 복사하여 붙여넣는다.
<아두이노 IDE 설치 폴더>\Arduino\libraries
윈도우즈 시스템에서는 보통 아래의 폴더이다.
C:\Program Files\Arduino\libraries
그러면 아두이노 IDE에 다음 [그림 6.6.1]과 같은 항목이 생성된다. 이 항목을 선택하면 텍스트 에디터에 다음과 같이 인클루드문이 추가된다.
#include <PWM.h>
이것으로 이 라이브러리를 사용할 준비가 된 것이다.

[그림 1] pwm.h를 메뉴에서 인클루드하는 방법
이 라이브러리에서는 다음과 같이 다섯 개의 전역 함수를 제공한다.

[표 1] pwm.h에서 제공하는 전역 함수들
함수명
기능
InitTimers()
Initializes all timers. Needs to be called before changing the timers frequency or setting the duty on a pin
InitTimersSafe()
Same as InitTimers() except timer 0 is not initialized in order to preserve time keeping functions
pwmWrite(uint8_t pin, uint8_t val)
Same as 'analogWrite()', but it only works with initialized timers. Continue to use analogWrite() on uninitialized timers
SetPinFrequency(int8_t pin, int32_t frequency)
Sets the pin's frequency (in Hz) and returns a bool for success. 주파수 범위는 31Hz~2MHz 사이이다.
Sets the pin's frequency (in Hz) and returns a bool for success. 주파수 범위는 31Hz~2MHz 사이이다.
SetPinFrequencySafe(int8_t pin, int32_t frequency)
Same as SetPinFrequency except it does not affect timer 0. 주파수 범위는 31Hz~2MHz 사이이다.

여기서 보면 InitTimers() 와 SetPinFrequency() 함수는 함께 사용되는데 이 함수들은 내부적으로 timer0번을 초기화시킨다. 따라서 시간 관련 함수인 millis(), micros(), delay(), delayMicroseconds() 함수들이 정상 동작하지 않는다. 그리고 3, 5, 9, 10번 핀을 PWM 핀으로 사용할 수 있다.
 반면 InitTimersSafe()와 SetPinFrequency() 함수는 역시 쌍으로 사용되는데 timer0를 초기화시키지 않으므로 시간 관련 함수들이 정상적으로 동작한다. 그리고 3,9,10번 핀을 PWM으로 사용할 수 있다. 두 경우 모두 PWM값을 쓰기 위해서는 analogWrite()함수 대신 pwmWrite()함수를 사용한다.

[표 2] pwm.h 의 두 함수 그룹 비교
함수 그룹
특징
장단점
적용 핀
InitTimers()
SetPinFrequency()
timer0
초기화
millis(), micros(), delay(), delayMicroseconds() 함수들이 정상 동작하지 않는다.
3,
5,
9,
10
InitTimersSafe()
SetPinFrequencySafe()
timer0
초기화
안함
millis(), micros(), delay(), delayMicroseconds() 함수들이 정상 동작한다.
3,
9,
10

시간 관련 함수들이 정상적으로 동작 하지 않는 것은 큰 문제이므로 InitTimersSafe() 과 SetPinFrequencySafe() 함수를 사용하는 것이 좋을 것이다.


댓글 없음:

댓글 쓰기