Forum: Mikrocontroller und Digitale Elektronik MSP 430 und Servo


von Felix D. (swerix)


Lesenswert?

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

von fs (Gast)


Lesenswert?

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?

von Felix D. (swerix)


Lesenswert?

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

von fs (Gast)


Lesenswert?

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...

von Felix D. (swerix)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

von Felix D. (swerix)


Lesenswert?

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

von André H. (andrekr)


Lesenswert?

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.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

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

von Hannes Lux (Gast)


Lesenswert?

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

...

von STK500-Besitzer (Gast)


Lesenswert?

>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...

von Hannes Lux (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.