Forum: Mikrocontroller und Digitale Elektronik Servo an Atmega8L PWM Störungen?


von Alex (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

>Liegt es an meinem Programm?

Ja. Hast du dir schon mal angesehen, wie so ein Servo-Steuersignal 
aussehen muss?

MfG Spess

von Alex (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?


von gaast (Gast)


Lesenswert?

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?

von Alex (Gast)


Lesenswert?

Ohh, da habe ich wohl was grundlegendes übersehen :-(

Werde mich mal genauer erkundigen.

Vielen Dank für eure Hilfe :-)
Sehr cool

MFG Alex

von Alex (Gast)


Lesenswert?

@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

von Karl H. (kbuchegg)


Lesenswert?

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"

von Karl H. (kbuchegg)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

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 :-(

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Ach, vergessen. Nur der Vollständig keit halber.
Der Optimizer vom Compiler ist eingeschaltet?

von Alex (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.