PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schaffe es nicht Servo mit PWM zu steuern



semicolon
04.06.2006, 18:15
Hallo Leute

Ich habe es leider noch immer nicht geschafft meinen Servo mittels PWM zu steuern.

************************************************** *********
PWM initialisieren
************************************************** *********/

void init_Motor(void)
{

//10-Bit nicht invertierter PWM
TCCR1A = (1<<COM1A1) | (1<<WGM11) | (1<<WGM10);

//Prescaler (64)
TCCR1B = (1<<CS11) | (1<<CS10);

//Vorladen
TCNT1 = 868;


//Interupt dektivieren
TIMSK &= ~0x3c;

//Ausgänge für PWM
PORTD &= ~(1<<PD5);

//Pulsbrite für PWM (1.5ms)
OCR1A = 892;

//einschalten
PORTD |= (1<<PD5);

}

So sieht meine init-Funktion aus für den PWM.

Weshalb funkt das noch nicht? Wo liegt der Fehler?

Atmega32 mit 1MHz Quarz

Hanni
04.06.2006, 18:39
Wie schon im letztem Tread: hänge es an ein Oszi, dann siehst du warum :D

Nebenbei möchte ich noch anmerken, das der verwendete Timermode nicht wirklich für diese Aufgabe geeignet ist.

Der Timer läuft in deinem Programm im Moment wie folgt:

1. von 868 -> 1023 (und löscht den OC1A Pin bei 892)
2. von 1023 -> 0 (und setzt den OC1A Pin bei 892)
3. von 0 -> 1023 (und löscht den OC1A Pin bei 892)
4. gehe zu 2.

d.H. rein Zeitlich gesehen sieht deine Kurve wie folgt aus:

_|°°°°|_______________|°°°°°°°°°°°°°°°°°°°°°°°°°°° °°°°°°°°°°°°°°°°°°°°°|_______________|°°°°°°°°°°°° °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°|__

Fazit: es kann nicht funktionieren.

Vielleicht sollte ich dir noch den Tipp geben, bei dem Code in deinem anderem Tread mal den Ausgang zu invertieren .. (also anstatt von COM1A0 & COM1A1 nur COM1A1 zu setzen ...)

Nachtrag: Mit etwas Glück kann ich dir am Dienstag mal nen richtiges Oszibild dazu hier reinposten.

Grüße,

da Hanni.

semicolon
04.06.2006, 18:47
das heisst mein timer wird nicht mehr automatisch mit 868 vorgeladen? Dann muss ich dies immer noch manuel einstellen?

Hanni
04.06.2006, 18:50
Richtig,

Nur: kannst du den Timer nicht neu Vorladen, weil du nicht weiss wann ...
(Im übrigen kam von daher der Lösungsansatz mit dem Timermode 14 ...)

Grüße,

da Hanni.

semicolon
04.06.2006, 18:54
Dann habe ich vorhin kurz getestet am Servo. Hat sich leider nichts getan. Keine Bewegung. Aber wie kann ich den anders meine Servo ansteuern. Irgendwie komme ich nicht weiter.

semicolon
04.06.2006, 19:03
Es sollte doch nicht so schwierig sein ein PWM zu erzeugen wo nur drei Pulsbreite vorkommen. (1.5ms, 2.5ms, 1ms).

Aber nicht mal das kann ich so programmieren. Irgendwie bin ich langsam am verzweifeln. So wird das nie etwas.

Hanni
04.06.2006, 19:07
Ich geb dir mal nen Tipp:

1. leg das ganze mal beseite.
2. geh mal raus.
3. gewinne damit den abstand den du brauchst um das Problem zu lösen.

und 4. Wie schon gesagt: ich versuch mal am Dienstag da ganze mit nem Oszi zu lösen.

semicolon
04.06.2006, 19:20
das habe ich schon zur Genüge getan. Ich kann mich nicht mal nach dem Datenblatt richten. Ich verstehe zum Teil die Sachen nicht. Weiss nicht obs an Englisch liegt oder ob es einfach ein wenig zu kompliziert beschrieben ist.

Es ist doch nichts besonders ein PWM Signal für eine Servo zu programmieren. Habe schon anderes gemacht, aber hier habe ich nur Probleme und komme nicht weiter.