Forum: Compiler & IDEs Servo ansteuern


von Martin (Gast)


Lesenswert?

Hallo,
ich hab mich mal drangemacht und versucht, einen Servo anzusteuern:

#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <math.h>

int16_t sollwert=(0.001/0.000004);
int16_t wert_alt;
int8_t pos;

int main(void)
{

 sei();
 DDRB = (1<<DDB0);
 PORTB = (0<<PB0);
 wert_alt = 5000;
 TCCR0 = (0<<CS02) | (1<<CS01) | (1<<CS00); //Vorteiler 64
 TCNT0 = (255-5000);   //Timer vorladen
 TIMSK = (1<<TOIE0);  //Interrupt enablen

}

SIGNAL (SIG_OVERFLOW0)
{
 PORTB ^= (1<<PB0);   //Pin tooglen
 if (wert_alt = 5000)
  {
   TCNT0 = sollwert;
   wert_alt = sollwert;
  }
 else
  {
   TCNT0 = 5000;
   wert_alt = 5000;
  }
}
[/code]
Das Problem ist, das er bei Werten zwischen 0.002 und 0.001 eigentlich
immer nur in eine Richtung will, gleiches wenn ich die Werte noch
größer oder kleiner mache. D.h. es ist keine genaue Positionierung
möglich.
Der Timer sollte jeweils beim Overflow die Interruptroutine aufrufen.

Meine Berechung ist folgendermaßen:
16000000/64 = 2500000
1/250000 =4*10^-6=0.000004s Zeit, die ein Takt braucht
20ms = 0.02s -> 0.02/0.000004 = 5000
1ms = 0.001s -> 0.001/0.000004 = 250

Weiss jemand, wo mein Fehler ist?

Gruss
Martin

von Malte (Gast)


Lesenswert?

1. Wie soll denn das 8Bit TCNT0 Register den Wert 5000 aufnehmen?
2. Deklariere erstmal alle in der Interrupt Routine verwendeten
globalen Variablen als volatile. Damit sie immer direkt geladen und
zurück gesichert werden. (hab ich am Anfang auch falsch gemacht :-) )
3. Ich würde den Pin fest in die if Abfrage auf einen Wert setzen,
dürfte Rechenzeit sparen weil so PORTB nicht jedesmal erst ausgelesen
werden muss.

Deine Berechnungen habe ich jetzt erstmal nicht geprüft. Übrigens gibt
es auch einige Beispiele für Servos hier in der Codesammlung.

von Martin (Gast)


Lesenswert?

Also muss ich einen 16-Bit Timer verwenden? Mit dem will ich nämlich
eigentlich 2 Motoren per PWM ansteuern...

von Malte (Gast)


Lesenswert?

>Also muss ich einen 16-Bit Timer verwenden?
Jain. Zum schnellen Ausprobieren ob diene Berechnungen stimmen würde
ich es erstmal mit dem 16-Bit Timer versuchen.
Es geht aber auch mit einem 8 Bit Timer in dem du den Takt Vorteiler
des Timers in die Berechnungen miteinbeziehst. Also bei jedem Durchlauf
auch entsprechend änderst.

von Christian Schifferle (Gast)


Lesenswert?

Hallo Martin

Du hast einen typischen Anfängerfehler gemacht:

SIGNAL (SIG_OVERFLOW0)
{
 PORTB ^= (1<<PB0);   //Pin tooglen
 if (wert_alt = 5000)  <- hier muss ein == hin !!!!
  {
   TCNT0 = sollwert;
   wert_alt = sollwert;
  }
 else
  {
   TCNT0 = 5000;
   wert_alt = 5000;
  }
}

Den Rest vom Code habe ich nun nicht genau analysiert, aber mit dem
Bock kann es schon mal gar nicht funktionieren. Möglicherweise sind
allerdings noch andere fehler vorhanden, aber wer suchet, der findet
;-))

Gruss
Christian

von Rolf Magnus (Gast)


Lesenswert?

> Also muss ich einen 16-Bit Timer verwenden? Mit dem will ich
> nämlich eigentlich 2 Motoren per PWM ansteuern...

Brauchst du für die PWM denn wirklich einen 16bit-Timer?

von Michael Wilhelm (Gast)


Lesenswert?

Wenn das dein Hauptprogramm ist dann ändere es mal so:

int main(void)
{
 DDRB = (1<<DDB0);
 PORTB = (0<<PB0);
 wert_alt = 5000;
 TCCR0 = (0<<CS02) | (1<<CS01) | (1<<CS00); //Vorteiler 64
 TCNT0 = (255-5000);   //Timer vorladen
 TIMSK = (1<<TOIE0);  //Interrupt enablen
 sei();
for(;;)//ever
{
}

Nach dem Eintritt in main erst einmal die Timer- und
Variableninitialisierung, danach sei(), danach eine Endlosschleife. Es
kann sein, daß dein Programm ständig neu aufsetzt, da es aus main
herausläuft.

MW

}

von Martin (Gast)


Lesenswert?

Hallo,
danke für eure Hilfe! Ich habe es jetzt so gelöst, dass ich die 20ms
auf mehrere Timeroverflows aufteile und einen Prescaler von 256
verwende.
Und danke für den Tipp mit "==".
Gruß
Martin

von Julian Wolf (Gast)


Lesenswert?

Hi Leute ich muss von der Schule ein Projekt machen, in dem ich einen 
Poti an einen Microcontoller anschließen muss. Dieser Poti gibt dann ein 
Signal an den Microcontroller, der dieses dann umwandeln soll und an 
einen Servomotor weiter gebenj soll. Hat da zufällig jemand ein Programm 
oder kann mir helfen? MFG JUlian

von ???!!! (Gast)


Lesenswert?

Sollen wir dir deine Hausaufgaben machen?

von Karl H. (kbuchegg)


Lesenswert?

@Julian
Bitte beschränke dich auf einen geklauten Thread.

von Julian Wolf (Gast)


Lesenswert?

@   Karl heinz Buchegger
was meinst du mit einen geklauten thread?
mfg

von Joachim B. (joachimb)


Lesenswert?

Hallo Julian,

das Thema dieses Threads lautet "Servo ansteuern".
Da Deine Anfrage nur eingeschränkt ins Thema passt, solltes Du besser 
einen neuen Thread eröffnen.
Der könnte z.B. "Servo mit Poti einstellen" lauten.

Gruß
Joachim

von Julian Wolf (Gast)


Lesenswert?

Hallo Leute, ich habe mal ein frage und zwar muss ich von der Schule aus 
einen MC programmieren. Aber nicht einfach so sondern ein Poti soll ein 
Signal geben, welches der MC umwandelt und an den Servo weitergibt. Da 
ich mich absolut nicht damit auskenne wollte ich fragen, ob mir 
vielleicht jemand helfen kann oder ob mir sogar jemand ein fertiges 
Programm geben kann. MFG Julian

von Malte _. (malte) Benutzerseite


Lesenswert?

@Julian:
Da du jetzt einen ähnlichen Text zum zweiten Mal in den gleichen Thread 
postest zeigt aus meiner Sicht, dass du die Threads noch nichtmal liest. 
Wie wäre es wenn du die Frage deinem Lehrer stellst? ;-)

von Rolf Magnus (Gast)


Lesenswert?

> Da ich mich absolut nicht damit auskenne

Warum hast du eine Aufgabe bekommen, von deren Thema du keine Ahnung 
hast?

> wollte ich fragen, ob mir vielleicht jemand helfen kann

Bestimmt, z.B. dein Lehrer.

> oder ob mir sogar jemand ein fertiges Programm geben kann.

Hier wird bestimmt keiner deine Hausaufgaben für dich erledigen. 
Abgesehen davon ist dazu massenweise Material nicht nur hier im Forum, 
sondern überall im Internet zu finden. Das Stichwort heißt "Google".

von max (Gast)


Lesenswert?

Hallo!
Ich habe ein AVR90CAN128 Board (16Megahertz) und habe an ihm einen Servo 
angeschlossen,welcher mit 8Bit PWM läuft.Ich habe bis jetzt rausgefunden 
das bei dem Servo alle 20ms ein Puls erwartet wird,welcher zwischen 
1ms-2ms lang ist,je nachdem in welche Richtung er sich drehen soll.Bei 
8Bit PWM kann der Zeiger 12 versch. Stellungen annehmen ist das 
richtig?Meine Frage ist nun wie man es bewerkstelligt,den Zeiger zu 
steuern bzw. ihm zu sagen in welcher Position er sich befinden soll?Wäre 
nett wenn mir das jemand verständlich erklärt,weil ich absoluter 
Anfänger bin.Danke im vorraus!

von STK500-Besitzer (Gast)


Lesenswert?

>Bei 8Bit PWM kann der Zeiger 12 versch. Stellungen annehmen ist das
>richtig?

Nö. Es kommt auf den Vorteiler an. Wenn du die 8 Bit so "auteilen" 
kannst, dass sie sich auf 1-2ms verteilem, dann hast du eine Auflösung 
von 256.

von max (Gast)


Lesenswert?

danke für die antwort!

von Mike C. (chaosmike)


Lesenswert?

Hey Leute

Hat jemand einen Schaltplan von der Elektronik die im Servo steckt.
(Nicht die, die man braucht um das servo am Kabel anzusteuern).

Danke im voraus (-:
Mike.C

von Karl H. (kbuchegg)


Lesenswert?

Das ist ein Spezial-IC mit ein wenig schmückendem Beiwerk.
Google nach Servo-Controller und du wirst es finden.

BTW: Was hat diese Frage eigentlich im gcc Forum verloren?

von Mike C. (chaosmike)


Lesenswert?

Hab im Forum nach passenden Foren gesucht, und finde dass dieses am 
passensten ist.

Und bei Google hab ich schon alles durchsucht, da findet man eigentlich 
nur Servo ansteuerungen aber nicht die Interne Steuerung.

von Rolf Magnus (Gast)


Lesenswert?

> Hab im Forum nach passenden Foren gesucht, und finde dass dieses am
> passensten ist.

Weil du in dem Forum zufällig noch eine andere Frage gefunden hast, die 
auch was mit Servos zu tun hat? Oder was soll da passen? Deine Frage 
dreht sich nicht um GCC oder wenigstens um C-Programmierung. Nicht mal 
überhaupt um Programmierung geht's dabei.

> Und bei Google hab ich schon alles durchsucht, da findet man eigentlich
> nur Servo ansteuerungen aber nicht die Interne Steuerung.

Es gab früher mal sowas als Bausatz beim blauen Klaus, aber anscheinend 
haben sie den nicht mehr. Aber prinzipiell ist da, wie Karl Heinz schon 
schreibt, nicht viel mehr als ein IC drin. In Servos heutzutage oft nur 
noch als schwarzer Epoxy-Klecks auf einer winzigen Platine zu finden.

Das sind dann z.B. solche ICs:
http://pdf1.alldatasheet.net/datasheet-pdf/view/7404/NJRC/NJM2611.html
http://pdf1.alldatasheet.net/datasheet-pdf/view/102933/ETC/AA51880.html

von Karl H. (kbuchegg)


Lesenswert?

Wozu brauchst du die Hardware überhaupt?

Je nach Einsatzgebiet kann es sich lohnen, ganz einfach ein billiges 
Servo zu kaufen und die Elektronik dort auszuschlachten.

Der Preisunterschied bei Servos kommt durch die Qualität des Getriebes, 
des Potis und natürlich auch des Motors (+Leistungstreiber) zustande. 
Die eigentliche Auswerteelektronik ist aber in billigen Servos 
genausogut wie in teureren.

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.