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
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.
Also muss ich einen 16-Bit Timer verwenden? Mit dem will ich nämlich eigentlich 2 Motoren per PWM ansteuern...
>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.
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
> 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?
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 }
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
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
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
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
@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? ;-)
> 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".
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!
>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.
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
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?
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.
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.