Arduino에서 PWM 출력의 주파수는 얼마입니까


22

analogWrite ()를 사용할 때 Arduino가 일반 PWM에 어떤 주파수를 사용합니까?

Arduino 모델마다 다른가요? 특히 Mega 2560에 관심이 있지만 모델간에 일관성이 있는지 알고 싶습니다.

나는 500Hz를 사용하여 Arduino에 대한 전달 참조를 보았습니다.


또한 사용중인 핀에 따라 다릅니다.
Gerben

답변:


31

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().


1
그렇다면 PWM에 대해 얻을 수있는 가장 빠른 주파수는 16Mhz / 256 (prescaler = 1) 또는 62.5Khz입니까?
Duncan C

또한 PWM 주파수는 62.5KHz의 짝수 요소 여야합니까? 다른 스레드의 누군가가 4 핀 PC 팬의 팬 속도를 제어하려고했습니다. 분명히 25KHz의 PWM 제어 신호를 원합니다. 62.5 / 25는 2.5이며 정수 값이 아닙니다.
Duncan C

특정 주파수 달성 가능성에 대해 자세히 설명하기 위해 답변을 업데이트했습니다.
user2973

저주파수 엔드에서는 위상 보정 모드에서 16 비트 타이머를 1024 프리스케일러로 프리 스케일하여 16e6 / 1024 / 2 ^ 16 / 2 = 0.119Hz 또는 7.1 사이클 / 분을 얻을 수 있습니다. 그보다 낮 으면 millis ()와 같은 것을 기반으로 비트를 토글해야합니다. 또는 외부 입력 핀 T?의 카운터를 트리거 할 수도 있습니다.
Dave X
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.