Servo an Atmega8L PWM Störungen?

Gast #2335264
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
Gast #2335311
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
Gast #2335502
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
#2335505
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"
#2335522
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.
Gast #2335524
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
#2335526
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren