jfpoilpret의 대답은 매우 잘 작성되어 있으며 완벽하게 유효하며 99 %의 경우 나는 그가 설명하는 것을 정확하게 할 것입니다. 그의 솔루션은 정의 된 매개 변수 내에 있으므로 매우 잘 작동합니다. 그러나 " 아주 잘 " 보다 나은 것이 무엇 입니까? 완전! 결국 문제는 정확한 값을 생성하는 것입니다. 대부분의 경우 (충분히 모두) 충분하다고 말했듯이 1 초가 1 초가되어야 할 때 시계로 무언가를 처리 할 때조차도 상속 된 부품 결함을 겪어야합니다.
내가 제안하는 것이 항상 가능한 것은 아닙니다. 어떤 경우에는 가능하지만이 경우보다 훨씬 많은 노력과 노력이 필요합니다. 가치는 사례별로 의존 하는가? 저의 목표는 대체로 다소 까다로운 경우에 더 나은 미래의 참조에 대한 대안을 제시하는 것입니다. 이것은 Arduino의 초보 사용자를 대상으로 작성되었으며 전자 제품에 대한 광범위한 경험이 없습니다.
상급자에게는 아마도 너무 장황하고 멍청하게 보일 것입니다. 그러나 나는 똑같은 사람들이 이미 그것을 알고 있으며이 답변이 필요하지 않다고 생각합니다. 이는 모든 마이크로 컨트롤러 및 모든 제조업체 및 아키텍처에도 적용됩니다. 그러나 다른 마이크로 컨트롤러의 경우 올바른 레지스터와 프리 스케일 이름 및 값을 찾으려면 올바른 데이터 시트를 참조해야합니다.
귀하의 경우 특정 주파수가 필요하며 그에 대한 좋은 점은 실제로 56 kHz가 실제로 매우 쉽게 달성 될 수 있다는 것입니다 (부품의 실제 결함을 계산하지 않음). 따라서 이것은 완벽한 사례입니다.
신호 생성은 jfpoilpret의 설명에 따라 마이크로 컨트롤러의 타이머 및 클럭 소스에 따라 다릅니다. 그의 대답은 한 가지 관점의 문제만을 다루며 타이머를 다루고 있습니다. 그러나 클럭 소스로 바이올린을 피우거나 시너지 효과와 멋진 결과를 모두 얻을 수 있습니다. 환경의 매개 변수를 변경 하여이 경우 시스템을 해킹하고 클럭 소스를 교체하면 훨씬 쉽고 편리하게 특정 문제를 해결할 수 있습니다.
먼저 핀 상태를 토글하기 때문에 신호 주파수보다 2 배 더 높은 ISR을 실행해야합니다. 초당 112,000 회입니다. 56,000과 16,000,000은 이미 지적한 것처럼 훌륭하게 합치 지 않습니다. 신호 주파수 또는 택트 주파수를 변경해야합니다. 불변 신호 주파수를 다루고 더 나은 클럭 속도를 찾아 보자.
0을 추가하기 때문에 56kHz (또는 112kHz)보다 큰 차수의 클럭을 선택하는 것이 가장 간단합니다.이 종류의 수학은 대부분의 사람들에게 가장 간단합니다. 불행히도이 세상의 모든 것은 무언가와 타협합니다. 모든 가치가 효과가있는 것은 아닙니다.
첫 번째 예는 택트 제너레이터 속도가 너무 낮은 경우입니다.
56,000Hz 클록을 선택하면주기마다 ISR을 호출해야하며 다른 작업을 수행 할 수 없으므로 아무 것도 수행 할 수 없습니다. 전혀 쓸모가 없습니다. 10 배 빠른 속도 (560 kHz)를 선택하면 9 (타이머가 최대 값에 도달하기 위해 10 사이클-ISR 기능을 호출하기위한 1 사이클)의 마이크로 컨트롤러 사이클로 작업을 수행 할 수 있으며 이는 충분하지 않을 수 있습니다. 종종 더 많은 계산 능력이 필요합니다.
반면에 너무 큰 값을 선택하면 56MHz로 마이크로 컨트롤러가 작동하지 않습니다. 너무 빠릅니다. 따라서 상점에서 가장 큰 가치를 선택하는 것만으로는 가치가 떨어질 수 없습니다.
오리지널 아두 이노 우노 R3는 16 MHz의 스톡 클록을 가지고 있으므로 동작이 느려질 수 있습니다. 다음으로 56보다 크고 16MHz보다 작은 다음 값은 5.6MHz입니다. 이를 통해 50 사이클마다 ISR을 호출 할 수 있으며 112,000Hz 타이머 주파수를 완벽하게 만들 수 있습니다. 신호는 정확히 56kHz입니다. ISR 호출간에 프로그램을 실행하기 위해 49 개의 MCU주기가 있지만 여전히 원래 클럭 속도의 1/3 정도입니다. 112를 기본으로 사용하고 11.2 MHz 클럭을 사용할 수 있으며 이것은 16 MHz 공진기의 약 2/3를 제공합니다. ISR 기능은 100 사이클마다 호출되며 여전히 완벽한 56 kHz 신호를 생성합니다.
그러나이 값에는 두 가지 주요 문제가 있습니다.
첫 번째 문제는 사용자의 요구에 따라 크게 다릅니다. 찾기 쉬운 레지스터 값 (OCR iirc ) 을 사용하는 정확한 신호 주파수를 얻기 위해 최대 계산 전력의 약 1/3 (11.2MHz)을 희생합니다 . 당신은 그것에 괜찮을 수도 있고 그렇지 않을 수도 있습니다.
두 번째 문제는 어려운 쇼 토퍼입니다 . 값을 찾는 것은 매우 쉽지만 종종 제조 된 클럭 소스로는 존재하지 않습니다. 이것은 단지 5.6 MHz와 11.2 MHz가 모두없는 Farnell의 공진기 웹 페이지 입니다.
이를 피하기 위해 사용 가능한 공진기 값을보고 정확히 원하는 값을 생성하는 데 사용할 수있는 다른 것을 찾을 수 있습니다. 56을 4로 나누면 14가되고 운 좋게도 14 MHz 공진기가 있습니다. 이것은 우리에게 훨씬 더 빠른 속도와 더 많은 파워를 제공하며 레지스터 값을 찾기가 쉽습니다. ISR을 초당 112,000 회 호출하려면 OCR 레지스터에 10 진수 124 또는 16 진 0x7C 값을 넣어야하므로 ISR 호출을 위해 124 사이클 + 1을 세면 원하는 완벽한 값을 얻을 수 있습니다.
NB
- ISR-인터럽트 서비스 루틴 (생성 된 인터럽트에서만 실행되는 코드)
- 프로그램 크기는 메모리 크기에 따라 다릅니다! 클럭 속도와 관련이 없으며 ISR을 호출하는 빈도와는 관련이 없습니다.
마이크로 컨트롤러가 프로그램 명령으로 시작하면 카운터가 증가합니다. 인터럽트가 발생하면 ISR이 호출되고이 값은 특수 레지스터에 저장됩니다. ISR 코드가 완료되면 프로그램 카운터의 값이이 특수 레지스터에서 복원되고 프로그램은 마치 발생한 적이없는 것처럼 중단 된 위치부터 계속됩니다.
나는 매우 바보 같은 예를 제시 할 것이다. 당신이 순수 주의자라면, 나는 당신에게 경고합니다 : 코와 눈 출혈이 발생할 수 있습니다.
어딘가에서 다른 곳으로 걸어 가야한다고 상상해보십시오. 단계별 경로 지침은 기본 프로그램 및 해당 명령입니다. 걷거나 달리는 속도는 "클럭 속도"에 따라 다르지만 경로 지침 (30 걸음 앞으로, 1 회전 90도 왼쪽, 10 걸음 앞으로, 45 단계 오른쪽 등)에 따라 다릅니다. . 이제 작은 꼬마 나 욕심이 부패한 지역 정치인이 지금 당신의 신발을 풀고 있다고 상상해보십시오. 인터럽트를 발생시키는 이벤트입니다. 그런 다음 마지막 단계를 마친 후에 무릎을 꿇고 신발을 다시 묶으십시오. 이것은 당신의 ISR 프로그램입니다.
그런 다음 중단 한 곳에서 계속하십시오. 당신은 처음부터 시작하지 않습니다. 세상을 돌보지 않고 항상 걸을 때는 신발을 매 단계마다 묶어야하더라도 신경 쓰지 않아도됩니다. 그러나 올림픽에서 100 미터를 달리거나 굶주린 살을 먹는 포식자에서 달리는 등 시간 제약이있는 경우 신발을 멈추고 묶는 것은 심각한 결과를 초래할 수 있습니다. 마이크로 컨트롤러도 마찬가지입니다. 한 줄의 코드 만 실행하더라도 프로그램은 느리지 만 계속 진행됩니다. 속도에 전혀 신경 쓰지 않는다면 문제가되지 않습니다. 다른 타이머 종속 작업을 사용하는 것과 같이 시간과 관련하여 시간을 내야하는 경우 간섭이 매우 원치 않으며 문제가 될 수 있습니다.
더 적은 것입니다! 더 빠른 시계가 항상 좋은 것은 아닙니다. 클럭이 느린 장치는 훨씬 적은 전력을 사용합니다. 이것은 배터리로 작동되는 장치에서 중요한 포인트가 될 수 있습니다.
필요한 사이클은이 공식에서 파생됩니다.
(클럭 속도 / (프리스케일러 값 * 필요한 ISR 호출 주파수))-1