아두이노 우노의 경우 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() 함수를 사용하는 것이 좋을 것이다.
댓글 없음:
댓글 쓰기