Arduino에서 사용되는 AtMega328 또는 ATTiny85 인 Atmel AVR 마이크로 컨트롤러의 Timer1을 사용하여 서로 거울상 인 두 개의 클럭 신호를 출력하려고합니다. 내가 생성하려고하는 주파수는 컨트롤러에서 거의 아무것도하지 않으려는 경우 코드를 사용하여 출력 핀을 토글하기에 너무 높은 1MHz ~ 2MHz 이상의 변수입니다. 따라서 타이머 출력을 관련 핀에서 직접 사용하고 싶습니다. arduino 라이브러리 또는 언어로 제한되지 않는 GCC 툴 체인을 사용하고 있습니다.
Atmega328의 Timer1에는 두 개의 핀이 연결되어 있으며 두 개의 동일한 1MHz ~ 2MHz 신호를 얻을 수 있습니다. 데이터 시트에 역 파형을 얻을 수 있다고 말하지만 혼란 스럽습니다. 또한 Timer1의 PWM 설정을 사용하여 1MHz에서 듀티 사이클이 다른 두 개의 신호를 얻을 수 있지만 두 신호가 동시에 높을수록 더 짧은 신호는 더 일찍 낮아집니다. 이것은 내 프로젝트를 제공하지 않습니다. PWM 펄스 폭 변화도 필요하지 않으며 반대 위상의 동일한 두 개의 "클럭"유형 신호 만 있으면됩니다.
나는 누군가 에게이 작업을 수행하기 위해 코드를 작성하도록 요구하지 않고 타이머의 모드 / 플래그가 타이머와 관련된 두 개의 핀 중 하나에서 간단한 반전 파형을 제공해야한다고 알려주는 사람이 필요합니다. 가능하다면 옵션 중 하나가 아닌 한 출력 중 하나에 외부 반전 회로를 사용하지 않으려 고합니다.
ATTiny에서 이것이 가능하다면 훨씬 더 나을 것입니다. ATTiny에는 하나의 타이머와 관련된 2 개의 핀이 있지만 ATMega와 동일한 옵션이 있는지 확실하지 않습니다.
이미 20MHz 크리스털이 있고 커패시터가 PCB에 연결되어 있고 20MHz 클럭이 ATMega328에서 안정적으로 작동하고 있습니다. ATTiny85 PCB에는 8MHz 크리스털이 있으며 안정적으로 작동합니다.
도와주세요. 감사합니다.
업데이트 : 지금까지 답변과 의견에 잘못된 가정이 있습니다. 어쩌면 분명히해야합니다. 원래 게시물에서 8MHz가 아닌 20MHz 클록을 사용 하고 있으며 PWM이 필요하지 않다고 언급했습니다. .
PWM 모드가 2MHz 출력에서 작동하지 않기 때문에 충분한 출력 주파수를 제공하는 유일한 모드는 CTC 모드 인 것 같습니다 . CTC 모드에서 타이머 1 출력 A 또는 출력 B를 반전시키는 방법이 있습니까?
이제 코드를 확인하기 위해 20MHz 보드 대신 표준 Arduino Uno (ATMega328, 16MHz)로 전환했으며, 이는 9 번과 10 번 핀의 CTC 모드에서 타이머가 안정적으로 유지되는 2MHz 클록 인 타이머 인 Timer입니다. 1 개의 출력 핀 :
#define tick 9
#define tock 10
void setup() {
pinMode(tick, OUTPUT);
pinMode(tock, OUTPUT);
TCCR1A = _BV(COM1A0) | _BV(COM1B0) ; // activate both output pins
TCCR1B = _BV(WGM12)| 1; // set CTC mode, prescaler mode 1
// various frustrating attempts to invert OC1B failed. What do I put here?
OCR1A = 3; // set the counter max for 2 MHz
}
void loop() {
}
두 핀의 오실로스코프 트레이스는 동일하고 동기화되어 있습니다. 두 신호 중 하나를 반전 시키려면 어떻게해야합니까? 데이터 시트의 반전 모드는 CTC 모드에서 아무 것도 수행하지 않는 것 같습니다. 데이터 시트를 잘못 읽었습니까, 아니면 더 낮은 주파수와 PWM 모드를 사용해야합니까?
내 원래의 쿼리에 특정 "현상금"질문을 추가하려면 :
그래서 무엇 변경 나는 그것이 핀 (9) 및 상기 (11)에서 완벽하게 반전 신호를 제공하기 위해, 위의 내 코드에해야 할 16 MHz 클럭을위한 가장 높은 주파수를 여부, 즉 2MHz입니까?
나는 표준 Arduino Uno를 고수 할 것입니다. 따라서 내 홈 보드에서 오류 모드가 도입되지 않으며 arduino를 가진 사람은 위의 코드를 시도하고 내가 언급 한대로 작동하는지 확인할 수 있습니다. 필요한 것!