Forum: Mikrocontroller und Digitale Elektronik PWM für Modellservos


von Gottfried Bremer (Gast)


Lesenswert?

Hi
kann mir jemand den genauen Aufbau des PWM-Signals für Modellservos
(also das Signal, das aus'm Empfänger kommt und von den Servos
verstanden wird) beschreiben (Länge des Pulses und die Verhältnisse für
die jeweiligen Vollausschläge)?

von Rahul (Gast)


Lesenswert?

Mindestlänge 1ms
Mittelstellung bei 1,5ms
Endausschlag bei 2ms

Zumindest bei den meisten Firmen... Robbe/Futaba haben die
Mittelstellung bei 1,52ms...

Gruß Rahul

von Gottfried Bremer (Gast)


Lesenswert?

und dazwischen?
Wie lang ist denn ein Takt(wie lange muss das Signal jeweils low und
high sein?)

von Frank Linde (Gast)


Lesenswert?

Die von Rahul genannten Zeiten sind die Steuerzeiten (High-Pegel)
innerhalb eines 20 ms langen Fensters. Beispiel:

Servo in Mittelstellung

 1,5 ms high
18,5 ms low
-----------------------
20,0 ms Gesamtzeit

Wobei ich die Erfahrung gemacht habe, dass die 20 ms auch verändert
werden können/müssen, um eine flotte Bewegung zu erreichen. Das hängt
vom Servo-Typ ab. Mußt Du mal ein wenig mit herumspielen.

Gruß, Frank

von Siegfried (Gast)


Lesenswert?

Ich meine das nur die älteren Graupner Anlagen (vor 1990)
 1,5 ms high / 18,5 ms low machen.
Alle anderen Anlagen machen
 1,5 ms low / 18,5 ms high.
Bin da aber auch nicht mehr so auf dem Laufenden.

Da alle Servo-Signale nacheinander kommen braucht man halt eine
8-Kanal-Anlage 8 x 2ms = 16ms. Zum Synchronisieren (nächster Frame)
braucht die Anlage auch noch ein paar ms. Also 20ms kommt bei Anlagen
mit wenigen Kanälen hin. Bei mehr als 6 Kanälen wirds aber schon eng
mit den 20ms.

Siegfried

von Gottfried Bremer (Gast)


Lesenswert?

Die Servosignale kommen nacheinander? Jetzt bin ich verwirrt!
Ich hatte eigentlich vor, die Signale eines Modellbauempfängers(also
das, was ich an der Fernsteuerung mache) erst in 'nem AVR
auszuwerten(indem ich die Digitaleingänge abfrage) und dann an den
Digitalen Ausgängen an die Servos weiterzureichen.
Wenn ich also über einen Kanal jeweils nur ein Servo betreibe, müsste
ich doch am Anfang jedes 20ms-Intervalls alle Ausgänge auf High setzen
können und dann, je nach gewünschter Stellung nach 1-2ms die Ports
wieder auf low machen (oder halt umgekehrt).

von leo9 (Gast)


Lesenswert?

Kurze Erläuterung aus der Modellbau-Ecke:
Auf der Funkstrecke werden tatsächlich alle Kanäle nacheinander
übertragen:
       _   __   __
 __| |_| |_|  |_|   |________________________

in diesem Beispiel ein Vierkanalsender (Ch.1&2 Vollausschlag, Ch3.
Mitte und Ch. 4 Vollausschlag Gegenrichtung). Das Signal wird alle 20ms
wiederholt (das lange Low dient zur Synchronisation). Das geht sich bis
9Kanäle aus, Fernsteuerungen mit mehr Kanälen sind mir nicht bekannt.
Der Empänger zerteilt dieses Signal nun in x Servosignale und jedes
Servo bekommt alle 20ms "seinen" Impuls.
Die Pegel sind lang 0V und der Impuls hat 5V, die invertierten Signale
gabs (vor ~1980) mal bei Graupner, die verwenden heute aber auch das
Standard-Signal.

Fürs Servo ist nur wichtig dass es alle 20ms einen Impuls bekommt.

grüsse leo9

von crazy horse (Gast)


Lesenswert?

ungefähr 20ms..., das ist völlig unkritisch, kann auch alle 5ms oder
30ms kommen, funktioniert trotzdem. Also die Impulszeiten mit nem Timer
erzeugen, immer einen nach dem anderen, KEINE Hardware-PWM verwenden,
gibt ganz schlechte Auflösung.

von Gottfried Bremer (Gast)


Lesenswert?

Ich hab das eben mal probiert.
Hab' als Widerstand vor den Port ein kOhm gemacht. Das Servo macht
garnix.

Am Port, aus dem das Signal kommen soll, messe ich mit 'nem
Digimultimeter ca. 0,4 Volt, wenn ich nichts anschließe (1,5ms*5V +
18,5ms*0V und das ganze geteilt durch 20ms kommt gut hin).

Wenn das Servo angeschlossen ist, messe ich hinter dem Widerstand
jedoch ca. 3,6V. Es kommt also ein Signal aus dem Servo. Muss ich das
also mit 'nem Transistor verstärken, reicht ein kleinerer
Widerstand(wie belastbar ist eigentlich so ein Digitalausgang bei
AVRs?) oder ist vielleicht das Servo kaput?

von Gottfried Bremer (Gast)


Lesenswert?

Ach ja... Ich nehme mal an, die Standartbelegung ist foglende:
Schwarzes Kabel: Masse
Rotes Kabel: +5V
Blaues Kabel: PWM-Signal
Ich hab's auch mal mit Rot und Blau vertauscht probiert. Das Servo
macht trotzdem nix.

von Gottfried Bremer (Gast)


Lesenswert?

Ok, jetzt geht's
Schwarz ist PWM und Blau Masse
Warum können die sich nicht auf einen Standart wegen der Kabelfarben
einigen...

von eric drew (Gast)


Lesenswert?

wird das servo direkt mit einem 1k widerstand an ein port angeschlossen
?

besten dank

von Frank Linde (Gast)


Lesenswert?

Ich betreibe schon seit längerer Zeit Servos direkt an Ports (ohne
Schutzwiderstand) von AVR-Controllern. Geht einwandfrei, da es ja nur
eine Steuerleitung ist. Die Leistungselektronik sitzt im Servo.

Gruß, Frank

von Gottfried Bremer (Gast)


Lesenswert?

Ich probiere grade, ein Fernsteuersignal auf 3 Kanälen auszulesen und
gleichzeitig Signale für drei Servos auf drei anderen Kanälen
anzusteuern.
Beim Auslesen hab' ich folgendes Problem:
Um die vom Empfänger übermittelte Servostellung auszuwerten muss ich
die Länge des Impulses messen.
Diese beträgt 1-2ms. Um also die Servoposition nur über ein Byte
aufzulösen müsste ich in der einen Milisekunde mindestens 255 mal
überprüfen, ob der Pegel an dem Port hoch- oder 'runtergegangen ist.
Ich brächte also (bei meinem 4MHZ-Atmel) alle
4000000 / (255*1000) = ca. 16 Takte
eine Messung.
Für den Vergleich des Timer Wertes mit der berechneten Signaldauer des
vom AVR gleichzeitig erzeugten PWM-Signals brauche ich aber je Kanal
einen Vergleich von 16-bit-Variablen (braucht schon mehrere Takte). Die
Genauigkeit würde also massiv leiden und ich könnte sonst kaum noch was
laufen lassen.
Kann ich möglicherweise die Signale vom Empfänger an die Interupt-Ports
anschließen und so einen Wechsel des Eingangssignals sofort
registrieren? Wie würde ich sowas abfragen?
PS: Weis jemand, wie viele Interups ein ATMEGA8 hat?

von Harald (Gast)


Lesenswert?

An sowas ähnlichem Bastel ich auch gerade. Allerdings verwende ich einen
ATMega162 statt dem ATMega8.

Zuerst mal würde ich dir vorschlagen die Genauigkeit zu reduzieren.
Wenn du nur 100 oder eventuell sogar nur 50 verschiedene Zustände
nimmst kannst damit eine Menge Rechenzeit gewinnen.

Es gibt beim ATMega8 die INT Pins. Wenn sich an einem dieser beiden
Pins der anliegende Pegel ändert wird ein Interrupt ausgelöst. Du
könntest also mit Dioden deine Eingangssignale zusammenschalten und an
diesen einen Pin legen. Vorraussetzung dazu ist allerdings, dass die
Signale vom Empfänger nacheinander kommen - was ja bei der Verwendung
von nur einem Empfänger normalerweise auch so ist.

Warum willst du 16 Bit Werte vergleichen. Stell einen 8 Bit
Timer/Counter so ein, dass er z.B. einfach alle 10us überläuft und
einen Interrupt auslöst. Das kannst du erreichen indem du einen
geeigneten Prescaler einstellst und das Register in dem hochgezählt
wird schon mit einem Wert vorbelegst. Bei jedem Auslösen dieses
Interrupts erhöhst du eine 8Bit Zählervariable um 1.

Wenn du dann einen Interrupt auf dem INT Pin bekommst und merkst dass
sich das Signal von LOW auf HIGH geändert hat, setzt du den Wert dieses
Zählers auf Null und wartest auf den nächsten Interrupt wo der Pegel
wieder auf LOW wechselt. Dann gibt dir die Zählervariable die Zeit des
Impulses an.

Das Erzeugen der Signale kannst du übrigens ähnlich machen. Da einfach
in der Interruptroutine des Timers eine weitere solche Zählervariable
anlegen. Dann fängst du an einen neuen Impuls zu senden und belegst
eine andere Variable mit dem Zeitwert wo der Ausgang wieder auf LOW
gesetzt werden soll. In der Interruptroutine dann den aktuellen Wert
des Zählers mit dem Endwert vergleichen und bei Übereinstimung den
Ausgang LOW setzen.

Ich hoffe du kommst mit der Beschreibung einigermaßen klar.

von Gottfried Bremer (Gast)


Lesenswert?

Und immer wenn das Signal von High auf Low wechselt, steht in der
Zählervariable die Länge des Impulses, die ich in eine weitere Variable
schreibe bevor der Zähler gelöscht wird...
Kann man die Interupts so einstellen, dass sie bei Pegeländerungen in
beide Richtungen reagieren?
Bei mehr als zwei Kanälen müsste ich dann die Eingänge zusammen auf die
Interupts legen und ausserdem nochmal getrennt auf andere Eingänge,
oder wie kann ich bei den Signalen an den Interupts 'rauskriegen,
welcher Kanal gerade an der Reihe ist(und müsste ich bei der Lösung mit
den Dioden die Pull-Ups anmachen und die Dioden sorum anschließen, dass
der Empfänger den Eingang nur noch auf Low legen kann?)?

von Gottfried Bremer (Gast)


Lesenswert?

Noch ein Problem:
Bei 4MHZ läuf ein 8-Bit-Timer (mit einem Prescaler von 1) alle 63,75µS
über. Das ist in der 1ms, die den Unterschied zwischen den beiden
Maximalauschlägen macht, nichteinmal 16 mal.
Das ist ja gerade das Problem: ständig abfragen geht nicht. Deshalb
muss das irgendwie mit den Interups gehen.

von Harald (Gast)


Lesenswert?

Warum eigentlich nur 4 MHz, so ein Mega8 verkraftet doch 16 MHz ?

Um den Timer öfter zum Überlaufen bringst musst du das Register in dem
die Timer Impulse hochgezählt werden schon mit einem Wert vorbelegen.
Als Beispiel: Mein Controller hat 16 MHz, ich hab de einen Prescaler
von 8 eingestellt. Der Timer erhöht das Zählregister also jede halbe
Mikrosekunde um eins. In 10 us würde das Register also um 20 erhöht. Da
ich ja will dass das Register schon nach diesen 20 Einheiten überläuft
und nicht erst wartet bis die 255 erreicht sind, schreibe ich (255 -
20) = 235 am Programmstart und jedes Mal wenn der Interrupt ausgelöst
wird in dieses Register hinein.
Dadurch bekommst du den Interrupt wirklich genau alle 10 us.
Alternative dazu wäre ein 100KHz Quarz an einem der INT Eingänge.

Wie du das herausfinden kannst wann die Impulse wieder von vorn
beginnen musst du selbst rausfinden, die Lösung alles nochmal an die
Datenleitungen zu hängen würde zwar wahrscheinlich funktionierten, aber
dadurch gehen halt viele Pins verloren.
Am einfachsten findet man das Ende wahrscheinlich indem man auf eine
große Pause zwischen den einzelnen Signalen wartet.

Wie du das alles genau verschalten musst kann ich dir leider auch nicht
sagen, von Elektronik hab ich nahezu keine Ahnung ...

Viele Grüße!

von Hannes Lux (Gast)


Lesenswert?

Hallo...

10µs-Raster finde ich gut, das gibt Werte zwischen (80) 100 und 200
(220) für gültige Impulsbreiten. Damit kann man ganz brauchbar
arbeiten. Für einen Fahrtregler (der ja eigentlich nur ein "Steller"
ist) ergeben sich nach Abzug der Mittenspreizung etwa 45 Fahrstufen in
jede Richtung, ich denke, damit kann man leben...

Wieder ausgeben würde ich die gescannten Impulse nicht, die Servos
haben sicher nix dagegen, wenn ein AVR "mithört"...

Bit- & Bytebruch...
...HanneS...

von Gottfried Bremer (Gast)


Lesenswert?

Wieder ausgegeben werden sollen die Signale schon deshalb, weil der AVR
nicht nur mithören, sondern auch die Signale der Fernsteuerung vor der
Weitergabe verändern soll. Einfach die gleichen Werte wieder
auszugeben, ist nur eine Testanwendung. Bei einer Unterbrechung der
Verbindung(erstmal simuliert durch Abschalten des Senders) sollte der
µC z.B. umkehren (und dabei weiter versuchen, wieder Signale zu
empfangen).
Auch könnte man ein V-Leitwerk so ohne weitere Elektronik ansteuern
(nehm' ich an, ich hab' mir die Mathematik dahinter noch nicht so
genau angesehn).

von Rahul (Gast)


Lesenswert?

hmmm... mein Beitrag war wohl nicht ganz vollständig.
Ich habe festgestellt, dass es meinen Servos ziemlich egal ist, in
welchem Abstand die Impulse eintreffen.

Die Idee mit dem Timer finde ich sehr interessant. Dachte früher immer
daran, die Capture-Funktion zu benutzen, was aber zu einer riesigen
(16-Bit) Auflösung führen würde.

Die von Gottfried geschilderten Anwendungen gibt es im Prinzip schon
ziemliche lange; einerseits nennen sie sich Fail-Safe oder Autopilot
andererseits handelt es sich um eine Mischer-Funktion beim V-Leitwerk.
Ich bin mir beim V-Leitwerk nicht ganz sicher, aber wenn man bei
Kettenfahrzeugen die Steuerung wie bei normalen Strassenfahrzeugen mit
zwei Steuer-Hebeln realisieren will, muß der Mittelwert der Signale für
Fahrtrichtung (vor/rück) und Lenkung (links/rechts) gebildet werden.
Bei 8 Bit ist das ziemlich einfach: addieren und eins nach rechts
schieben (mit Carry) oder erst beide Werte nach rechts schieben und
dann addieren.
Herausfinden, um welchen Kanal es sich bei dem Interrupt handelt könnte
man ja dadurch machen, dass der erste Kanal noch auf einem weiteren
Eingang liegt. Die folgenden wären dann durch das Programm vorgegeben.

INT2 (beim ATmega162) lässt sich flankengetriggert einstellen, wobei
man die Flankenrichtung vorgeben kann.

Mich würde interessieren, ob sich schon mal jemand mit dem Protokoll
von Multiswitch- oder Multiprop-Modulen auseinander gesetzt hat. Da
diese Module biz zu 16 Signale über einen Kanal übertragen, müssen die
ja auch im Gänsemarsch übertragen werden. Wie sieht es da mit der
Synchronisation aus?
Es geht mir nicht darum, Robbe und den anderen Anbietern Konkurrenz zu
machen, sondern ich würde gerne möglichst viele Funktionen von nur
einem Controller (schalten, leuchten, drehzahlstellen) übernehmen
lassen, um möglichst klein zu bauen.

Gruß Rahul

von leo9 (Gast)


Lesenswert?

Multiprop und Multiswitch Signale werden tatsächlich nacheinander
übertragen. 1ms bedeutet Ein, 1,5ms Aus und 2ms dienen zur
Synchronisation, zusätzlich muß der Sender dem sendeseitigen Modul auch
ein Syncsignal zur verfügungstellen, damit das Modul die
"Schalterstellung" des nächsten Kanals anbieten kann.
Bei Multiprop wird das normale Servosignal 1-2ms auf 1-1,5ms gedrückt,
damit verliert man zwar die halbe Auflösung, aber die 2ms werden ja
fürs Sync benötigt.

grüsse leo9

von Hannes Lux (Gast)


Lesenswert?

Hallo...

Veränderte (manipulierte) Servo-Signale ausgeben ist ok. Es sollte aber
darauf geachtet werden, dass eine gewisse Hysterese vorhanden ist,
sonst kann es zu derben Servo-Schwingungen kommen.

Ein "Mithören" ist z.B. für Blinklicht (Auto) sinnvoll, Servo hängt
direkt am Empfänger (-Schiebregister), AVR "hört (parallel) mit" und
schaltet Blinker.

Etwas einfacher wird die Sache, wenn man im Empfänger das Signal vor
dem Schieberegister sucht (also das empfangene Sendertastsignal) und
dies dem AVR zuführt. Dann brauch man nur ein Signal auswerten, was
dann wieder mit ext-INT am besten geht. Der Impuls ist dann etwa 0,5ms
breit, die Kanalinformationen stecken in den Impulsabständen (1...2ms,
>2,55ms ist Synchronpause). Somit kann der AVR alle Kanäle auswerten
(Auswertung der L/H-Flanke reicht!!!) und ggf manipulieren. Ich habe
das mal in einer Primitiv-Version mit AT90S1200 gemacht, enthält
Decoder, Fahrtregler, Blinker, Bremslicht, Rückfahrlicht und einige
Schaltkanäle für Licht, Hupe usw., enthält aber keine Trimmung und hat
noch einige Prog-Fehler. Ich werde das später noch mal mit Tiny26
machen, dann incl. Servoelektronik und Programmiertaste (Trimmung).

Bit- & Bytebruch...
...HanneS...

von Harald (Gast)


Lesenswert?

Hannes Lux;

Könntest du das mit der Hysterese und den Schwingungen eventuell
nochmal etwas genauer erklären ?

Viele Grüße

von Henning (Gast)


Lesenswert?

wenn abwechselnd der wert 50 und 51 übertragen wird versucht der servo
immer hinterherzukommen. das kann zB passieren, wenn dein Senderknüppel
direkt zwischen diesen beiden werten steht.
das servo sersucht also auch ständig die zwar nahe aneinander liegenden
stellungen aber das möglichst schnell zu erreichen. das ergibt dann ein
zittern und einen hohen & unnötigen stromverbrauch

weiss nich obs schon gesagt wurde, die kanäle werden nacheinander
übertragen, deshalb kann man jeden 2ten kanal OR verknüpen und hatt
dann nurnoch 2 interrupt pins und es reicht 1 timer zum messen. wer
will darf auch den 16Bit nehmen, aber die genauigkeit hat imho keinen
vorteil mehr, wenn man dann noch die hysterese einbaut.
-__________-_ Ch1
_-__________- Ch2
___-__________-  Ch3
___-_________  ch4

-_-_______ ch1 or 3
_-_-______ ch2 or 4

wie haste denn die endstufe deines fahrenreglers gestalltet?
ich habe einen hardware pwm auf fets gegeben. meine billige
senderanlage hat allerdings keine zuverlässigen signale (oder
störungen?!), und ich weiss nich ob evtl. dadurch mein boot gegen die
uferböschung getrieben wurde :)

von Hannes Lux (Gast)


Lesenswert?

Hallo...

Das mit der Hysterese bzw. dem Flattern hat Henning schon bestens
erklärt, danke...

Endstufe...
Tja, einfache Transistorbrücke (BD677/678), denn ich brauchte nur was
zum Testen, da ich keinen professionellen Modellbau (mit
stromfressenden Hochleistungsmotoren) betreibe. Eine Brücke mit
BTS-PROFETs ist geplant, aber noch nicht realisiert.

Bit- & Bytebruch...
...HanneS...

von Gottfried Bremer (Gast)


Lesenswert?

Gibt's flankengetriggerte Interupts auch beim ATMEGA8 ?
So einer ist gerade von Reichelt zu mir unterwegs zusammen mit 'nem
16MHZ Oszillator. Dann steigt die Auflösung bei der jetzt eingebauten
Methode auch schon von knapp 16 auf über 60 Schritte (auch wenn so ein
AVR schon fast überdimensioniert für die Anwendung ist).

von leo9 (Gast)


Lesenswert?

ja, int0 und int1.
... und ins Datenblatt schauen dauert ungefähr genauso lang wie die
Frage ins Forum stellen ;-)

grüsse leo9

von Gottfried Bremer (Gast)


Lesenswert?

Sorry, das geht für mich aus dem Datenblatt des Mega8 gerade nicht
hervor, wann der Interupt ausgelöst wird: Beim Wechsel zu einem
bestimmten Pegel oder bei Pegeländerungen in beide Richtungen und wie
man das ggf. einstellen kann.

von Hannes Lux (Gast)


Lesenswert?

Hallo...

Sicher reagiert der externe INT auf Flanken, beim Mega8 kannst du
steigende, fallende oder auch wechselnde Flanke einstellen,
Einzelheiten findest du im Datenblatt.

Aber wieso ist die Auflösung so gering?
Mit 2313 (8MHz) erreiche ich 100 Stufen (alle 10µs) bei 4
Kanalimpulsen.
Ein Fahrtregler (2313, 8MHz) für Raupenfahrwerk scannt 4 Kanalimpulse,
mischt Fahrkanal und Lenkung (K1, K2) zu zwei Antrieben (4 * PWM für
zwei H-Brücken) und schaltet 4 Funktionen (K3, K4) wahlweise direkt
oder toggelnd. Nach Abzug von Mittenspreizung und Hysterese stehen
immer noch etwa 45 Fahrstufen je Fahrtrichtung zur Verfügung. Der
genaue Wert richtet sich nach der verwendeten Fernsteuerung, der Regler
kann per Programmiertaste (und LED) an die individuellen Impulswerte
der Fernsteuerung angepasst werden (Neutralstellung, max. Tempo,
Fahrtrichtung, Lenkrichtung, Schaltschwelle Funktionen). Aus den
Fahrinformationen wird noch Bremslicht und Rückfahrlicht generiert. Bei
ungültigen oder fehlenden Kanalimpulsen schaltet sich der Regler ab.

Mit einem einfachen Fahrtregler für Auto oder Boot mit Tiny15 (1,6MHz)
erreiche ich auch eine Auflösung von 10µs (ext.INT), also 100 Stufen
von 1ms bis 2ms. Auch hier werden nach Abzug von Mittenspreizung und
Hysterese etwa 45 Fahrstufen je Fahrtrichtung erreicht. Der Regler hat
einen Kanalimpulseingang, zwei PWM-Ausgänge für H-Brücke,
Rückfahrlicht, Bremslicht und Programmiertaste (Neutralstellung, max.
vorwärts, Richtungsumkehr) zur Anpassung an die individuellen Impulse
verschiedener Anlagen. Auch dieser Regler hat eine Abschaltung bei
fehlenden oder ungültigen Impulsen.

Bit- & Bytebruch...
...HanneS...

von Gottfried Bremer (Gast)


Lesenswert?

Ich benutze im Moment auch einen At90S2313. Mit leider nur einem 4MHZ
Quarz.
Sind da standartmäßig die Interups für steigende und fallende Flanken
aktiviert?

von Hannes Lux (Gast)


Lesenswert?

Moin..

Ext. INT ist beim 2313 zwischen steigend und fallend wählbar, toggelnd
gibt es nicht, siehe Datenblatt. Ich benutze ihn aber beim Fahrtregler
mit 2313 nicht, ich polle alle 10µs die 4 Kanalimpulseingänge. Mit 4MHz
wird das etwas eng, 8MHz sollten es schon sein. Da die
Impulsbreitenmessung per Polling etwas "holperig" ist, sorgt eine
Hysterese dafür, dass Wertänderungen "geglättet" werden.

...HanneS...

von Harald (Gast)


Lesenswert?

Hannes Lux:
Hast du das in C oder Assembler geschrieben ? Wuerdest du evtl. den
Quellcode dazu veroeffentlichen oder mir schicken?

Warum die Aufloseung bei Gottfried Bremer so niedrig ist koennte daran
liegen dass er evtl. in C programmiert. Ausserdem gibt er ja afaik
wieder Servo Signale aus, was auch zusaetzlich Rechenleistung frisst.

Viele Gruesse!

von Hannes Lux (Gast)


Lesenswert?

Hallo...

In Assembler, mit AVR-Studio 4.
Für C bin ich wohl zu doof...

...HanneS...

von Rahul D. (rahul)


Lesenswert?

So, inzwischen habe ich mal meine robbe/futaba f-14 mit dem
Multiswitch-Modul (F1511) vermessen.
Als Sync-Impuls habe ich 0,97ms herausbekommen, als "Ein" 1,11ms und
als "Aus" 1,67ms.
Somit unterscheiden sich meine Angaben von denen Leos.
Falls Interesse besteht, poste ich gerne meinen Quellcode.

Rahul

von Rahul D. (rahul)


Lesenswert?

Es handelt sich bei den Werten übrigens nur um das High-Byte des
ICP-Registers.
Momentan hängt auch nur das STK500 an einem Empfangskanal.
Nächster Schritt wäre dann wohl vor dem Empfangsschieberegister die
Impulse zu messen...

von Frank Simon (Gast)


Lesenswert?

Hallo, vielleicht interessiert dich dieser Link:
http://www.mikrocontroller.net/forum/read-4-207770.html#new
Ich hab da mit 6 Servos eine Auflösung von 255 Werten bei 50 Hz. Die
Besonderheit bei diesem Projekt war, dass die Servos sanft beschleunigt
werden.
mfg
Frank

von OldBug (Gast)


Lesenswert?

Ich wüsste mal gerne, ob schon irgendjemand eine Failsafe mit
"Power-Fail-Sicherung" gebaut hat. Dann bräcuhte ich das Rad nicht
nochmal neu erfinden.
Ich stelle mir das so vor, daß, falls mal so'n Akku ausfällt,
irgendein Energiespeicher (Elko/Goldcap/Knopfzelle...) zum Beispiel
beim Verbrenner den Gashebel zurückholt ;-) Am Wochenende hatten wir
nämlich irgendwo nen Wackelkontakt (ich vermute, daß der Einschalter
defekt ist) und der 1:8er Monstertruck raste auf den beiden hinteren
Rädern in Richtung Grube O_O ...zum Glück hat ein Ast eines zufällig da
stehenden Baumes das Auto gebremst! Ein paar meter weiter rechts
befindet sich ein alter Steinbruch, und da geht's mächtig
Hang-abwärts...

von Rahul D. (rahul)


Lesenswert?

nee, noch nicht. Sollte aber nicht wirklich kompliziert sein.
Neben der Auswertung des Sendersignals steuere ich noch zwei Servos an,
die sich konstant von links nach rechts bewegen (allerdings ohne
Rampe).
Jetzt muß ich erst mal den Senderakku wieder laden...

von OldBug (Gast)


Lesenswert?

Du warst doch grad im Chat, richtig?
Hab Dich dann nämlich gerade verpasst ;-)

Ich habe allerdings nicht vor, am Empfänger rumzubasteln...
Wenn, dann würde ich nur die Ausgänge dessen verwenden wollen.

von Rahul D. (rahul)


Lesenswert?

Dazu müsste man ja die Empfänger-Signale oder zumindest eins (das
Gas-Signal) durch den Controller leiten.
Also quasi samplen und dann wieder ausgeben. Dann hat man zwar eine
gewisse Latenz, aber die sollte vernachlässigbar sein.
Das ganze kann man sogar mit einem einzigen Timer machen.
ICP, TimerOverflow und Output-Compare.
Mit ICP misst man den eingehenden Impuls, mit Timeroverflow (Ausgang
einschalten) und output-compare (Ausgang wieder ausschalten) realistert
man dann den Impuls und den Failsafe.
Ich würde einfach bei jedem Timer-Überlauf eine Variable hochzählen,
und die in der ICP-ISR zurücksetzen.
In der Hauptschleife würde man die dann auswerten, und feststellen,
dass für eine gewisse Zeit keine sinnvollen Impulse mehr vorhanden
waren und dann entsprechend den output-compare-wert auf failsafe
setzen.

Mich würden noch die Impulsdiagramme anderer Module und anderer
Hersteller interessieren.
Ich werde (sobald mein Sender wieder genug Power hat) mein
Multiprop-Modul ausmessen. Da es verschiedene Anbieter solcher Module
gibt, wären die Impulsdiagramme anderer Hersteller als Robbe und
vielleicht auch anderer robbe-Module interessant.
Zum Ausmessen und -proboieren stelle ich meine Software gerne zur
Verfügung.

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

Ich habe mal für einen Bekannten so ein "Not-Aus" für Verbrenner
programmiert. Es kam aber noch nicht viel Feedback, ist also sicherlich
noch verbesserungsfähig.
Hier findet man (noch) die Beschreibung (Seite zieht demnächst um):
http://www.brummbaerhannes.de/hannes/avr/uiwa/uiwa.html
Im Anhang befindet sich der ASM-Quelltext für den Tiny15.
Es war geplant, dass das Gerät 4,8V-Akkus und 6V-Akkus überwachen kann.
Die im Quelltext enthaltene Tabelle enthält aber zwei mal die Daten für
4,8V (einmal mit Fragmenten für 6V), da sich die Spannungswerte
überlappen und noch nicht geklärt wurde, ob das mit den beiden
Akkutypen geht. Zum Erstellen der Tabellen gibt es auch ein einfaches
VB-Programm.

...

von hans dieter (Gast)


Lesenswert?

habt ihr mal gemessen wie viel strom so ein servo zieht, wenn es allein
im leerlauf (ohne last läuft)? das musst du dann schon einen großen
elko drauf packen, damit du die nötige ladung speichern kannst, um den
servo aus dem elko bewegen kannst.

zum überwachen des empfängs-ausfalls kannst du einfach den watch-dog
nehmen auf eine zeit bei 60 ms oder so einstellen - und dann den reset
vektor auf ein programm stück setzen, der die servos in die
not-stellung bringt. nun sampelst du die servo-signale und immer wenn
ein impuls kommt resettest du den watchdog mit WDR, dadurch verhinderst
du die not-stellung bei jedem neuen impuls auf einen kanal.

was die takt-frequenz betrifft: mal fix überschlagen: interrupt service
routine auslösung dauert minimal 7 takte (kompl. akt. befehl:1 + PUSH
pc: 4 + RJMP vector: 2/3) da sind noch keine register gerettet und am
ende musst du ja auch noch aus der isr raus (nochmal 4 takte) und dann
willst du ja noch die signale auswerten also mit 4MHz wird es echt
eng.

eine variante wäre es den start punkt per interrupt zu finden und dann
polling zu nutzen.

von Rolf Magnus (Gast)


Lesenswert?

Ich hab letztens einen Servomischer für den Tiny13 programmiert. Er
addiert zwei Servosignale zusammen und skaliert jeden noch mit einem
per Poti einstellbaren Wert (ADC).
Anfangs hatte ich das komplett mit Timern und Interrupts probiert, aber
hab's nicht jitterfrei bekommen. Jetzt habe ich's mal komplett ohne
Interrupts gemacht. So funktioniert's prima, und bei 9,6MHz habe ich
eine Auflösung von 1920 Stufen.
Die Impulse werden einfach per Polling gemessen. Jeder
Schleifendurchlauf braucht für einen 16bit-Zähler 5 Taktzyklen, so
kommt man auf einen Wert von 1920 für 1ms und 3840 für 2ms. Der
Ausgangsimpuls wird dann auch wieder mit einer Zählschleife mit 5
Taktzyklen pro Durchlauf erzeugt.
Das ergibt zwar eine Einschränkung dadurch, daß man die Eingänge in der
richtigen Reihenfolge an den Empfänger anschließen muß, aber das ist für
dieses Einzelprojekt egal. Hier könnte man vielleicht noch die
angesprochene Variante, den Startpunkt per Interrupt zu finden und dann
zu pollen, um von der Reihenfolge unabhängig zu sein, aber wie würde ich
dann rausfinden, wann ich mal genug Zeit für den Ausgangsimpuls habe?

von OldBug (Gast)


Lesenswert?

>habt ihr mal gemessen wie viel strom so ein servo zieht, wenn es
>allein
>im leerlauf (ohne last läuft)? das musst du dann schon einen großen
>elko drauf packen, damit du die nötige ladung speichern kannst, um
den
>servo aus dem elko bewegen kannst.

Deshalb habe ich mich ja nicht festgelegt, welcher Energiespeicher
letztendlich verwendet werden soll. Das ganze muss auch nur so groß
ausgelegt werden, daß man damit einen Servo so weit zurückdrehen kann,
daß der Gashebel auf "Standgas" zurückgeht. Danach kann die gesamte
Schaltung von mir aus ausfallen. Nur die Kraftstoffzufuhr über ein
Ventil abstellen reicht nicht aus, denn der Motor läuft auch bei einem
kurzen Stück Kraftstoffschlauch noch ne ganze Weile weiter ;)
Ich muss das wohl tatsächlich mal messen, um hier weitere Aussagen
machen zu können...

von hans dieter (Gast)


Lesenswert?

oder in die datenblätter der hersteller schauen, dann bekommt man einen
eindruck, und wenn man dann bei halber last schon mal 300-500 mA misst,
bekommt man dann auch noch einen schock

von Tobias S. (tobias)


Lesenswert?

@Rahul und leo:
Ihr habt beide recht :)

Nur werden MultiSwitch und MultiProp unterschedlich gesynct.

Der MultiSwitch hat irgendwas um 0,9mS und der MultiProp um 1,8-2mS
Syncsignal.

Ich baue gerade fuer jemanden einen MultiProp Ersatz, um die
Aktionsradien der Servos zu erhoehen. Wenns fertig ist poste ich das
Projekt in die Codesammlung

Gruss Tobias

von Rahul D. (rahul)


Lesenswert?

So, bei Graupner wurde ich dann doch endlich fündig:
Servos können bis zu 1A (Graupner C4821) und mehr ziehen (das sind dann
aber schon richtige Brocken). Standard-Servos (C577Eco) brauchen auch
maximal knapp 1A.
Wenn ich davon ausgehe, dass das Servo 1A zieht, 1 Sekunde von einer
Endlage zur anderen braucht, dann benötigt man eine Ladung von 1As, was
mit Goldcaps möglich sein müsste.
Ich bin der Meinung, dass die Berechnung absoluter Worst-Case ist, als
Servos weniger ziehen und dabei schneller sind.
Jetzt kommt es nur darauf an. Wie schnell der Goldcap nicht mehr genug
Spannung liefern mag.

@hans-Dieter:
Kann es sein, dass du Millisekunden mit Mikrosekunden verwechselst?
1Millisekunde sind 1000 Mikrosekunden.
Da ist die Einsprungdauer einer ISR ziemlich irrelevant.


Gruß Rahul

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Legen wir das einfach mal grob Großzügig aus: Goldcap 1F/5,5V :-D

Scherz beiseite, aber selbst so ein Teil ist nicht größer als ca.
22x10mm. Sollte es tatsächlich auf diese Größe rauslaufen und immer
noch nicht "reichen", lohnt evtl. noch der Einsatz eines Step-Up
Reglers...

von Rolf Magnus (Gast)


Lesenswert?

Ich dachte, Goldcaps schaffen keinen Strom von einem Ampere.
Die haben doch einen Innenwiderstand von ca. 50 Ohm, so daß die
Ausgangsspannung sofort zusammenbrechen müßte, wenn der Motor im Servo
anläuft.

von Rahul D. (rahul)


Lesenswert?

Super!
Ich habe jetzt meine FC-16 mit meinem Programm getestet, und
festgestellt, dass da alles invertiert ist.
Jetzt muß ich das Programm also so umschreiben, dass es beide
Signalsorten erkennt.

Mal sehen, ob ich morgen den ganzen Spaß universell zum Laufen
bekomme.

Einen Goldcap muß ich auch hier irgendwo noch haben...

von HMan (Gast)


Lesenswert?

Hallo,

seit einiger Zeit suche ich im Netz schon nach einer Möglichkeit wie ich 
meine Multi Module in meinem RC-Sender mit eigenen Schaltungen auswerten 
kann und mir somit eigene Decoder bauen zu können.
Bei dieser Suche bin ich hier auf diesen Beitrag gestoßen und hoffe hier 
ggf. noch offene Fragen klären zu können.
Da hier offensichtlich schon der ein oder andere solche Decoder 
programmiert habe denke ich das ich hier richtig bin.

Ein "normales" Empfängersignal aber ich schon erfolgreich ausgewertet 
und im Controller (ATMega) verarbeitet.

Eingesetzt habe ich folgende Module von Futaba Multi-Switch-Prop 12+2 
(Best.Nr.:8101) und Multi-Switch-Prop Modul Lichtset (Best.Nr.:8413) in 
einer FC-18. Dafür würde ich mir gern eigene Spezielle Module 
entwickeln.

Was ich hier schon herauslesen konnte ist, dass bei Schalter AUS der 
Impuls 1,5ms, bei Schalter EIN 1ms und zur Synchronisation 2ms.

Nun ist mir leider noch nicht ganz klar, wie das genau abläuft. Wird der 
Synchronisationsimpuls immer nach dem Durchlauf aller Schaltersignale 
gesendet oder nach jedem einzelnen Schaltersignal?
Wie ordne ich die Signale dem entsprechendem Schalter zu?

Kann mir da jemand eine genauere Erklärung geben? Bin allerdings nur 
Hobbyprogrammierer mit relativ geringer Erfahrung.
Ich habe auch schon versucht mit dem Oszilloskop das Signal zu 
entschlüsseln, leider konnte ich da nichts genaueres herausbekommen. 
Vielleicht kann mir dazu auch noch jemand einen Tipp geben.

Ich danke schon einmal im Voraus für die Hilfe.

mfG HMan

von STK500-Besitzer (Gast)


Lesenswert?

>Wird der Synchronisationsimpuls immer nach dem Durchlauf aller >Schaltersignale 
gesendet oder nach jedem einzelnen Schaltersignal?
Es wird vor jedem Durchlauf gesendet.

>Wie ordne ich die Signale dem entsprechendem Schalter zu?
Durch ausprobieren. Wobei sich Robbe/Futaba an die Nummerierung hält.
Ich hatte mir dazu ein Programm  geschrieben, das die Timer-Werte per 
serieller Schnittstelle an einen PC zeilenweise übertragen hat.
So konnte ich eine Textdatei erzeugen, die ich per Tabellenkalkulation 
in Millisekunden umgerechnet habe.
So konnte ich gut das Schema erkennen.

Übrigens kann es sein, dass der Puls für die Schalterstellung 
"invertiert" übertragen wird. Das Problem hatte ich beim Vergleich einer 
F14 mit einer FC16.
Die "Invertierung" sieht so aus, dass das "ON"-Signal durch einen Impuls 
<1,5ms oder durch einen Impuls >1,5ms übertragen wird.
Man braucht also zwei Abfragen.

Eine Platine mit USB-Anschluss hatte ich auch mal angedacht...

von HMan (Gast)


Lesenswert?

Hallo,

danke für die schnelle Antwort.
Das hilft mir auf jeden Fall weiter. Ich werde dann mal etwas 
experimentieren, sobald meine Zeit es zulässt.

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.