Julian Schild schrieb:
> Es geht darum die Position eines Servos langsam zu verändern.
>
> Kennst du eine besser Methode (garantiert sogar) :D ;)!
1 Timer macht die Servoansteuerung. Ich hab jetzt nicht auf deine
Taktfrequenz geachtet, aber der Timer 1 müsste normalerweise hinkommen.
Ein 2.ter Timer gibt einen Basistakt vor. In dessen ISR wird der OCR
Wert für den Servo-Timer verändert, so dass er sich seiner Zielvorgabe
annähert.
Sleep Mode braucht da kein Mensch dazu.
Hauptschleife
1 | while( 1 )
|
2 | {
|
3 | ServoSoll = 0; // Zielvorgabe: Servo ganz nach links
|
4 |
|
5 | _delay_ms( 10000 ); // etwas warten (währenddessen verfährt
|
6 | // die Timer ISR das Servo
|
7 |
|
8 | ServoSoll = ServoMaximum; // Zielvorgabe: Servo ganz nach rechts
|
9 |
|
10 | _delay_ms( 10000 ); // und wieder: das Servo fahren lassen
|
11 | }
|
Die Verfahr-ISR
Aufgabe: Wenn die Servo Istposition nicht mit der ServoSollposition
übereinstimmt, dann für den Servo-Timer den OCR Wert nachstellen
1 | ISR( .... ) // zb Overflow vom Timer 2
|
2 | {
|
3 | if( OCR1A < ServoSoll )
|
4 | OCR1A++;
|
5 |
|
6 | else if( OCR1A > ServoSoll )
|
7 | OCR1A--;
|
8 | }
|
Und dann natürlich noch den Timer 1, der so konfiguriert wird, dass er
ganz alleine das Servosignal erzeugt, welches mit OCR1A beeinflusst
werden kann.
Voila: Die komplette Servoansteuerung und Nachführung erledigen die
Timer ganz von alleine bzw. mit einer ISR. In der Hauptschleife muss man
nur noch die ServoSoll-Position zuweisen und das Servo fährt dann diese
Position langsam an.
Hmm. Gerade noch mal drüber nachgedacht. Man könnte wahrscheinlich das
ganze auch so regeln, dass der Timer 1 beides übernimmt. Er generiert
sowohl die Servosignale (per Hardware) als er sich auch darum kümmert,
dass die Servo Istposition an die Soll Position herangeführt wird (in
einer ISR)