Forum: Compiler & IDEs Servo betreiben mit Timer1 Atmega32


von Ste M. (joker)


Lesenswert?

Hallo zusammen,

kann ich mit dem Timer 1 des Atmega32 2 Servos mit Impulsen versorgen?

Die Servos müssen getrennt steuerbar sein.

Das ganze sollte "in Hardware" laufen also ohne Interrupt (also im 
"hintergrund")


Grüße Stefan

von MWS (Gast)


Lesenswert?

Ja. Ist aber fast schon schwierig das nicht zu finden.
Beitrag "Re: Servoansteuerung mit Timer (ATmega32)"

von Ste M. (joker)


Lesenswert?

Da wird es aber mit Interrupts gemacht und es wird nur ein Servo 
verwendet.

Ich suche eine Möglichkeit OHNE Interrupt für 2 Servos.

von MWS (Gast)


Lesenswert?

Stefan Marquardt schrieb:
> Da wird es aber mit Interrupts gemacht und es wird nur ein Servo
> verwendet.

Aha. Wo ist da bei meinem verlinkten Post ein Interrupt ?

> Ich suche eine Möglichkeit OHNE Interrupt für 2 Servos.

Ja, hab' ich verstanden, nur Du nicht.

von Ste M. (joker)


Lesenswert?

> Aha. Wo ist da bei meinem verlinkten Post ein Interrupt ?
> Ja, hab' ich verstanden, nur Du nicht.

Sorry, ich schein den Code nicht verstanden zu haben.


Ich komm nicht ganz mit was die Register machen.

Welche PortPins werden dabei angesteuert?

von Ste M. (joker)


Lesenswert?

Stefan Marquardt schrieb:
> Welche PortPins werden dabei angesteuert?

Sorry hab die 1. Zeile überlesen.

von MWS (Gast)


Lesenswert?

Stefan Marquardt schrieb:
> Ich komm nicht ganz mit was die Register machen.

Dann das Datenblatt nehmen und nachschauen.
Du wolltest 2 Kanäle und beide in HW, genau das macht mein Code.

von Ste M. (joker)


Lesenswert?

MWS schrieb:
> Dann das Datenblatt nehmen und nachschauen.
> Du wolltest 2 Kanäle und beide in HW, genau das macht mein Code.

wieso werden bei den Registern

  OCR1A = 2000;     // Servoposition Servo 1, 2000 = 1.0ms
  OCR1B = 3000;     // Servoposition Servo 2, 3000 = 1.5ms

nur ein Wert vergeben?

Ist der Timer nicht so programmiert, dass er hoch und runter läuft?

Wie werden die Werte 2000 und 3000 berechnet?

Versteh ich das richtig, dass der Timer als 9-Bit-Timer läuft? also von 
0 bis 511 und von 511 bis Null zählt?

von MWS (Gast)


Lesenswert?

Stefan Marquardt schrieb:
> nur ein Wert vergeben?

Als Startwert damit die Servos nicht verrückt spielen vielleicht ?
Mir haben sie noch dazu gedient um auf dem Oszi das Timing zu messen.

Diesen dezenten Hinweis gesehen ?
> // Steuere Servos

Das wartet auf Interaktion durch den potentiellen Codeverwender :D

> Ist der Timer nicht so programmiert, dass er hoch und runter läuft?

Nein, das würde er nur bei phase / phase and frequency correct pwm 
machen.

> Wie werden die Werte 2000 und 3000 berechnet?

Versuch' zu verstehen was da passiert, schau den Prescaler an und rechne 
die Zyklenzeiten für diese Werte aus.

> Versteh ich das richtig, dass der Timer als 9-Bit-Timer läuft?

Nein, das ist nicht richtig, wofür denkst Du ist ICR1 ?

> also von 0 bis 511 und von 511 bis Null zählt?

Wenn dem so wäre, dann würden die Compare Register OCR1A..B nie 
erreicht.

In welchem Modus (Nummer) läuft der Timer ?

von Ste M. (joker)


Lesenswert?

MWS schrieb:
> Als Startwert damit die Servos nicht verrückt spielen vielleicht ?
> Mir haben sie noch dazu gedient um auf dem Oszi das Timing zu messen.

Also eine definierte Position?


> Diesen dezenten Hinweis gesehen ?

Muss ich dazu die Werte im OCR1A und OCR1B ändern um ihn zu steuern?

MWS schrieb:
> Versuch' zu verstehen was da passiert, schau den Prescaler an und rechne
> die Zyklenzeiten für diese Werte aus.

Steige da nicht dahinter.

Ich sehe nur das der Timer mit 2 MHz gespeist wird.

MWS schrieb:
> Nein, das ist nicht richtig, wofür denkst Du ist ICR1 ?

Ich verstehe nicht was dieses Register macht.

MWS schrieb:
> In welchem Modus (Nummer) läuft der Timer ?

In Modus 14. Sehe ich das richtig?

von Karl H. (kbuchegg)


Lesenswert?

Stefan Marquardt schrieb:

>> Diesen dezenten Hinweis gesehen ?
>
> Muss ich dazu die Werte im OCR1A und OCR1B ändern um ihn zu steuern?

Bingo!

>
> MWS schrieb:
>> Versuch' zu verstehen was da passiert, schau den Prescaler an und rechne
>> die Zyklenzeiten für diese Werte aus.
>
> Steige da nicht dahinter.

Mit Verlaub: dann such dir ein anderes Hobby.
Wenn Dreisatzrechnen schon zu schwer ist ....

FAQ
letztes Kapitel: der Timer

>> Nein, das ist nicht richtig, wofür denkst Du ist ICR1 ?
>
> Ich verstehe nicht was dieses Register macht.

Dazu gibt es ein Datenblatt:
In dem suchst du dir den Timer-Modus, den MWS eingestellt hat und siehst 
nach, welche Bedeutung dann die Register haben.
So schwer ist das nicht.

>> In welchem Modus (Nummer) läuft der Timer ?
>
> In Modus 14. Sehe ich das richtig?

Du siehst richtig.
MWS hat es ja freundlicherweise dazugeschrieben
1
 TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11);  // Mode 14, ICR = Top
und er hat auch dazugeschrieben, das ICR (Tippfehler, er meinte ICR1) 
als Top Wert fungiert. Top ist immer der Wert, bis zu dem der Timer 
zählt. Einige Timer-Modi haben einen fixen Top-Wert, bei wieder anderen 
kann man den Top-Wert in einem Register vorgeben. Im Datenblatt gibt es 
da eine wunderschöne Tabelle in der alle Timermodi und die in diesem 
Modus wichtigen Werte (wie zb Top) aufgeführt sind.
So zb. der Modus 14, bei dem ICR1 als Top Wert fungiert. Der Timer zählt 
genau so weit, wie der Wert in ICR1 angibt. Steht in ICR1 der Wert 5 
drinnen, dann zählt der Timer

  0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0 .....

steht in ICR1 der Wert 8, dann zählt er eben

  0, 1, 2, 3, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 0, ....

und (Hint!) wenn man jetzt die x-Achse als die Zeit auffasst (den der 
Timer zählt ja mit einer bestimmten Geschwindigkeit), dann sieht man 
auch, dass der Timer bei einem Top-Wert von 8 LÄNGER braucht um wieder 
bei 0 zu landen. Mit anderen Worten: bindet man ein Ereignis an einen 
bestimmten Zählerwert (zb 0), dann verlängert sich mit größerem Top Wert 
die Zeit von einem Ereignis bis zum nächsten. Das ist deswegen 
interessant, weil du ja bei einer Servoansteuerung das ganze so 
einrichten willst, dass das 0-Ereignis (und damit das Setzen des 
Ausgangspins auf 1) alle 20ms passiert. Aus der Kombination "wie schnell 
zählt denn eigentlich der Timer" und "wie weit zählt er" ergibt sich 
eine Zeit. Und im Idealfall sollte da 20ms rauskommen.

von MWS (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> das ICR (Tippfehler, er meinte ICR1)

Da es das einzige ICR im ATM32 ist, hatte ich mir das gespart.

Stefan Marquardt schrieb:
> In Modus 14. Sehe ich das richtig?

Das ganze ist 'ne langsame "Fast PWM", bei dem man das Tastverhältnis 
und damit die Pulslänge in einem für Servos verträglichen Bereich 
einstellen kann.

Ansonsten wurde von Karl-Heinz eigentlich alles erschöpfend gesagt.

von Ste M. (joker)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Mit Verlaub: dann such dir ein anderes Hobby.
> Wenn Dreisatzrechnen schon zu schwer ist ....



Nett ist dieser Satz zwar nicht aber OK.

er braucht also 20ms um auf 40000 zu zählen.

Nach Adam-Riese also 0,5 µs pro schritt.

Jetzt versteh ich die Wertberechnung.


Habe den Code heute versucht. funktioniert wunderbar ;)

Nur versteh ich nicht ganz wieso das BIT WGM11 gesetzt ist. Das bedeutet 
doch, dass der Timer im 9-Bit-Modus läuft?! Also ich weis ja jetzt das 
das BIT ICR als TOP Value genuzt wird.

Kann mir das jemand erklären?

von Stefan E. (sternst)


Lesenswert?

Stefan Marquardt schrieb:
> Nur versteh ich nicht ganz wieso das BIT WGM11 gesetzt ist. Das bedeutet
> doch, dass der Timer im 9-Bit-Modus läuft?!

Nein, bedeutet es nicht.
Wenn nur WGM11 gesetzt wäre (Mode 2), dann würde er im Modus "Fast-PWM 
9 Bit" laufen. Du musst immer alle WGM1-Bits zusammen betrachten.

von MWS (Gast)


Lesenswert?

Stefan Marquardt schrieb:
> Nett ist dieser Satz zwar nicht aber OK.

Naja, hier hast Du ja einen, wenn auch beiläufig entstandenen, Code 
nachgetragen bekommen, der zudem wie ich meine auch noch ausreichend 
kommentiert war. Da kann man schon ein bisserl was vom geneigten 
Verwender des Codes erwarten, also der Versuch des Mitdenkens.

Und wenn das Mitdenken nicht kommt, dann geht auch mir manchmal der Hut 
hoch.

Stefan Marquardt schrieb:
> wieso das BIT WGM11 gesetzt ist.

Es ist ja nicht dieses WGM-Bit allein gesetzt, die WGM's verteilen sich 
auf TCCR1A & B. Schaust Du nun im aktuellen Datenblatt des ATM32 in der 
Tabelle 47 auf Seite 109 nach, dann siehst Du, wie sich die Kombination 
der WGM's auswirkt.

> Habe den Code heute versucht. funktioniert wunderbar ;)

Hätte mich verwundert wenn's anders wäre, der Code war auf aktueller HW 
getestet.

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.