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
Ja. Ist aber fast schon schwierig das nicht zu finden. Beitrag "Re: Servoansteuerung mit Timer (ATmega32)"
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.
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.
> 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?
Stefan Marquardt schrieb: > Welche PortPins werden dabei angesteuert? Sorry hab die 1. Zeile überlesen.
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.
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?
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 ?
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?
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.
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.