일부 핀의 PWM 주파수가 다른 이유는 무엇입니까?


답변:


23

그것들은 PWM 신호에 사용할 수있는 유일한 주파수는 아닙니다. 그러나 적용된 프리스케일러에 의해 결정된 주파수입니다 (아래에서 자세히 설명하는 것처럼 쉽게 변경할 수 있음).

3 쌍의 PWM 핀 각각은 다음과 같이 하나의 타이머에 연결되며 각 타이머에는 고유 한 기본 주파수가 있습니다.

  • 핀 5와 6은 62500Hz의 기본 주파수로 timer0에서 페어링됩니다.
  • 핀 9와 10은 타이머 1에서 짝을 이루며 기본 주파수는 31250Hz입니다.
  • 핀 3과 11은 타이머 2에서 페어링되며 기본 주파수는 31250Hz입니다.

그런 다음 각 핀 세트에는 선택할 수있는 다수의 프리스케일러 값이 있으며, 이는 해당 핀 쌍의 기본 주파수를 나눕니다. 사용 가능한 프리스케일러 값은 다음과 같습니다.

  • 핀 5와 6의 프리스케일러 값은 1, 8, 64, 256 및 1024입니다.
  • 핀 9와 10의 프리스케일러 값은 1, 8, 64, 256 및 1024입니다.
  • 핀 3과 11의 프리스케일러 값은 1, 8, 32, 64, 128, 256 및 1024입니다.

다른 조합은 주어진 PWM 핀에서 다른 주파수를 생성합니다. 타이머 2 (핀 3 및 11에 연결됨)에는 사용 가능한 프리스케일러 값이 더 많으므로 더 많은 주파수를 사용할 수 있습니다.

이제 타이머 2가 다른 이유는 별도의 질문입니다.

편집 : 다음은 핀당 가능한 PWM 주파수 목록입니다 ( 이 기사에서 ).

핀 6 및 5 (OC0A 및 OC0B)의 경우 :

  • TCCR0B = xxxxx001 인 경우 주파수는 64kHz입니다
  • TCCR0B = xxxxx010 인 경우 주파수는 8kHz입니다.
  • TCCR0B = xxxxx011 인 경우 주파수는 1kHz입니다 (Diecimila 부트 로더에서 기본값 임).
  • TCCR0B = xxxxx100이면 주파수는 250Hz입니다
  • TCCR0B = xxxxx101 인 경우 주파수는 62.5Hz입니다.

핀 9, 10, 11 및 3 (OC1A, OC1B, OC2A, OC2B)의 경우 :

  • TCCRnB = xxxxx001 인 경우 주파수는 32kHz입니다
  • TCCRnB = xxxxx010 인 경우 주파수는 4kHz입니다.
  • TCCRnB = xxxxx011 인 경우 주파수는 500Hz입니다 (Diecimila 부트 로더에서 기본값 임).
  • TCCRnB = xxxxx100이면 주파수는 125Hz입니다
  • TCCRnB = xxxxx101 인 경우 주파수는 31.25Hz입니다.

TCCRnB설정 하려는 타이머에 따라 timer의 프리스케일러 비트를 0, 1 또는 2로 n대체 n하는 위치입니다. 비트 단위 연산이 여전히 확실하지 않은 경우이 비트 수학 학습서를 읽으십시오 .

내 출처 :

9 번과 10 번 핀이 5 번과 6 번이나 3 번과 11 번과 같은 동작을하는지의 여부에 대해서는 소스에서 차이가있는 것처럼 보이지만 어쨌든 아이디어를 얻습니다. 나는 어느 것이 올바른지 또는 이것이 보드 간의 차이점인지 여부를 알아 내려고 시도하기 위해 datashet을 읽고 있습니다.


1
이 답변은 무엇을 의미합니까? 나는 확인하지 않았지만 컨트롤러마다 약간 다릅니다.
jippie

@jippie 좋은 지적! 출처는 ATmega168 및 328을 참조하십시오.
Ricardo

@jippie 명확하게 말하면, 내 대답에서 핀 번호는 IC가 아닌 Uno 보드 (예 : 핀 1은 디지털 핀 1 또는 D1을 의미 함)에 할당되는 방식을 나타냅니다 (ATmega328 핀 1이 재설정 됨).
Ricardo

1
나는 보드, Uno, Duemilanove, Mega, ...와 같은 세부 사항도
바뀌 었다고 생각합니다

@jippie 물론입니다.
Ricardo

8

설계 고려 사항은 알지 못하지만 Arduino의 마이크로 컨트롤러에 대한 데이터 시트를 확인하면 PWM 핀이 함께 그룹화되어 있고 그룹 당 타이머에 연결된 것을 알 수 있습니다. 이 타이머가 증가하는 속도는 구성된 프리스케일러에 따라 다릅니다. 특정 타이머의 프리스케일러를 변경하면 관련 PWM 핀의 PWM 주파수가 변경됩니다. millis();함수 와 같은 다른 목적으로 일부 타이머가 두 배라고 생각 합니다. 해당 타이머의 프리스케일러를 변경하면 반환 된 값 millis()이 같은 요인에 의해 해제됩니다.

다음과 같이 프리스케일러 설정을 계산할 수 있습니다.

$$ \ text {prescaler} = \ dfrac {f_ {CPU}} {PWMresolution × f_ {PWM}} = \ dfrac {16 \ text {MHz}} {256 × 490} \ 약 128 $$

프리스케일러 = f [CPU] / (PWM 분해능 × f [PWM]) = 16000000 / (256 × 490) = 약 128.

데이터 시트를 확인하면 128이 실제로 선택할 수있는 프리스케일러 값 중 하나라는 것을 알 수 있습니다.


2
우리는 MathJax를 그리워합니까? 베타 버전을 사용하도록 설정했으면합니다.
Ricardo

1
@Ricardo 브라우저에 MathJax 버튼이 있습니다; o) meta.arduino.stackexchange.com/questions/13/…
jippie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.