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)?
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
und dazwischen? Wie lang ist denn ein Takt(wie lange muss das Signal jeweils low und high sein?)
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
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
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).
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
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.
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?
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.
Ok, jetzt geht's Schwarz ist PWM und Blau Masse Warum können die sich nicht auf einen Standart wegen der Kabelfarben einigen...
wird das servo direkt mit einem 1k widerstand an ein port angeschlossen ? besten dank
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
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?
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.
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?)?
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.
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!
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...
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).
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
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
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...
Hannes Lux; Könntest du das mit der Hysterese und den Schwingungen eventuell nochmal etwas genauer erklären ? Viele Grüße
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 :)
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...
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).
ja, int0 und int1. ... und ins Datenblatt schauen dauert ungefähr genauso lang wie die Frage ins Forum stellen ;-) grüsse leo9
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.
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...
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?
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...
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!
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
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...
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
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...
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...
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.
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.
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. ...
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.
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?
>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...
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
@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
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
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...
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.
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...
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
>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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.