mikrocontroller.net

Forum: Compiler & IDEs Servo ansteuern


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin (Gast)
Datum:

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

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian Schifferle (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

}

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Julian Wolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ???!!! (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollen wir dir deine Hausaufgaben machen?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Julian
Bitte beschränke dich auf einen geklauten Thread.

Autor: Julian Wolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@   Karl heinz Buchegger
was meinst du mit einen geklauten thread?
mfg

Autor: Joachim Börke (joachimb)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Julian Wolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Malte __ (malte) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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? ;-)

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die antwort!

Autor: Mike C. (chaosmike)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mike C. (chaosmike)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/74...
http://pdf1.alldatasheet.net/datasheet-pdf/view/10...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.