-
-
Erfahrener Benutzer
Fleißiges Mitglied
Verständnisfragen bezüglich PWM
Hallo Leute
Ich habe einfach noch immer ein Problem mit dem PWM-Modus. Ich kann mir noch immer nicht ganz genau vorstellen wie ich ihn konfigurieren muss. Irgendwie ist mir der Groschen noch nicht gefallen.
Also, mein Ziel wäre ein PWM Signal zu erzeugen mit 50Hz und einer Pulsbreite von 1.5ms bei einem Atmega32 mit 1MHz getaktet.
Nun, zu meinen Überlegungen:
Auf der RN-Wissen Seite habe ich mittels dem Java-Applet den Prescalar und den Vorlader ausrechnen lassen.
Prescalar: 256; Vorlader: 78
Das ist alles soweit noch in Ordnung. Aber ich verstehe trotzdem nicht ganz wie das abläuft mit dem PWM.
Wenn ich nun eine Pulsbreite von 1.5ms haben möchte, wie muss ich das OCR1A laden?
Vielen Dank für eure Hilfe
-
Erfahrener Benutzer
Fleißiges Mitglied
Nachtrag:
void init_Motor(void)
{
//PWM einstellen: 10-Bit; invertiert
TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B0) | (1<<WGM10);
//PWM Prescalar: 256
TCCR1B = (1<<CS12);
//Vorladen
TCNT1 = 78;
//Interupt dektivieren
TIMSK &= ~0x3c;
//Ausgänge für PWM
PORTD &= ~(1<<PD5);
//Mindeszeit für PWM
OCR1A = 1;
//einschalten
PORTD |= (1<<PD5);
}
Soweit wäre ich mal gekommen.
Ist dies ok oder eher falsch??????
-
Erfahrener Benutzer
Roboter Experte
So, hier mal ein paar Denkansätze von meiner Seite zu diesem Thema:
Vergiss den "Vorlader" !
Vergiss den Prescaler wenn du eine größere Genauigkeit willst, denn du hast nur 20000 Takte je Periode zur Verfügung (=20 ms).
Ohne Prescaller braucht man also 1500 Takte um die 1,5 ms abzudecken.
Mein Vorschlag dazu: Der Timermode: 14 (siehe Datenblatt Seite 109).
in das ICR1 Register gehört dazu der maximale Zählerwert. (in dem Fall 20000).
In die OCR1A & OCR1B Register der Wert 1500
Anschlißed noch die COM1A & COM1B Bits richtig setzen und der µC mach dir 2 Fast PWM's mit einer Periodendauer von 20 ms und einem High Anteil von 1,5 ms.
Damit ließen sich z.B. 2 Servos ohne Rechenzeit ansteuern.
Grüße,
da Hanni.
-
Erfahrener Benutzer
Fleißiges Mitglied
Vielen Dank für deine tolle Hilfe. Werde ich mal ausprobieren. Jetzt nur reine Neugier. Weshalb keinen Vorlader und Prescaler? Hat dies ein besonderer Nachteil oder weshalb schreibst du, dass ich ihn vergessen sollte?
Denn in sämtlichen Foren ist immer die Rede von Prescaler und Vorlader.
Noch eine Frage: Was hat es mit dem ICR1 Register auf sich? Habe ich noch in keinem Beitrag gelesen?
In den meisten Beispielcodes ist nie die Rede davon. Ist das etwas spezielles oder besseres?
-
Erfahrener Benutzer
Roboter Experte
1. der Prescaaler:
Also es bringt in diesem speziellen Anwendungsfall (µC mit 1 MHz und einer "Periodendauer" von 20 ms) meiner Meinung nach relativ wenig einen Prescaler einzusetzen.
Wieso auch, ich brauche für 20 ms ziemlich genau 20000 Zählschritte. Der Timer 1 kann das auch locker (der schaft über 65000).
Da diese Werte ausserdem den Schluss zulassen das du dieses für eine Servoansteuerung benötigst und damit eine Impulsbreite von 1 ms - 2 ms ins Spiel kommen kann bietet sich dieses in diesem Fall erst recht an (keine wilden Rechnereien - 1 ms = 1000, 2 ms = 2000).
2. der "Vorlader":
Ist in diesem Fall unnötig (siehe oben).
3. ICR1 Register:
In diesem Timermode wird im ICR1 Register der höchste mögliche Zählerstand definiert. Ansonsten dient es eher dazu mit jedem Zählertakt den H Zustand des ICP1 Pins zu zählen.
genauere Details findest du im Datenblatt
Grüße,
da Hanni.
-
Erfahrener Benutzer
Fleißiges Mitglied
Hey vielen Dank für deine tolle Erklärung. Ich denke mal, dass ich jetzt weiss um was es geht. Ansonsten werde ich mich wieder melden.
-
Erfahrener Benutzer
Fleißiges Mitglied
Vielleicht doch noch eine Frage bezüglich dem Anschluss des Servos. Kann ich ihn direkt an den Port D5 anschiessen oder sollte ich noch eine Diode oder so drein schalten, damit kein Strom in den Controller fliessen kann?
Hättest du vielleicht noch eine Idee wie der Anschluss aussehen sollte?
-
Erfahrener Benutzer
Roboter Experte
hmm, ich hab keine Ahnung, was so ein Servo an Saft zieht (also die Steuerleitung).
Ich würde es vielleicht über einen Power MosFET lösen ... aber das sind Detailfragen, die sich nur mir dem Wissen über die vorhandene Hardware lösen lassen.
Eine Diode dürfte jedenfalls nicht den gewünschten Effekt bringen.
Grüße,
da Hanni.
-
Erfahrener Benutzer
Fleißiges Mitglied
Hallo ich habe jetzt nun meine initialisierungs Funktion nach deiner Anleitung erstellt.
oid init_Motor(void)
{
//PWM Mode 14
TCCR1A = (1<<COM1A1) | (1<<COM1A0) | (1<<WGM12) | (1<<WGM11);
TCCR1B = (1<<WGM13);
//Maximalwert für Periode laden
ICR1 = 20000;
//Interupt dektivieren
TIMSK &= ~0x3c;
//Ausgänge für PWM
PORTD &= ~(1<<PD5);
//Mindeszeit für PWM (1.5ms)
OCR1A = 1500;
//einschalten
PORTD |= (1<<PD5);
}
wäre das so in etwas in Ordnung?
Ich bin mir noch nicht ganz sicher ob ich alles richtig eingestellt habe.
-
Erfahrener Benutzer
Roboter Experte
Der einfachste Weg das herauszufinden wäre:
Das Programm in den µC flashen und den Ausgang mit nem Oszi anguggn.
Mich würde es auch mal interessieren, da der Ansatz meinerseits bisher auf reiner Theorie beruht.
Im Übrigen ist das was in OCR1A steht nicht die Mindestzeit für die PWM sondern die Impulsbreite des Impulses.
Grüße,
da Hanni.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen