답변:
PWM 신호는 AVR 칩의 타이머에 의해 생성됩니다. 각 타이머는 2 개 또는 3 개의 서로 다른 핀에서 PWM 신호를 생성 할 수 있습니다. 각 핀은 자체 듀티 사이클을 가질 수 있지만 PWM 주파수를 공유합니다. 타이머의 클럭 소스를 변경하여 PWM 주파수를 변경할 수 있습니다. 기본적으로 CPU 클럭을 64로 나눈 값을 사용합니다. Arduino 초기화 코드에 의해 프리스케일러가 64로 설정되어 있습니다. 더 혼동을주기 위해 고속 PWM과 위상 보정 PWM의 두 가지 PWM 모드가 있습니다. 고속 PWM에서 타이머는 255로 카운트 된 다음 오버플로 된 후 0부터 시작합니다 (256 가지 상태). 위상 보정 PWM에서 타이머는 255로 카운트 된 다음 방향을 변경하고 아래쪽으로 0을 카운트하고 방향을 변경하는 등 (510 가지 상태)입니다.
Arduino Mega에는 5 개의 타이머, timer0-timer4가 있습니다. timer0은 millis 및 micros 기능에도 사용되므로 빠른 PWM을 사용하는 반면 다른 타이머는 위상 보정 PWM을 위해 구성됩니다. 결과적으로 핀마다 주파수가 다릅니다.
핀 4 및 13, 타이머 0으로 제어 : 16Mhz
/ 64/256 = 976.56Hz
타이머 1-4로 제어되는 다른 PWM 핀 : 16Mhz
/ 64/510 = 490.20Hz
계산은 다음과 같습니다. 클럭 / 프리스케일러 / PWM 모드 상태 수
다른 핀에 연결되는 타이머가 적다는 것을 제외하면 상황은 내가 아는 다른 모든 Arduino 보드와 동일합니다.
타이머 프리스케일러를 변경하여 PWM 주파수를 변경할 수 있습니다. 이 페이지를 참조하십시오 : http://playground.arduino.cc/Main/TimerPWMCheatsheet
타이머를 255와 다른 값으로 계산할 수도 있습니다. 8 비트 타이머에서는 출력 핀이 느슨해 지지만 16 비트 타이머에서는 입력 캡처 레지스터를 사용하여 TOP 값을 정의 할 수 있습니다. 입력 캡처 기능은 Arduino 커뮤니티에서 거의 사용되지 않는 기능이므로 놓칠 수 없습니다.
Arduino 라이브러리는 16 비트 타이머에서도 8 비트 해상도 만 사용할 수 있습니다. 더 높은 해상도를 원한다면 자체 아날로그 쓰기를 작성하거나 목적에 맞는 라이브러리를 사용해야합니다. Arduino Mega의 timer0과 timer2는 8 비트이고 나머지는 16 비트입니다.
프리스케일러 및 TOP 값 변경과 함께 최대 해상도를 사용하도록 16 비트 타이머의 모드를 변경하면 매우 넓은 범위의 PWM 주파수를 얻을 수 있습니다.
빠른 PWM 모드에서 프리스케일러를 1로 설정하고 TOP을 3으로 설정하면 달성 할 수있는 최대 주파수는 클록 / 4입니다. 더 낮은 값은 허용되지 않습니다. 그러면 2 비트 분해능의 4MHz PWM이 제공됩니다. 시간의 0 %, 25 %, 50 % 또는 75 % 일 수 있습니다. TOP 값이 높을수록 더 낮은 주파수에서 더 높은 해상도를 제공합니다.
자세한 설명은이 기사를 읽 거나 데이터 시트를 참조하십시오 .
Timer0와의 의지와 혼란의 프리스케일러, PWM 모드, 또는 TOP 값 변경 millis()
등을 micros()
.