Hallo Leute, wollte heute zum erstenmal ein Servo über PWM ansteuern. Der Servo ist ein: Modelcraft Standard-Servo MC 4519 Habe einen code gefunden den ich ein bisschen verändert habe: ////////////////////////////////////////////////////////////// #include <avr/io.h> int main(void) { TCCR1A = (1<<WGM11) | (1<<WGM10) | (1<<COM1A1); // 10Bit-PWM-Modus (Auflösung=1024!)Nicht Invertierend TCCR1B = (1<<CS10); // Aktivieren mit Prescaler 1, also keine Frequenz-'Teilung' DDRB |= (1<<DDB1); // Nicht vergessen, da es sich hier um einen Ausgang handelt, müssen wir das dem Mikrocontroller auch mitteilen while(1){ OCR1A=0;//Dieser Wert wurde vorher von einem Poti } return 0; } /////////////////////////////////////////////////////////////// Leider bekomme ich am Portb1 1,5mV und der Servo wechselt seine Postitionen ständig(eine art wackeln) Liegt es an meinem Programm? LG Alex
Hi
>Liegt es an meinem Programm?
Ja. Hast du dir schon mal angesehen, wie so ein Servo-Steuersignal
aussehen muss?
MfG Spess
Hallo Spess, schonmal danke für deine Antwort :-) Also ich habe es so verstanden, das ich ja keinen analogen Ausgang habe und deswegen einen "erstelle" indem ich das Signal eine bestimmte Zeit "High" und eine bestimmte zeit "Low" setze. In meinem Versuch oben wollte ich alles 0 haben. In dem Beispiel, voher ich den Code habe, wurde damit eine LED gesteuert. Der wert von "OCR1A" wurde dort zwischen 0 und 1024 gesetzt. MFG Alex
Alex schrieb: > Hallo Spess, > schonmal danke für deine Antwort :-) Schön, dass sie dir gefällt, aber warum ignorierst du sie hartnäckig und gehst nicht darauf ein?
Ohh, da habe ich wohl was grundlegendes übersehen :-( Werde mich mal genauer erkundigen. Vielen Dank für eure Hilfe :-) Sehr cool MFG Alex
@gaast: Ich hatte die ganze Geschichte ganz falsch verstanden, deswegen sollte das oben meine Antwort sein :-( Habe mich mal bisschen umgeschaut. Verstehe ich es denn jetzt richtig dass das Beispiel oben mit der LED nicht gehen kann, weil da überhaupt kein Timeing besteht? Das Beispiel: //////////////////////////////////////////// #define F_CPU 3686400UL #include <avr/io.h> #include <util/delay.h> int main (void) { DDRB = (1<<PB1); while( 1 ) { PORTB |= (1<<PB1); _delay_us( 1500 ); // in den 1500 steckt die Lageinformation PORTB &= ~(1<<PB1); _delay_ms( 18 ); // ist nicht kritisch } return 0; } //////////////////////////////////////////////// macht für mich jetzt viel mehr Sinn, klappt aber auch nicht :-(. Der Servo geht hin und her. Das Board auf dem ich teste ist das http://shop.myavr.de/Baus%C3%A4tze%20und%20Platinen/myAVR%20Board%20MK2%20USB,%20Bausatz.htm?sp=article.sp.php&artID=41 Dort habe ich einen Takt von 3,6864Mhz. Gibt es ne Möglichkeit den PWM Ausgang über AVR Studio zu verfolgen? MFG Alex
Alex schrieb: > @gaast: Ich hatte die ganze Geschichte ganz falsch verstanden, deswegen > sollte das oben meine Antwort sein :-( > > Habe mich mal bisschen umgeschaut. > Verstehe ich es denn jetzt richtig dass das Beispiel oben mit der LED > nicht gehen kann, weil da überhaupt kein Timeing besteht? richtig. > macht für mich jetzt viel mehr Sinn, klappt aber auch nicht :-(. > Der Servo geht hin und her. > #define F_CPU 3686400UL Hast du denn einen 3.6864 Mhz Quarz und hast du kontrolliert, ob der vom AVR auch benutzt wird. Die zeiten in _delay_ms stimmen nur dann, wenn die Angabe in F_CPU auch der tatsächlichen Taktfrequenz des AVR entsprechen. Nur weil auf einem Bord ein Quarz verbaut ist, heist das noch lange nicht, dass er vom AVR auch benutzt wird. Das hatten wir heute schon mal in anderem Zusammenhang. Beitrag "Re: UART: atmega32 atmel evaluationboard nur Nullen"
Das andere, was µC schon mal durcheinander bringen kann: Störungen auf der Versorgungsspannung. Speziell Motoren können da richtige 'Schweine' sein. Und in einem Servo ist ein Motor drinnen.
Danke für deine Antwort :-) Karl Heinz Buchegger schrieb: > Hast du denn einen 3.6864 Mhz Quarz und hast du kontrolliert Ich habe das mal mit nem LED Lauflicht getestet (immer 1000ms), bei 10 Sekunden hatte ich eine Abweichung von ca. 100ms, habe es halt mit ner Stopuhr und Auge gemessen :-(
Alex schrieb: > Danke für deine Antwort :-) > > Karl Heinz Buchegger schrieb: >> Hast du denn einen 3.6864 Mhz Quarz und hast du kontrolliert > > Ich habe das mal mit nem LED Lauflicht getestet (immer 1000ms), bei 10 > Sekunden hatte ich eine Abweichung von ca. 100ms, habe es halt mit ner > Stopuhr und Auge gemessen :-( Passt schon. Ok. Nächstes Augenmerk: Spannungsversorgung. Am besten wäre es, wenn du zunächst erst mal für das Servo eine eigene Spannungsversorgung aufbauen könntest. Vom Servo zum µC gehen dann nur: die Signalleitung und die obligate Masseverbindung. Wie gesagt: Sevos können auf der Versorgungsspannung schweinigeln. Daher erst mal möglichst weit vom µC fern halten. Irgendwas: eigenes 5 oder 6 Volt Netzteil. Akkus, Batterien.
Ach, vergessen. Nur der Vollständig keit halber. Der Optimizer vom Compiler ist eingeschaltet?
Karl Heinz Buchegger schrieb: > Der Optimizer vom Compiler ist eingeschaltet? Optimization ist auf -Os eingestellt. Habe eine Externe Spannungsversorgung am Servo = 5V. Der Atmega ist nur über Portb1 mit dem Servo verbunden(Kabel=Orange). Diese Konfiguration hatte ich aber schon von Anfang an. Sehr cool von dir das du dir ein paar Gedanken machst :-) Danke
Alex schrieb: > Karl Heinz Buchegger schrieb: >> Der Optimizer vom Compiler ist eingeschaltet? > > Optimization ist auf -Os eingestellt. Passt > Habe eine Externe Spannungsversorgung am Servo = 5V. > Der Atmega ist nur über Portb1 mit dem Servo verbunden(Kabel=Orange). Da fehlt noch die Masseverbindung. Ohne gemeinsame Masse haben die beiden Spannungsversorgungen unterschiedliche Ansichten, was jetzt 0 sein soll. Spannungen sind Potential-*differenzen*. Wenn du von 1 Meter runterspringst klingt das nicht gefährlich. Wenn die 1 Meter aber die Geländerhöhe im 3. Stock ist, denkst du anders darüber. Erst dadurch, dass du einen gemeinsamen Bezugspunkt definierst und alles darauf beziehst, kannst du '1 Meter Höhendifferenz' richtig einordnen. Bei Spannungen übernimmt diese Aufgabe die gemeinsame Masse.
Karl Heinz Buchegger schrieb: > Da fehlt noch die Masseverbindung Es Funktioniert :-). Jetzt wo ich eine gemeinsamme Masse verwende läuft der Servo so wie ich es will :-) Vielen Dank für die tolle Hilfe an alle Helfer :-) MFG Alex
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.