Hallo, durch das Forum hab ich mich soweit durchgelesen, allerdings auf mein Frage keine Antwort gefunden. Ich möchte mit dem MSP 430 f 2013 gerne mehrere Digitalservos ansteuern. Allerdings kann ich mit Timer A und B nur 2 Pins ansteueren. Jetzt die Frage: Ist es möglich, in einer Schleife den Zählerstand abzurufen und danach zu entscheiden, ob ein Pin 1 oder 0 ist? Ist die Zeit dann auch noch genau genug um einen Puls um eine mSekunde abzufragen? Hoffe ihr könnt mir weiterhelfen. Gruß Swerix
ich verstehe deine Frage noch nicht ganz. erklär nochmal genau was du tun willst. Mit jedem Timer einen Servo ansteuern? Also für jeden Servo einen Timer und einen Pin?
Hallo, 2 Timer und 2 Servos ist kein Problem. Mein Problem ist, dass ich gerne 3 Servos ansteuern möchte. Also hab ich mir gedacht, ich nehme eine while Schleife die das Zählerregister TAR abfragt und mit meinem vorgabewert vergleicht. Während dieser Zeit ist der Pin auf 1 und sowie die Schleife Verlassen wird, soll der Pin auf 0 gesetzt werden. Allerdings laufen mir bei dieser Aktion alle Zeiten aus dem Ruder, und was der Servo macht, ist Glückssache. Und eigentlich wollte ich nur die Pins wo die Servos dran hängen nacheinander für eine Milisekunde auf 1 setzen und nach ca. 20 ms wider auf 1. Und in der 2. Runde wollte ich dann verschiedene postionen Ansteuern. Hoffe, das ganze ist jetzt eher klar. Gruß Felix
wenn du die servos synchron schalten willst sehe ich kein Problem. hänge die servos an einen Port und lade den timer mit 1 ms. wenn Timer abgelaufen Invertiere den Port, dann lade den timer mit 20 ms und starte den timer wenn Timer abgelaufen timer neu laden mit 1 ms... und Port wieder invertiern.... momentan sehe ich das Ziel deiner Ansteuerung noch nicht...
Ok, eventuell sollte ich dazu sagen, das die Servos unterschiedliche Takte bekommen sollen. Als Beispiel: Servo 1 = 1,5 ms Servo 2 = 0,7 ms Servo 3 = 1 ms deshalb hängen jeder servo an einem Port.
Etwas andere Methode (so wie es Funkfernesteuerungen machen): Zeitmultiplexing! Dazu wird nur ein Timer benötigt. Der wird so initialisiert, dass er ein Interrupt (oder sowas; ich kenne den MSP nicht) am Ende einer bestimmten Zeit (zwischen 1ms und 2ms) erzeugt. Zu Beginn dieses Zykluses wird der Pin High geschaltet, an dem das Servo hängt, das man jetzt ansprechen möchte. Am Ende wird dieser Pin ausgeschaltet, der Timer mit der Zeit für das nächste Servo geladen, der nächste Pin gesetzt und der Timer gestartet. Das macht man der Reihe nach und fängt dann von vorne wieder an. Allerdings sollte man beachten, dass die gesamte Zyklus-Zeit für alle Servos nicht länger als 20ms ist (also maximal 10 Servos), weil sie sonst an Kraft verlieren - zumindest die analogen Servos.
Das ist ein bisschen schwierig mit diesem kleinen Prozessor. Timer A hat 2 Capture/Compare-Units, damit kannst du die zwei Servos ansteuern. Das löst aber noch nicht das Problem der Auswertung eines Signals, das vom Empfänger kommt. Dafür bräuchte man eigentlich einen weiteren Timer mit Capture Register. Du kannst jetzt versuchen, das in Software zu implementieren, d.h. du legst den Eingang für den Empfänger auf einen Interrupt Pin und wertest bei jedem Pin Change das Zählregister des Timers A aus und berechnest die Eingangspulsweite so in Software. Das funktioniert natürlich nur, weil die Eingangsgrundfrequenz der Ausgangsgrundfrequenz entspricht. Grüße, Peter
Hallo, danke für eure Tipps. Hab mich ans probieren gemacht und die Idee ein wenig umgewandet. Es ist jetzt so, dass ich den Timer Loslaufen lasse und immer den Wert im TAR Register abfrage. Sollte der bei der gewünschten Zahl sein, wird der Ausgangspin auf Low gelegt. Das Heißt, zu Beginn sind alles Pins High und mit der Zeit wird ein Pin nach dem anderen auf Low gelegt. Ist das Abgeschlossen wird Timer B gestarted, der für die 20 ms auf Low sorgt und anschließend started alles wieder von Vorne. Abweichungen gibt es bei dieser Art, allerdings muss ich die nicht wieter beachten, da ich mit Digitalservos arbeite. Da ist das 20 ms intervall nicht so wichtig und es können 1 bis 2 ms Abweichung problemlos verkarfted werden. Also danke für eure Tipps. Gruß Felix
Noch ein Vorschlag, so etwas macht man bei längeren Zeiträumen (Weckzeiten etwa) aber ich wüßte nicht, warum das nicht auch bei kurzen Zeiten funktionieren sollte. Auf deinen konkreten Fall angepaßt, sieht das Verfahren in etwa so aus: Du berechnest die Zeiten für alle Servos die du hast (gehen theoretisch beliebig viele). Du nimmst die kürzeste Zeit und lädst damit den Timer. Wenn sie erreicht ist, schaltest du den entsprechenden Pin um und lädst den Timer mit der Zeit, die noch zum nächsten Ereignis übrig ist. Und so weiter. Du mußt nur schauen, daß das umschalten des Pins und das Laden der nächsten Zeit möglichst schnell ist, denn in dieser Zeit läuft die Uhr ja nicht. Sollte es zu lange dauern, kannst du die Zeiten ja kompensieren.
Jetzt muss ich doch nochmal nachfragen: Der MSP430F2013 hat doch gar keinen Timer B? Machst du das also alles über Timer A und die beiden Compareregister? Oder hast du einen anderen Prozessor, der einen Timer B hat? Grüße, Peter
Hat denn keiner diesen Beitrag Beitrag "Re: MSP 430 und Servo" gelesen bzw. verstanden? Es wird nur 1 Compare-Einheit für bis zu 10 Servos gebraucht. MSP430 ist nicht mein Ding, ein AVR-Beispiel gibt es hier: http://www.hanneslux.de/avr/mobau/7ksend/7ksend02.html ...
>Hat denn keiner diesen Beitrag >Beitrag "MSP 430 und Servo" >gelesen bzw. verstanden? Wen interessiert schon, was ich schreibe... ;) Das System, alle Servos gleichzeitig anzusteuern kann so unschöne Effekte nach sich ziehen, dass ein Servo nicht angesteuert wird, weil sein Vergleichswert so dicht bei einem anderen liegt, dass er aufgrund der Abarbeitungszeit des ersten ignoriert wird. Ist aber scheinbar egal... Wieso schreibe ich mir hier eigentlich die Finger wund, wenn nur Hannes es liest? Und den braucht es nicht interessieren, weil er es eh schon weiß. Nächstes Mal male ich es auf...
> Das System, alle Servos gleichzeitig anzusteuern kann so unschöne > Effekte nach sich ziehen, ... Mal ganz abgesehen von der Tatsache, dass dabei auch alle Servos gleichzeitig Strom ziehen und die Stromversorgung sehr periodisch und stark belasten. Naja, lass sie machen... ...
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.