Ich lass dazu immer den TIMER1 des ATMEGA Controllers frei laufen, lese dann bei einer steigenden Flanke des Servosignals ( ICP, INT0 und INT1 ) diesen Timer aus und speichere den Wert ab.Und wie ich die drei eigehenden PWM signale im Programm einlese.
Dann wird das Sensing des entsprechenden Interrupts auf "fallende Flanke" eingestellt.
Kommt dieser Interrupt dann, wird der Timerwert der "steigenden Flanke" vom aktuellen Timer Wert abgezogen. Wenn man dazu unsigned Variablen verwendet funktioniert das sogar bei einem Timer Überlauf.
Somit erhält man die Information über die aktuell anliegende Pulslänge.
Wenn Du einen 8MHz Quarz und einen Prescaler von 8 für den Timer verwendest, bekommst Du die Werte direkt in µs.
Da das TCNT Register des Timers nicht verändert wird, kannst Du einen Timer für alle 3 Servoeingänge verwenden.
Nach der Berechnung der Impulslänge wird diese in einer Variablen abgespeichert, das Sensing für den nächsten Impuls wieder auf steigende Flanke gestellt und eventuell ein Flag gesetzt, das dem Hauptprogramm mitteilt, das ein neuer Servoimpuls auf Kanal-x zur Auswertung eingetroffen ist.
Die Interruptroutinen sollten - wie üblich - möglichst kurz und natürlich ohne delay Befehle sein.
Die Bewertung und Auswertung kann man ja in aller Ruhe im Hauptprogramm machen.
Ich hab sowas mit 2 Kanälen schon gemacht - funktioniert problemlos.
Lesezeichen