Forum: Compiler & IDEs ATmega32, Servo Signal erzeugen. Wo ist mein Denkfehler


von Jürgen S. (jsachs)


Lesenswert?

Hallo,

Randbedingung, AT mega32 mit 16MHz.
Timer 1 soll mehrere Servosignale im Bereich bis 2,5ms (0,5 - 2,5ms) 
Erzeugen.
Timer läuft im CTC und soll im Überlauf noch was anderes machen.

Leider verrechne ich mich irgendwie und komme nicht auf mein Timing.
Timer läuft im CTC Modus. durch setzen von OCR1A und dem entsprechenden 
Interrupt will ich nun :
- Im Überlauf, neuen Ausgang setzen und OCR1A setzen für nächsten 
Endpunkt
- Im OCR1A Ausgang aus
- Im Überlauf wieder von vorne

Aber ich bekomme mein Timing nicht hin. Ich hab jetzt nur mal den 
Overflow aktiv und toggle einen Pin. Mein Timing ist aber komplett 
daneben wenn ich mit dem Oszi messe.

Ich nehme an ich mache einen Denkfehler.
Alle 2,5ms muss der Timer überlaufen. Timer 1 ist 16 bit.
Also 2,5ms/65536 >= 26MHz.Takt des Timers.... Das geht ja nicht...

Kann mir mal einer über die Straße helfen...

Ich möchte eigentlich schon eine Genauigkeit von 256 Werten im Bereich 
0,5-2,5ms haben.

Danke
Juergen

von Karl H. (kbuchegg)


Lesenswert?

Jürgen Sachs schrieb:

> Timer läuft im CTC Modus. durch setzen von OCR1A und dem entsprechenden
> Interrupt will ich nun :
> - Im Überlauf, neuen Ausgang setzen und OCR1A setzen für nächsten
> Endpunkt
> - Im OCR1A Ausgang aus
> - Im Überlauf wieder von vorne

Machs nicht von so kompliziert. Lass den Timer durchlaufen und berechne 
einfach den nächsten Compare Match, den du dann ins OCR1A Register 
setzt.

Modellbauservo Ansteuerung - die letzte Routine
Umstricken auf den 16 Bit Timer und kleineren Vorteiler, dann wird auch 
der Wertebereich größer.

> Alle 2,5ms muss der Timer überlaufen. Timer 1 ist 16 bit.
> Also 2,5ms/65536 >= 26MHz.Takt des Timers.... Das geht ja nicht...

Mal sehen.
Wenn der Timer full Speed läuft, dann zählt er in 1 Sekunde theoretisch 
bis 16000000. Ein Durchlauf von 0 bis 65535 dauert daher 0.00409 
Sekunden (in 1 Sekunde bis 16000000, wie weit bis 65536: 65536 / 1 * 
16000000). Da das zu lang ist, darf der Timer nicht bis 65536 zählen, 
sondern muss schon früher wieder bei 0 anfangen. Wie weit genau darf er 
zählen

     16000000      1000   Millisekunden
        x             2.5 Millisekunden
    -----------------------------------
            16000000 * 2.5
      x = ----------------- = 40000
                1000

d.h. wenn dein Timer full speed bis 40000 zählt, braucht er dazu genau 
2.5 Millisekunden.

von Jürgen S. (jsachs)


Lesenswert?

Danke,

ich habe meinen Fehler auch erkannt...
Jetzt klappt es...

Danke
Juergen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.