-
-
Erfahrener Benutzer
Fleißiges Mitglied
Schaffe es nicht Servo mit PWM zu steuern
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
-
Erfahrener Benutzer
Roboter Experte
Wie schon im letztem Tread: hänge es an ein Oszi, dann siehst du warum
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.
-
Erfahrener Benutzer
Fleißiges Mitglied
das heisst mein timer wird nicht mehr automatisch mit 868 vorgeladen? Dann muss ich dies immer noch manuel einstellen?
-
Erfahrener Benutzer
Roboter Experte
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.
-
Erfahrener Benutzer
Fleißiges Mitglied
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.
-
Erfahrener Benutzer
Fleißiges Mitglied
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.
-
Erfahrener Benutzer
Roboter Experte
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.
-
Erfahrener Benutzer
Fleißiges Mitglied
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.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen