Impulse über Timer-Match-Ausgang oder Timer-ISR erzeugen?

Ich verwende LPC1778 uC für ein Projekt und möchte wissen, was der Unterschied zwischen der Erzeugung von Impulsen über die Timer-Match-Ausgabe und dem Umschalten eines Pins in einer Timer-ISR ist. Was sind die Vor- und Nachteile beider Ansätze? Welcher würde genauere Impulse erzeugen? Oder gibt es keinen Unterschied zwischen ihnen?

Der einzige Nachteil, den ich beim Erzeugen von Impulsen über Match-Pins sehen kann, ist, dass uCs im Allgemeinen nur wenige Match-Pins haben und daher nur wenige Impulse über ein Timer-Match erzeugt werden können, während es möglich ist, Impulse an jedem GPIO von einem Timer-ISR zu erzeugen.

Antworten (2)

Der Timer-Abgleich ist bei weitem genauer und die beste Lösung, wenn Sie hohe Präzision und das deterministischste Verhalten benötigen.

Die Timer-Anpassung hat eine Genauigkeit der CPU-Busfrequenz (auf diesem Teil bis 60 MHz). Interrupts haben eine Unsicherheit von einigen Takten (z. B. wenn sich die CPU mitten in einer langen Anweisung befindet, wenn der Interrupt auftritt). Außerdem haben einige CPUs kleine Caches und die Abrufzeit wirkt sich auf die Interrupt-Latenz aus.

Interrupts können flexibler sein, wenn Sie zusätzliche Entscheidungen über die Pin-Aktion treffen müssen – umschalten oder nicht, Berechnungen durchführen usw.

Da Match-Impulse eine völlig unabhängige Einheit sind, führt jeder Fehler im Code immer noch dazu, dass der Impuls genau erzeugt wird. Ich verwende vom uC generierte Impulse, die von einem Vorgesetzten validiert werden müssen. Seltsames Verhalten von Impulsen zeigt dem Supervisor an, dass etwas nicht stimmt. Verhaltensänderungen können beim Generieren aus einer ISR leicht erkannt werden. ISR ermöglicht Ihrem Programm, die volle Kontrolle über jeden Aspekt Ihres Codes zu übernehmen.

Das Problem bei einem ISR-basierten Ansatz ist, dass es sich um einen Interrupt handelt . Es unterbricht Dinge.

Die Verwendung der integrierten Timer-Vergleichsfunktionen zum Umschalten eines Match-Pins erfolgt vollständig in Hardware. Sie können Code auf dem Prozessor ausführen lassen und er hat keine Ahnung, dass der Timer den Pin umschaltet.

Wenn Sie einen ISR verwenden, um einen Pin umzuschalten, haben Sie mehr Flexibilität (Sie können mehr tun, als nur einen Pin umzuschalten, und Sie können jeden gewünschten Pin umschalten), aber Sie haben jetzt viele Interrupts, die Ihren Code unterbrechen . Dies kann zeitspezifische Routinen stören oder bei hohen Frequenzen zu unnötigem Overhead führen (Ihr Interrupt kann einen großen Teil der gesamten Befehlsanzahl ausmachen und Zyklen verschlingen, die vom Hauptprogramm verwendet werden könnten).

Welcher würde genauere Impulse erzeugen?

Die Timer-Match-Funktion wird wahrscheinlich eine genauere Ausgabe erzeugen, es sei denn, Sie gehen beim Programmieren Ihrer Interrupts sehr vorsichtig vor. Um genaue PWM/Pulse mit ISRs zu erhalten, müssen Sie Ihre ISRs wahrscheinlich in Assembler schreiben, damit Sie wissen, wie viele Zyklen sie benötigen, und dies dann in Ihrem Code berücksichtigen, der die Timings festlegt. Grundsätzlich wird der Aufwand für die Eingabe des ISR die Dinge zeitlich beeinflussen.

Wenn es möglich ist, mit den Timer-Match-Pins zu tun, was Sie tun möchten, tun Sie dies im Allgemeinen so, dass Sie keinen zusätzlichen Interrupt-Overhead haben. Wenn es mit den Timern allein nicht möglich ist, das zu erreichen, was Sie benötigen, oder Ihnen die Timer-Pins ausgehen, verwenden Sie einen ISR.

Ich habe Keil uVision verwendet, um einen von ISR erzeugten Impuls zu simulieren, und konnte 499,97 Hz von den eigentlich beabsichtigten 500 Hz erreichen. Ich versuche dasselbe für Match und lasse Sie wissen, wie viel ich erreicht habe. Es läuft alles auf den letzten Absatz hinaus, den Sie gesagt haben, denke ich. vollständig anwendungsbasiert