Forum: Mikrocontroller und Digitale Elektronik Servo_Ansteuerung


von Hendrik N. (hinnerk)


Lesenswert?

Moin Moin Mikrocontroller Freunde,

ich bin dabei einen Servo (Tower Pro Micro Servo 9g SG90) mit meinem µC 
(Atmel Mega32) anzusteuern. Dabei benutze ich diesen simplen Code:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#define F_CPU 16000000UL               //externer Quarz, 
4
                                       //Fusebits sind gesetzt
5
6
int main (void)
7
{
8
  DDRB |= (1<<PB3);
9
  
10
  while( 1 ) {
11
    
12
      PORTB |= (1<<PB3);
13
    _delay_us( 1500 );     //µC in mittlere Position
14
    PORTB &= ~(1<<PB3);
15
    _delay_ms( 18 );       //unkritisch  
16
  }
17
 
18
  return 0;
19
}

Mein Problem ist folgendes: Auch nach vielen unterschiedlichen Versuchen 
fährt der Servo immer bis zum Anschlag und versucht weiterzufahren. ich 
habe es nur einmal geschafft, dass der Servo souverän auf eine Position 
fährt und das war als ich eine Pulslänge von 1us eingestellt habe. Die 
Position hat er sich gemerkt und ist er wieder angefahren. Ansonsten 
bekomme ich keine definierten Positionen angefahren!
Über Hilfe würde ich mich wirklich sehr freuen!!!

von MaWin (Gast)


Lesenswert?

Hat dein uC einen 16MHz Quartz ?

von Rolf M. (rmagnus)


Lesenswert?

Und ist er auch aktiviert? Da steht zwar ein Kommentar über die 
Fuse-Bits, aber ist der auch von dir?

von Hendrik N. (hinnerk)


Lesenswert?

Jo 16MHz Quarz ist dran, die Fusebits sind gesetzt und auch schon 
mehrfach mittels toggeln an ner LED ausprobiert.
Der funktioniert!

von Hubert G. (hubertg)


Lesenswert?

Das Programm funktioniert.
Also entweder Fuses falsch, Servo defekt oder falsch verdrahtet.

von Hendrik N. (hinnerk)


Lesenswert?

Die Fuses stimmen definitiv
Der Servo ist es auch nicht, da ich drei vom gleichen Modell habe und 
alle gleich reagieren.
Die Verdrahtung ist einfach, aber auch die ist nach meinem Voltmeter 
fehlerfrei.

Kann es sein, dass die Bandbreite des Rechteckimpulses auf den Servo 
eine komplett andere ist? Oder ist die bei alles Servos immer gleich?
Ich lese etwas von "Dead band width 10us" 
[http://www.servoshop.co.uk/index.php?pid=SG90G], wobei die auf 
verschiedenen Seiten total unterschiedlich angegeben wird. Ich weiß aber 
nicht was das ist.

Das nervt mich wirklich. Hat mich schon den gesamten Tag gekostet!!!!

von Wolfgang (Gast)


Lesenswert?

Hendrik N. schrieb:
> #include <util/delay.h>
> #define F_CPU 16000000UL               //externer Quarz,

Woher soll die delay-Routine wissen, was für einen Quarz du drin hast, 
wenn das #define erst nach dem #include kommt?

von Hendrik N. (hinnerk)


Lesenswert?

VIELEN DANK, WOLFGANG!!!

Du hast meinen Abend gerettet, ehrlich! :)
Das macht natürlich Sinn, aber daran habe ich gar nicht gedacht!
Funktioniert nun einwandfrei!!!

Feine Angelegenheit!

von Wolfgang (Gast)


Lesenswert?

Bitte, bitte

Vorher müßte beim Compilieren dann eigentlich die Warnung "F_CPU not 
defined for <util/delay.h>" aufgetreten sein.

von Hubert G. (hubertg)


Lesenswert?

Bei mir steht die Frequenz im AVR-Studio unter Project/Configuration 
Options
da vergisst der Compiler was im #define steht und gibt auch kein Warning 
aus. Und funktioniert daher natürlich auch.

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.