아두 이노는 타이머의 일부 초기화를 수행합니다. Arduino는 시계를 64로 나누기 위해 세 타이머 모두에 대한 프리 스케일러를 초기화합니다. 타이머 0은 빠른 PWM으로 초기화되고 타이머 1과 타이머 2는 위상 올바른 PWM으로 초기화됩니다. 자세한 내용은 Arduino 소스 파일 배선.c를 참조하십시오. 타이머 0핀 5와 6을 관리하므로 몇 가지 예에서 pwm 주파수를 관리하는 방법을 보여 드리겠습니다. 안녕하세요, 다른 기사주셔서 감사합니다. 나는 여기에 질문이 있습니다. 2차 코드 예제 루프에서 `OCR0 = duty`로 구성됩니다. 루프 외부에서 한 번 수행하는 대신 루프에서 반복적으로 수행하는 감각이 있습니까? 내가 뭔가를 놓치고 있습니까? 며칠 전, 친구는 그가 Atmel ATmega328 마이크로 컨트롤러에서 빠른 PWM을 얻을 수 있는 방법-62.5 K Hz에서 빠른 내게 물었다. 놀랍게도 나는 이것에 대해 많은 기사와 포럼 게시물이 있음에도 불구하고 작업 코드 예제를 찾을 수 없었습니다.

물론 항상 uC의 데이터 시트를 참조 할 수 있지만 코드 부분이 항상 간단하지는 않습니다. 이제 빠른 PWM 파형을 살펴 볼 수 있습니다. 자세한 설명은 내 이전 튜토리얼에서 찾을 수 있습니다. 타이머는 여러 가지 모드로 복잡합니다. 주요 PWM 모드는 „빠른 PWM“과 „위상 올바른 PWM“이며, 아래에 설명됩니다. 타이머는 0에서 255까지 실행하거나 0에서 고정 값으로 실행할 수 있습니다. (16비트 타이머 1에는 최대 16비트의 타이머 값을 지원하는 추가 모드가 있습니다.) 각 출력을 반전할 수도 있습니다. 50 %의 듀티 사이클이있는 빠른 PWM 모드를 생성한다고 가정 해 봅시다 (OCRA 레지스터에 도달 할 때 설명 할 것입니다). 나는 ATMEGA32U4 (아두 이노 보드)를 사용하고, 나는 타이머에 문제가 직면하고있다, 나는 두 핀에 1 Hz에서 40 Hz의 신호를 생성하고 시간의 특정 기간으로 PWM 신호를 변경하려면 . 예 – 시간 | PIN9 주파수 | PIN9 PWM | PIN10 주파수 | PIN10 PWM | 대체 모드 듀티 사이클을 변경하지 않기 때문에 이 특정 예제에서는 중요하지 않습니다.

그래서 그래, 그것은 아마 루프 외부에서 수행되는 경우 더 좋을 것입니다. 모든 핀을 수동으로 PWMing에 대한 보다 정교한 예는 여기에서 찾을 수 있습니다. 수식 OCR0A =(fclk/2*N*fOCR0A) -1(첫 번째 수식이지만 재배열) 지정된 주파수를 원하는 경우 이 모드를 사용하여 OCR0A를 계산하고 프로그램에 도입합니다. 예를 들어 25kHz(그러나 50% 듀티 사이클)를 원하는 경우, 수식에서 프리스케일러를 사용하지 않는 경우 수식에서 OCR0A=319를 제공하고 타이머 0에는 8비트 OCR0A <= 255가 있기 때문에 OCR0A=39및 프리스케일러=8을 선택해야 합니다. 이 예제에서는 타이머가 0에서 180으로, 다시 0으로 이동하여 360클럭 주기가 걸립니다. 따라서 모든 것을 181로 나눈 빠른 PWM 케이스와 달리 모든 것이 180 또는 360으로 나뉩니다. 자세한 내용은 아래를 참조하십시오. 오프 바이 하나 당신은 빠른 PWM과 위상 올바른 PWM이 서로에 대해 오프 – 바이 – 하나 것 같다 것으로 나타났습니다 수 있습니다, 로 나누어 256 대 255 다양한 장소에서 하나를 추가.

설명서는 여기에 약간 불투명하므로 자세히 설명하겠습니다. 이 예제에서는 타이머가 0에서 180으로 이동하여 181 클럭 주기가 걸리므로 출력 주파수는 181로 나뉩니다.

fast pwm 예제