Ich spiele gerade mit Arduinos Hardware-Timern und mir kam eine Frage in den Sinn. Lassen Sie es mich ein wenig erklären.
Nehmen wir an, ich möchte, dass eine bestimmte Funktion alle 1024 Takt-Ticks ausgeführt wird. AFAIK, ich könnte dies auf verschiedene Arten erreichen, indem ich mit dem Prescaler-Wert für Timer2 und dessen CTC spiele:
- Setzen Sie den Prescaler auf 1 und den CTC auf 1024
- Stellen Sie den Prescaler auf 8 und den CTC auf 128 ein
- ...
- Setzen Sie den Prescaler auf 1024 und den CTC auf 1.
All diese Wege würden erreichen, was ich will, aber welcher ist effizienter? Oder spielt es überhaupt keine Rolle?
Vielen Dank im Voraus für das Teilen Ihres Wissens: P.
OCR2A
, wobei die tatsächliche Periode(OCR2A+1)×prescaler
CPU-Zyklen sind. Wenn Sie also den Vorteiler auf 8 setzen, müssen Sie einstellenOCR2A=127
.Antworten:
Wenn die Anzahl der Takte (hier 1024), die Timerbreite und die verwendete MCU-Uhr konstant sind (ein fester Wert), würde ich nicht die letzte Option wählen, dh Prescalar 1024 und CTC von 1. Hier sind meine Gründe (speziell für Arduino)
1) Wenn CTC nahe Null ist (wie 1-> 10), verhält sich der Timer manchmal so, als wäre der Zähler Null und gibt eine Rechteckwelle (mit einem Tastverhältnis von 50%) mit der Hälfte der angeforderten Frequenz aus. Machen Sie CTC also einigermaßen groß. Die erneute Auswahl einer hohen Taktfrequenz (vor Skalar 1) kann jedoch auch eine verringerte Genauigkeit aufweisen. Eine Zwischenoption finde ich besser.
2) Wenn sich die CTC-Anzahl in einem Prozess dynamisch ändert, sollte der Timer-Vorskalar so ausgewählt werden, dass die CTC-Anzahl über den gesamten Prozess immer kleiner oder gleich der Timer-Breite ist.
Das heißt, die maximale Anzahl von Timer-Ticks sollte vom Timer mit der angegebenen Breite bequem berücksichtigt werden. Auch hier tritt wieder das gleiche Dilemma auf, dann ist die Auswahl anhand von Punkt 1 besser.
Wenn dies nicht ausreicht, besteht meiner Meinung nach nur die Möglichkeit, jeden Fall physisch umzusetzen und zu überprüfen, welche Kombination die besten Ergebnisse liefert. Praktische Ergebnisse sind meiner Meinung nach zuverlässiger (möglicherweise erhalten Sie eine Board-spezifische, effiziente Kombination!)
quelle
Es gibt einen Kompromiss zwischen Auflösung und erreichbaren Frequenzen. Sie erwähnen Timer 2, aber beim Atmega328P ist Timer 2 ein 8-Bit-Timer, sodass Sie den CTC nicht auf 1024 einstellen können.
Nehmen wir an, wir sprechen von einem 16-Bit-Timer wie Timer 1 auf dem Atmega328P. Mit einem Prescaler von eins können Sie (unter der Annahme eines 16-MHz-Takts) eine Zeit von 1 bis 65536 "Ticks" einstellen, dh 62,5 ns bis zu 4096 µs.
Dies wäre die genaueste Messung, da Sie einen (Prozessor-) Takt-Tick pro Timer-Tick (einen Prescaler von einem) verwenden.
Wenn Sie jedoch eine Zeit von mehr als 4,096 ms einplanen möchten, müssen Sie den Vorteiler hochfahren. Der nächste Vorteiler für Timer 1 ist 8, sodass Sie jetzt ein 8-mal so langes Intervall (32768 µs) einstellen können. Ihre Genauigkeit (Präzision) hat sich jedoch um den Faktor 8 verringert. Die Granularität des Timers hat sich von 62,5 erhöht ns bis 62,5 * 8 ns, was 500 ns entspricht.
Wenn Sie länger als 32,768 ms Zeit benötigen, muss der Vorteiler wieder größer sein, der nächste ist 64. Jetzt können Sie bis zu 262144 µs messen, jedoch mit einer Granularität von 62,5 * 64, was 4000 ns (4 µs) entspricht ).
Mein Vorschlag wäre, den niedrigsten Prescaler zu verwenden, den Sie können, aber trotzdem das gewünschte Intervall zu erhalten. Sie können also offensichtlich keinen Prescaler von 1 bis 10 ms verwenden.
Ich habe eine Diskussion über Timer auf http://www.gammon.com.au/timers .
Auf dieser Seite befindet sich ein Diagramm, mit dessen Hilfe die Auswirkungen verschiedener Vorskalierer dargestellt werden können:
Der obere Teil (Anzahl eins) gibt Ihnen effektiv die Granularität jedes Vorteilers. Beispielsweise hat ein Prescaler von 256 eine Granularität von 16.000 ns (16 us). Bestimmte Frequenzen (Potenzen von 2) eignen sich für Kombinationen (z. B. Prescaler von 1 mit einer Anzahl von 256 oder Prescaler von 256 mit einer Anzahl von 1).
Bei Frequenzen, die diese Eigenschaft nicht haben, ergibt der kleinere Vorteiler (sofern er verwendet werden kann) eine feinere Granularität.
quelle