Due보드의 PWM 개요
아두이노 두에 (arduino due) 의 PWM 핀은 다음 그림의 핀맵에 나온 바와 같이 같이 D2부터 D13까지 12개를 사용할 수 있다. 따라서 우노보다 더 많은 핀을 PWM출력으로 사용할 수 있다.
[그림 1] 아두이노 두에의 핀맵
단순히 핀 수만 많은 것이 아니라 우노와 달리 최대 해상도를 12비트까지 지정해 줄 수 있다. 따라서 우노는 [0, 255]범위의 출력(8비트)을 사용했었는데 두에의 숫자 범위는 [0, 4095] 이다.
PWM의 해상도를 조절하려면 다음과 같은 함수를 사용해야 한다.
analogWriteResolution(nBits); |
입력인수는 몇 비트를 사용할 것인가를 지정해주면 되며 기본값은 8비트이다. 만약 12비트로 해상도를 높이고 싶다면 다음과 같이 하면 된다.
analogWriteResolution(12); |
그런 다음 analogWrite()함수를 사용하면 된다. 예를 들어서
analogWrite(6, 4095); // 6번핀에 4095값을 내보낸다. |
만약 어떤 아날로그 센서의 입력이 [0, 1023] 범위의 값인데 이것을 [0. 4095]범위의 값으로 변환하고 싶다면 map()이라는 함수를 사용하면 된다.
map(sVal, sMin, sMax, cMin, cMax); |
이 함수는 sVal 값을 원래의 범위인 [sMin, sMax] 에서 변환하고자 하는 범위 [cMin, cMax]에 해당하는 값으로 바꾸는 함수이다. 만약 (0, 1023)범위의 센서값을 [0,4096]값으로 바꾸고 싶다면 다음과 같이 하면 된다.
map(sVal, 0, 1023, 0, 4095); |
이 함수들을 사용해서 PWM을 12비트 해상도로 변경하고 [0,1023]범위의 센서값을 PWM 으로 매핑하는 예는 다음과 같다.
analogWriteResolution(12); analogWrite(12, map(sensorVal, 0, 1023, 0, 4095)); |
여기서 sensorVal 변수에는 10비트 아날로그 센서값이 저장되었다고 가정한다.
PWM 주파수 변경
아두이노 Due의 PWM 주파수는 1KHz 로 정해져 있다. 그런데 응용 분야에 따라서 이 주파수를 변경해 주어야 하는 경우가 있다. 하지만 아두이노에서 PWM의 주파수를 바꿔주는 공식 API 는 없어서 무척이나 불편하다. 그래도 AVR 계열의 아두이노에서는 이런 불편을 해소하기 위해서 사용자가 작성한 라이브러리 (PWM.h)라도 있는 것 같은데 Due의 경우에는 아직까지 그런 라이브러리는 없는 것 같다.
구글링을 해본 결과 아주 방법이 없는 것은 아니었다. 일단 다음의 헤더 파일을 연다.(윈도의 경우)
Program Files > Arduino > hardware > arduino > sam > variants > arduino_due_x > variant.h
64비트 윈도라면 Program Files(x86) 폴더 밑을 뒤져야 한다. 이 파일을 열면 다음과 같이 정의된 부분이 나온다.
/** PWM*/#define PWM_INTERFACE PWM#define PWM_INTERFACE_ID ID_PWM#define PWM_FREQUENCY 1000#define PWM_MAX_DUTY_CYCLE 255#define PWM_MIN_DUTY_CYCLE 0#define PWM_RESOLUTION 8 |
이 상수값들을 변경하면 PWM의 주파수나 기본 분해능을 설정할 수 있다고 한다. 예를 들어서 주파수를 10KHz로 변경하고 싶다면 PWM_FREQUENCY 를 10000 으로 바꾸면 된다.
[그림 3] dc모터 실험 (2V 이상 인가되어야 회전이 시작됨)
조그만 장난감 모터는 1KHz 주파수로도 충분하다. 필자가 가지고 있는 모터는 조금 용량이 큰데 (12V/12.9W) 이 정도만 되도 주파수를 조금 키워야 한다. 몇 번 실험해보니 12KHz 정도가 적당한 것 같다.
'하드웨어 > 아두이노' 카테고리의 다른 글
NewPing 라이브러리로 HR04 초음파 센서 거리 측정하기 (0) | 2015.10.05 |
---|---|
갈릴레오(galileo) 보드 개요 (1) | 2015.06.15 |
아두이노 두에(Due) 보드 개요 (2) | 2015.06.15 |
아두이노 사용자 라이브러리 작성 예 (part 2) (0) | 2015.06.12 |
아두이노 사용자 라이브러리 작성 예 (part 1) (0) | 2015.06.12 |