mikrocontroller.net

Forum: Compiler & IDEs PWM mit Timer1


Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich versuche mich derzeit an einer HW PWM mit dem mega8. Ziel soll es
sein einen Servo zu Steuern.

Nun muss ich sagen das ich irgendwie das ganze net wirklich auf die
Reihe bringe. Ich hab mir mal gedach t das ich hier niederschreibe was
ich so in etwa habe und meine verstanden zu haben und Ihr sagt mir dann
ob das kompletter nonsen ist oder ob ich doch  net ganz so doof bin ;-)

Also ich hab mir das wie folgt gedacht:

Damit mein Servo so das tut was ich will brauch ich ne Frequenz von
50Hz (20ms) und ein variables ti von 1-2ms. Am besten geeignet schein
mir dafür der Timer1 (16bit) mit einem 256 Vorteiler.

Das müsste bei meinem mega8 mit 4MHz und einem Vorteiler von 8 der
Counter bis 10.000 Zählen und dan wären 20ms um.

4.000.000 / 8 = 500.000 => 500.000 * 0.02 = 10.000

Dann soll noch für die z.B. ersten 1,5 ms H sein d.h.

500.000 * 0.0015 = 750

das würde dann bedeuten das ich den Timer0 als Fast PMW mit Obergrenze
OCR1A (10.000) und als Vergleicher zum umschalten von H nach L OCR1B
(750) nehemen würde.

das ganze würde ich in C wie folgt formulieren

  TCCR1A = (1<<COM1A0) | (1<<WGM11) | (1<<WGM10);

  TCCR1B = (1<<WGM12) | (1<<WGM13) | (1<<CS11);

  OCR1AH = 0x27; //Obergrenze auf 10.000
  OCR1AL = 0x10;

  OCR1BH = 0x02; //Vergleich auf 750
  OCR1BL = 0xEE;

  DDRB = 0x02; //OC1A als Ausgang

So, wenn sich nu jemand durch das hier durchgewühlt hat und mir noch
sagen könnte wie meine Überlegungen so hinhauen würde ich mich sehr
freuen.

Vorab schon mal ein Danke, der Jochen

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, ich seh gerade das ich was von einem 256er Vorteiler geschrieben
hab, der soll natürlich 8 sein.

Und es ist der Timer1 und nicht der Timer0 gemeint

Grüßle Jochen

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schön geschrieben, nur wo liegt dein Problem?
Funktioniert es nicht?
Kommt die falsche Frequenz raus?

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na das ich net weiß ob es so tut. Probieren bringt auch nix da ich kein
Oszi habe um mir das Signal anzuschaune.

Hab das ganze mal im AVRStudio simuliert und es verhält sich nicht so
wie ich es erwartet habe.

So wie ich das verstanden habe sollte der Counter bei Fast PWM von 0
bis TOP bzw bei dem von mir eingestellten Modus bis OCR1A Zählen und
dann wieder bei Null anfangen. Tut er aber net. Erzählt bis auf 3FF und
dann wieder runter auf Null.

Das heißt für mich das es sich um ein 10bit und net um nen 16bit Timer
handelt und das ich das mit dem FastPWM net verstanden habe.

Dazum kommt noch das der Zähler net nur bis auch OCR1A zählt sondern
bis 3FF (hab das im Code auf 0x0210 geändert)

Also auf gut deutsch ich versteh garnix mehr ;-o

Auf Erleuchtung hoffen Jochen

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHH

sch***** AVRStudio. Hab durch Zufall beim Suchen hier im Forum einen
Beitrag gefunden das auch schon andere Leute wohl beim simulieren von
PWM Geschickten Problem hatten.

Hab dann das ganze doch mal auf den uC geladen und getestet und es tut
genau so wie ich es mir vorstelle. Daraus schließ ich jetzt einfach mal
das mein PWM Signal genau so erzeugt wir wie ich es mir erwartet habe.

Da ich kein Oszi habe kann ich es net mit sicherheit sagen. Aber lt.
Frequenzmessung hab ich 50Hz und der Servo geht da hin wo er hin soll
also den ich mal das ist schon so i.O.

Grüßle der Jochen

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  OCR1AH = 0x27; //Obergrenze auf 10.000
>  OCR1AL = 0x10;

Tu sowas nicht, das versteht hinterher doch kein Schwein mehr.
Schreib wenigstens

OCR1A = 10000;  /* Kommentar brauchst Du wohl keinen mehr :-) */

oder ggf. statt der ,magischen' Zahl 10000 gleich eine
Berechnungsformel.

Autor: Jochen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Joo, hast ja recht ;-)

hab das auch schon geändert weil ich gesehen hab das man die 16bit
Register direkt schreiben kann.

Die 10.000 brauch ich in dem Fall ja nicht mehr neu berechnen da ich
für den Servo ja immer ein T von 20ms brauche.

Aber ich werd mir so grob die Abhandlung die ich hier gepostet habe
aufheben das ich in Zukunft wieder nach schaune kann wie das ging.

Und ich werd nie wieder was im AVRStudio simulierne ;-))))

Grüßle Jochen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.