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
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.
Aha! Habe an einen ATmega16 gedacht. Ich konsultiere gleich mal das Datenblatt!
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
@ 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
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
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.)
@ 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
@ 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
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
@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
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 ;-)
@ 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
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.