Forum: Mikrocontroller und Digitale Elektronik Servosignal einlesen


von El (Gast)


Lesenswert?

Hallo zusammen!!

Ich zerbreche mir über folgendes Problem den Kopf:

Ich sollte sechs verschiedene PWM-Servosignale präzise auf meinem ATmega 
einlesen können.

Problem: bei einem Sigmal klappt das gut mit einem Timer und einem 
externen Interrupt der die Flanken detektiert. Jetzt habe ich aber nicht 
acht externe Interrupts zu verfügung.
Ich könnte aber zum Beispiel ein IC vorschalten das nach einer 
Veränderung an den Eingeängen seinen Ausgang wechselt und das auf den 
Interruptport schalten.
So ähnlich einem XOR. Nur ist da das Problem, wenn zwei Zustände 
gleichzeitig wechseln gehts nicht.


Gibt es so ein IC? oder gibt es noch eine andere Lösung?



Lösungen sind herzlich willkommen!!
Gruss El

von Rolf Magnus (Gast)


Lesenswert?

Um welchen ATmega geht es denn? Die meisten haben auch einen PCINT. Das 
ist ein Interrupt, dem nicht nur ein Pin, sondern (z.B.) 8 auf einmal 
zugeordnet sind.

von El (Gast)


Lesenswert?

Aha! Habe an einen ATmega16 gedacht. Ich konsultiere gleich mal das 
Datenblatt!

von Dirk S. (disc)


Lesenswert?

Hallo El,
versuch doch mal mit einem 644p o.ä. Die haben Pin-Change-Interupts an 
jedem Eingang. Ich hab´s auch damit gemacht.

Gruß

Dirk

von Falk B. (falk)


Lesenswert?

@ Dirk Schmidt (disc)

>versuch doch mal mit einem 644p o.ä. Die haben Pin-Change-Interupts an
>jedem Eingang. Ich hab´s auch damit gemacht.

Dann sollte man aber mal berechnen wie gross der Fehler im schlimmsten 
Fall wird, wenn alle Servos im gleichen Moment ne Flanke auslösen und 
der AVR das einzeln abarbeiten muss. Bei 1..2ms Pulsdauer mit 1% 
aufgelöst sind gerade mal noch 10us, bei 16 MHz sind das gerade mal noch 
160 Takte!

MfG
Falk

von JanB (Gast)


Lesenswert?

Hallo,
wenn die Servosignal alle vom dem selben Empfänger
(und damit auch vom selben Sender) kommen,
dann sind die aktiven Teile der Servosignale (die 1-2 ms Pulse)
alle hübsch hintereinander angeordnet und überlappen sich nicht.
Sie werden ja alle hintereinander in dem 20ms-"Frame" das RC-Signales 
übertragen.
Das sollte die Auswertung erheblich vereinfachen.
N.B. Ich würde hier nicht mit flankengetriggerten Interrupts arbeiten,
sondern ich würde das Signal mit mögl. hoher Frequenz pollen.


Gruß Jan

von mr.chip (Gast)


Lesenswert?

Würde auch nicht mit Interrupts arbeiten. Besser so: Die 20 ms 
'stoppen', z.B. per Timerinterrupt und danach relativ oft pollen. 
Allenfalls könntest du die Signale auch auf eine einzige Leitung 
schalten und diese dann per Interrupt verfolgen. (Geht natürlich alles 
nur, wenn die Signale vom gleichen Empfänger kommen.)

von mr.chip (Gast)


Lesenswert?

...vom gleichen Sender... :-)

von Dirk S. (disc)


Lesenswert?

@ Falk Brunner (falk)
Wenn alle Signale gleichzeitig kommen, hat man natürlich Pech. Ist aber 
sehr unwahrscheinlich (siehe auch unten zu PCM und PPM) und bei 
geschickter Programmierung nicht zu tragisch.
Ich habe bei mir eine Auflösung von mehr als 2500 Schritten realisiert 
(Servosignal von -100% bis 100%, Mega 644 mit 20MHz, Prescaler vom 16bit 
Timer für das Ermitteln der Zeitpunkte auf 8).
Wenn ich die Signale mit dem gleichen Prozessor nach weiterer 
Verarbeitung wieder ausgebe, ist an einem angeschlossenen schnellen 
Digitalservo kaum ein Zittern bemerkbar. Feld, Wald und Wiesen 
Analogservos stehen still.

@  mr.chip (Gast)
Um die gleiche Auflösung wie oben mit einem Timer und pollen der 
Leitungen hinzubekommen, müsstest du alle 8 Takte die Eingänge 
überprüfen. Bei mir kommen alle 20ms nur je 2 Interrupts pro Servo. Also 
ein erheblich geringerer Rechenaufwand.

@  JanB (Gast)
Dass die Signele für die Servos von einem Empfänger nacheinander kommen 
müssen, ist nirgenwo spezifiziert. Bei alten PPM Empfängern ist das 
vielleicht so. Sobald diese aber eine interne Digitale Verarbeitung der 
Signale haben oder bei PCM Empfängern kann das ganz anders aussehen. 
Einige Projekte im Internet, die sich darauf verlassen (Quadrocopter 
z.B.), laufen deshalb dann nur mit bestimmten Empfängern.

Gruß

Dirk

PS: Wie schreibt man hier im Forum eigentlich einem bestimmten Benutzer 
eine PM. Muss man da die ganze Benutzerliste durchblättern, bis man den 
gefunden hat, oder gibt es da eine elegantere Möglichkeit?

@ klausleidinger: Den Mega 644p gibt´s bei Reichelt

von Falk B. (falk)


Lesenswert?

@ Dirk Schmidt (disc)

>Ich habe bei mir eine Auflösung von mehr als 2500 Schritten realisiert
>(Servosignal von -100% bis 100%, Mega 644 mit 20MHz, Prescaler vom 16bit
>Timer für das Ermitteln der Zeitpunkte auf 8).

Wieviel Kanäle?

>Einige Projekte im Internet, die sich darauf verlassen (Quadrocopter
>z.B.), laufen deshalb dann nur mit bestimmten Empfängern.

Eben. Deshalb sollte man ggf. das Konzept überdenken. Wie wäre es, jedem 
Servosignal einen eigenen kleinen AVR zu spendieren? 8 Piner reichen 
locker. Der misst das Signal per ICP und schickt das Ergebniss per 
I2C/SPI/UART an einen Master. Das ist dann wasserdicht! Und man braucht 
auch keine 20 MHz.

MfG
Falk

von El (Gast)


Lesenswert?

Hey vielen Dank für eure Anregungen!

Die Signale kommen alle von einem Empfänger. Ist somit tatsächlich nicht 
so schwierig wenn sie alle hintereinander kommen.
Ich werde es mal mit den Interupts probieren weil der uC noch andere 
zeitkritische Aufgaben zu erledigen hat.

Gruss El

von Karl-j. B. (_matrixman_)


Lesenswert?

@Dirk Schmidt

Wenn du hinter dem Name von einer Antwort des Benutzers dem du eine PM 
schreiben willst auf den Link klickst kommst du direkt drauf :)

mfg Karl

von Klaus L. (kllei)


Lesenswert?

OT @Dirk:
danke für die Info, aber bist Du sicher dass es sich um einen 644P 
handelt (keinen 644 im PU Gehäuse?)

Ich finde den 644P nicht bei Reichelt...

Der 644P (der neue mit 2 seriellen Schnittstellen) ist derzeit bei 
keinem Distri, nicht mal Spoerle und DigiKey, lieferbar.

CU,
Klaus

P.S. da OT, kannst Du gerne auf meinen Namen klicken und die PM mal 
ausprobieren ;-)

von MNR (Gast)


Lesenswert?

ATMega88 und verwandte haben auch PCINTs.

von Dirk S. (disc)


Lesenswert?

@  Falk Brunner (falk)
Ich hab momentan 5 Eingänge und 5 Ausgänge. Das auf jeweils 8 zu 
erweitern ist kein Problem (im Prinzip ein define ändern, einmal neu 
übersetzen).

Ich hab das Konzept ja überdacht, daher die angesprochene Lösung. Mit 
Deiner Variante bräuchte ich da ja jede Menge Prozessoren. Mit etwas 
geringerer Auflösung würde es sicher mit weniger als 20 MHz laufen, ich 
brauche es aber möglichst genau. Ausserdem muss der Prozessor noch ein 
paar andere Aufgaben erledigen.

@ Karl-j. B. (matrixman)
Das hab ich auch schon bemerkt ;-). Was ist aber, wenn derjenige keinen 
Beitrag im aktuellen Thread hat? Nach bestimmten Benutzernamen (falls er 
irgendwo anders schon mal was geschrieben hat) kann man ja weder im 
Forum, noch in der Benutzerliste suchen?!?

Gruß

Dirk

von Falk B. (falk)


Lesenswert?

@ Dirk Schmidt (disc)

>geringerer Auflösung würde es sicher mit weniger als 20 MHz laufen, ich
>brauche es aber möglichst genau. Ausserdem muss der Prozessor noch ein
>paar andere Aufgaben erledigen.

Ja eben! Du willst es sehr genau mit wenig CPU-Belastung. Das geht nur 
dann, wenn SICHERGESTELLT ist, dass die Servopulse alle schön versetzt 
sind. Ist es das? So ein Tiny kostet keine 1,50. Vielleicht kan man auch 
mit einem tiny zwei oder drei Sigale erfassen, der muss sich ja um nix 
anderes kümmern.

MfG
Falk

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.