아두이노 우노의 경우 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() 함수를 사용하는 것이 좋을 것이다.
'하드웨어 > 아두이노' 카테고리의 다른 글
아두이노 servo 라이브러리로 서보 모터 제어하기 (0) | 2015.05.29 |
---|---|
아두이노 라이브러리의 분류 (0) | 2015.05.29 |
아두이노 모터 쉴드 R3 소개 및 기능 (0) | 2015.05.28 |
아두이노를 이용한 소형 DC모터 제어 (1) | 2015.05.28 |
고휘도led를 이용한 아두이노 아날로그 출력 실험 (0) | 2015.05.28 |