analogWrite ()를 사용할 때 Arduino가 일반 PWM에 사용하는 주파수는 무엇입니까?
그리고 Arduino 모델마다 다른가요? 특히 Mega 2560에 관심이 있지만 모델간에 일관성이 있는지도 알고 싶습니다.
나는 500Hz를 사용하여 Arduino에 대한 참조를 전달하는 것을 보았습니다. 정말 느린 것 같습니다.
댓글
- 또한 사용중인 핀에 따라 다릅니다.
답변
PWM 신호는 AVR 칩의 타이머에 의해 생성됩니다. 각 타이머는 2 ~ 3 개의 서로 다른 핀에서 PWM 신호를 생성 할 수 있습니다. 각 핀은 자체 듀티 사이클을 가질 수 있습니다. 그러나 그들은 PWM 주파수를 공유합니다. 타이머의 클럭 소스를 변경하여 PWM의 주파수를 변경할 수 있습니다. 기본적으로 64로 나눈 CPU 클럭을 사용합니다. Arduino 초기화 코드에 의해 프리스케일러가 64로 설정되어 있습니다. 더 혼동을주기 위해 두 가지 PWM 모드, 즉 빠른 PWM과 위상 보정 PWM이 있습니다. 고속 PWM에서 타이머는 255까지 카운트 된 다음 오버플로되어 0 (256 개 상태)에서 다시 시작됩니다. 위상 보정 PWM에서 타이머는 255까지 카운트 한 다음 방향을 변경하고 0으로 아래로 카운트하고 방향을 변경하는 등의 작업을 수행합니다 (510 개의 다른 상태).
Arduino Mega에는 timer0-timer4라는 5 개의 타이머가 있습니다. timer0은 millis 및 micros 기능에도 사용되기 때문에 빠른 PWM을 사용하는 반면 다른 타이머는 위상 보정 PWM 용으로 구성됩니다. 결과적으로 서로 다른 핀에서 서로 다른 주파수가 발생합니다.
-
핀 4 및 13, timer0 :
16Mhz / 64/256 = 976.56Hz -
타이머에 의해 제어되는 기타 PWM 핀 1-4 :
16Mhz / 64/510 = 490.20Hz
계산 : Clock / 프리스케일러 / PWM 모드 상태 수
다른 핀에 연결되는 타이머가 적다는 점을 제외하면 내가 아는 다른 모든 Arduino 보드의 상황은 동일합니다.
타이머 프리스케일러를 변경하여 PWM 주파수. 다음 페이지를 참조하십시오. http://playground.arduino.cc/Main/TimerPWMCheatsheet
타이머를 다음과 같이 계산할 수도 있습니다. 8 비트 타이머에서는 출력 핀이 풀리지 만 16 비트 타이머에서는 입력 캡처 레지스터를 사용하여 TOP 값을 정의 할 수 있습니다. 입력 캡처 기능은 Arduino 커뮤니티에서 거의 사용되지 않는 기능이므로 놓치지 않을 것입니다.
Arduino 라이브러리에서는 16 비트 타이머에서도 8 비트 해상도 만 사용할 수 있습니다. 더 높은 해상도를 원하면 자신 만의 analogWrite를 작성하거나 목적에 맞게 만들어진 라이브러리를 사용해야합니다. 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()
.
댓글
- 그러면 얻을 수있는 가장 빠른 빈도를 모았습니다. PWM의 경우 16Mhz / 256 (프리스케일러 = 1) 또는 62.5Khz입니까?
- 또한 PWM 주파수는 62.5KHz의 균등 계수 여야합니까? 다른 스레드의 누군가가 4 핀 PC 팬의 팬 속도를 제어하기를 원했습니다. 분명히 그것은 25KHz의 PWM 제어 신호를 원합니다. 62.5 / 25는 2.5로 정수 값이 아닙니다.
- 특정 주파수를 달성 할 수있는 가능성에 대해 더 자세히 설명하기 위해 답변을 업데이트했습니다.
- 저주파 쪽에서는 16e6 / 1024 / 2 ^ 16 / 2 = 0.119Hz 또는 7.1 사이클 / 분을 얻기 위해 1024 프리스케일러에 의해 위상 보정 모드에서 16 비트 타이머를 프리 스케일합니다. 그보다 낮은 경우 millis ()와 같은 것을 기반으로 비트를 토글해야합니다. 또는 외부 입력 핀 T?에서 카운터를 트리거 할 수도 있습니다.