에 대한 Arduino 기준에analogWrite()
따르면 대부분의 핀에서 PWM 주파수는 ~ 490Hz입니다. 그러나 Uno의 핀 5와 6, Leonardo의 핀 3과 11의 경우 ~ 980Hz입니다.
왜 이것들이 다른가요? 의도적 인 디자인 기능입니까, 아니면 하드웨어에 의해 결정됩니까?
에 대한 Arduino 기준에analogWrite()
따르면 대부분의 핀에서 PWM 주파수는 ~ 490Hz입니다. 그러나 Uno의 핀 5와 6, Leonardo의 핀 3과 11의 경우 ~ 980Hz입니다.
왜 이것들이 다른가요? 의도적 인 디자인 기능입니까, 아니면 하드웨어에 의해 결정됩니까?
답변:
그것들은 PWM 신호에 사용할 수있는 유일한 주파수는 아닙니다. 그러나 적용된 프리스케일러에 의해 결정된 주파수입니다 (아래에서 자세히 설명하는 것처럼 쉽게 변경할 수 있음).
3 쌍의 PWM 핀 각각은 다음과 같이 하나의 타이머에 연결되며 각 타이머에는 고유 한 기본 주파수가 있습니다.
그런 다음 각 핀 세트에는 선택할 수있는 다수의 프리스케일러 값이 있으며, 이는 해당 핀 쌍의 기본 주파수를 나눕니다. 사용 가능한 프리스케일러 값은 다음과 같습니다.
다른 조합은 주어진 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을 읽고 있습니다.
설계 고려 사항은 알지 못하지만 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이 실제로 선택할 수있는 프리스케일러 값 중 하나라는 것을 알 수 있습니다.