PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisfragen bezüglich PWM



semicolon
01.06.2006, 21:51
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

semicolon
01.06.2006, 22:04
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??????

Hanni
02.06.2006, 21:16
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.

semicolon
02.06.2006, 22:40
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?

Hanni
02.06.2006, 22:54
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 (http://atmel.com/dyn/resources/prod_documents/doc2503.pdf)


Grüße,

da Hanni.

semicolon
02.06.2006, 23:53
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.

semicolon
03.06.2006, 00:08
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?

Hanni
03.06.2006, 10:34
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.

semicolon
03.06.2006, 15:00
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.

Hanni
03.06.2006, 15:28
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.

semicolon
03.06.2006, 15:38
Ops, habe ich gerade korriegiert. Tja, habe leider kein Oszi zu Hause. Erst wieder am Dienstag kann ich mein Programm testen und anschauen. Sorry!

Also kannst du nicht mit 100%-iger Sicherheit sagen, dass das auch funktionieren wird????

Hanni
03.06.2006, 15:53
genau so ist es.

Ich hätte im übrigem auch erst wieder am Dienstag nen Oszi zur verfügung um mir das anzuschauen.

Grüße,

da Hanni.

semicolon
03.06.2006, 15:56
Frage nun: Hast du es jemals schon probiert oder nur der Theorie gemacht? Jetzt bin ich natürlich stark verunsichert ob ich das benötigte PWM überhaupt hinkriege. Ich bin nämlich schon längere Zeit dabei das endlich mein Servo läuft und deshalb wäre ich schon froh, eine PWM zu erhalten das funkzt.

Hanni
03.06.2006, 16:02
Mit PWM selbst habe ich schon diverse Dinge realisiert.

Mit exakt diesem Timermode allerdings noch gar nix, deswegen isses reine Theorie.

Grüße,

da Hanni.

semicolon
03.06.2006, 19:14
Ok, dann werde ich mal deine Theorie testen und dir Bescheid gegen. Aber wenn du schreibst, dass du schon viel mit PWM realisiert hast, wie würde meine Sache in einer anderen Funktion gehen? Also, wie müsste ich meine Timer verwenden und konfigurieren nach einer anderen Methode für den Servo?

Hättest du auch einen Lösungsansatz der funktioniert?