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
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?
@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.
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