Ich versuche, Timer1 des Atmel AVR-Mikrocontrollers, entweder AtMega328, wie er im Arduino verwendet wird, oder ATTiny85 zu verwenden, um zwei Taktsignale auszugeben, die Spiegelbilder voneinander sind. Die Frequenz, die ich zu erzeugen versuche, ist eine Variable von 1 MHz bis 2 MHz oder mehr, die zu hoch ist, um dies mithilfe von Code zum Umschalten der Ausgangspins zu tun, es sei denn, ich möchte fast nichts anderes im Controller tun. Daher möchte ich den Timer-Ausgang direkt an den zugehörigen Pins verwenden. Ich verwende die GCC-Toolchain, die nicht durch Arduino-Bibliotheken oder -Sprachen eingeschränkt ist.
Mit Timer1 im Atmega328 sind zwei Pins verbunden, und ich kann zwei identische 1-MHz- bis 2-MHz-Signale aus ihnen herausholen. Obwohl das Datenblatt zu sagen scheint, dass ich eine invertierte Wellenform erhalten kann, verwirrt es mich. Ich bin auch in der Lage, zwei Signale mit unterschiedlichen Arbeitszyklen bei 1 MHz zu erhalten, indem ich die PWM-Einstellungen mit Timer1 verwende, aber beide Signale gehen gleichzeitig hoch, das kürzere geht früher niedrig. Dies dient nicht meinem Projekt. Ich brauche nicht einmal die PWM-Impulsbreitenvariation, ich brauche nur zwei identische "Takt" -Signale mit entgegengesetzter Phase, das ist alles.
Ich fordere niemanden auf, Code zu schreiben, damit ich dies tun kann. Ich brauche nur jemanden, der mir sagt, welcher Modus / welche Flags des Timers mir eine einfache invertierte Wellenform auf einem der beiden dem Timer zugeordneten Pins geben sollen. Wenn möglich, möchte ich die Verwendung einer externen Invertierungsschaltung für einen der Ausgänge vermeiden, es sei denn, dies ist nur eine Option.
Wenn dies im ATTiny überhaupt möglich ist, ist das sogar noch besser. Das ATTiny hat auch 2 Pins, die einem Timer zugeordnet sind, aber ich bin nicht sicher, ob es die gleichen Optionen wie das ATMega hat.
Ich habe bereits einen 20-MHz-Quarz und Kondensatoren auf der Leiterplatte angeschlossen, und der 20-MHz-Takt arbeitet zuverlässig auf dem ATMega328. Auf der ATTiny85-Platine habe ich einen 8-MHz-Quarz und das funktioniert auch zuverlässig.
Bitte helfen Sie. Vielen Dank.
UPDATE : Es gibt einige ungültige Annahmen in den Antworten und Kommentaren, daher sollte ich vielleicht klarstellen: Beachten Sie, dass ich in meinem ursprünglichen Beitrag angegeben habe, dass ich einen 20-MHz-Takt verwende, nicht 8 MHz , und dass ich auch kein PWM benötige .
Der einzige Modus, der eine ausreichend hohe Ausgangsfrequenz liefert, scheint der CTC-Modus zu sein, da die PWM-Modi für einen 2-MHz-Ausgang nicht funktionieren. Gibt es eine Möglichkeit, entweder Timer 1-Ausgang A oder Ausgang B im CTC-Modus zu invertieren?
Ich habe jetzt zu einem Standard-Arduino Uno (ATMega328, 16 MHz) anstelle meiner eigenen 20-MHz-Karte gewechselt, um meinen Code zu überprüfen, und dies ist mein Code für einen schönen stabilen 2-MHz-Takt im CTC-Modus von den Pins 9 und 10, dem Timer 1 Ausgangspins:
#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() {
}
Die Oszilloskopspuren für beide Pins sind identisch und synchron. Wie kann ich eines der beiden Signale invertieren? Der Invertierungsmodus im Datenblatt scheint im CTC-Modus nichts zu bewirken. Lese ich das Datenblatt falsch oder bin ich schließlich gezwungen, einen niedrigeren Frequenz- und PWM-Modus zu verwenden?
So fügen Sie meiner ursprünglichen Abfrage eine bestimmte "Kopfgeld" -Frage hinzu:
Welche Änderungen muss ich an meinem obigen Code vornehmen, damit er perfekt invertierte Signale an Pin 9 und 11 mit der höchstmöglichen Frequenz für einen 16-MHz-Takt liefert , ob das ist 2 MHz oder nicht?
Ich werde mich vorerst an ein Standard-Arduino-Uno halten, damit kein Fehlermodus von meinem selbstgesponnenen Board eingeführt wird und jeder mit einem Arduino meinen obigen Code ausprobieren und bestätigen kann, dass er wie erwähnt funktioniert und nicht wie ich brauchen!