Sollte ich beim Einstellen von Hardware-Timern als Interrupts einen niedrigeren Prescaler-Wert oder einen niedrigeren CTC bevorzugen?


7

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:

  1. Setzen Sie den Prescaler auf 1 und den CTC auf 1024
  2. Stellen Sie den Prescaler auf 8 und den CTC auf 128 ein
  3. ...
  4. 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.


1
Größere Prescaler-Werte führen zu einer geringfügigen Verringerung des Stromverbrauchs, da alle an den Ausgang des Prescaler angeschlossenen Schaltkreise mit einer niedrigeren Frequenz schalten und der Stromverbrauch proportional zu cv ^ 2 f ist.
Alex. Forencich

CTC ist keine Zahl, sondern eine Betriebsart des Zählers (Modus 2). Sie stellen die Periode des Timers durch Einstellen ein OCR2A, wobei die tatsächliche Periode (OCR2A+1)×prescalerCPU-Zyklen sind. Wenn Sie also den Vorteiler auf 8 setzen, müssen Sie einstellen OCR2A=127.
Edgar Bonet

Antworten:


2

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!)


1
Ich sehe keine vernünftige Ursache für die Bestätigung Ihrer Bemerkung zu niedrigen CTC-Werten, die die Genauigkeit beeinträchtigen könnten. Insbesondere das "Manchmal verhält sich Timer ..." ist offensichtlich falsch: Warum würden Timer in der AVR-Architektur in diesem Fall kein wiederholbares Verhalten haben?
jfpoilpret

Ich sagte, dass niedrige Vorskalare (keine CTC-Werte) die Genauigkeit verringern können. Niedrige CTC-Werte können zu unerwünschten Ausgaben von Timern führen.
Janakiram

"Manchmal" bedeutet hier für "einige Bretter" von Arduino. Ich habe dieses Wort verwendet, weil für ein bestimmtes Board keine Frage gestellt wurde. Ich habe viele Male mit 'Arduino Due'-Timern gearbeitet, mit einer Timerfrequenz von 10,5 MHz, und wenn ich eine CTC-Zählung von weniger als 15 (oder in der Nähe) Timern gab, bekam ich eine Rechteckwelle. Ein offensichtlicher Grund ist, dass die Zählung als Null angenommen wird. Dies ist keine mathematische, sondern eine praktische Beobachtung. Wie gesagt, ich habe nur mit 'Due' für meinen Zweck gearbeitet, der ein ARM ist (kein AVR mit geringeren Taktfrequenzen, die in Arduino verwendet werden), und daher ist die Verwendung von 'manchmal' meiner Meinung nach gültig.
Janakiram

2

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:

Timer und Vorskalierer

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.


Die Verwendung eines höheren Vorteilers verliert überhaupt keine Präzision. Sie erhalten zwar eine größere Granularität, aber wenn Sie eine Zykluszahl anstreben, die eine Zweierpotenz ist (wie in der Frage), ist die Granularität kein Problem.
Edgar Bonet

Wenn nicht, können Sie mit dem unteren Vorteiler näher an das Ziel heranrücken. Angenommen, Sie möchten 30 Taktzyklen messen. Mit einem Prescaler von 1 können Sie die Nummer 30 direkt eingeben. Ein Prescaler von 8 bedeutet, dass Sie 30/8 (3,75) verwenden müssen, die Sie nicht direkt in das Register eingeben können, wodurch die Genauigkeit verloren geht.
Nick Gammon

Die Frage wurde mit 1024 Zählungen formuliert, daher gelten meine Bemerkungen nicht dafür, aber ich habe versucht, eine allgemeinere Antwort zu geben, falls die Tatsache, dass 1024 ein ziemlich spezieller Fall ist, nicht offensichtlich war.
Nick Gammon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.