Hallo, ich benötige dringend ein Steuersignal (PWM), um einen Modellbau-Fahrtregler anzusteuern. Wer hat Erfahrung damit, oder so etwas schon programmiert? Gegenstand der Steuerung: ------------------------- zwei Getriebemotoren sind jeweils an einen Mini-Fahrtregler von Conrad angeschlossen (bestückt mit einem Servotreiber-IC 51660L). Die Fahrtregler werden mit ca. 5V Steuerspannung und 9V Arbeitsspannung versorgt. Zur Signalerzeugung verwende ich einen ATmega163 mit 3.69Mhz auf einer STK500 Entwicklungsplatine. Im Grunde benötige ich eine primitive 2-Kanal-Steuerung (Software), wobei ich die einzelnen Kanäle mit unterschiedlichen Werten zur Erzeugung der passenden PWM-Freuqenz belegen kann. --- Seit Tagen versuche ich Hilfe eines Oszilloskops, und einer Fernsteueranlage das Signal des Empfängers "anzunähern", d.h. mit dem Mikrocontroller nachzubauen. Die Fahrtregler reagieren auf das Signal, aber nicht kontrolliert. Der "Nullpunkt" lässt sich bereits an den Fahrtreglern (beim entsprechenden Neutralsignal) nicht einstellen. Im Anhang ist nur ein einfaches Testprogramm, mit dem sämtliche Kombinationen von Pegel-Längen durchprobiert habe, um die passende Frequenz zu bekommen. Leider bislang ohne Erfolg. Kann mir jemand bei diesem Thema weiterhelfen? Danke und Gruß Stefan
> ich benötige dringend ein Steuersignal (PWM), um einen > Modellbau-Fahrtregler anzusteuern. > > Wer hat Erfahrung damit, oder so etwas schon programmiert? Sowas mache ich gerade mit einem ATtiny13, um einen kleinen Servotester zu bauen, der einfach die Stellung zweier Potis über den AD-Wandler ermittelt und entsprechende Signale für die Servos rausgibt. Ob man mit dem Ausgangssignal einen Motorsteller oder einen Servo ansteuert, ist aber im Prinzip egal. > Kann mir jemand bei diesem Thema weiterhelfen? Mir ist aus deinem Posting nicht ganz klar, ob du überhaupt weißt, wie das Signal genau aussehen muß. Die mittlere Impulslänge liegt bei 1,5ms. Minimum und Maximum sind herstellerabhängig, liegen aber wohl so etwa bei 1ms und 2ms oder 0,75ms und 2,25ms. Die Periodendauer ist auch wieder nicht immer gleich. Die liegt meistens so grob im Bereich 20ms bis 25ms (abhängig auch von der Kanalzahl des Senders). Es gibt Motorsteller, die beim Einschalten erstmal kalibrieren wollen (Nullstellung und Vollgas), andere brauchen das nicht. Ich kenne mich aber nicht mit Stellern mit Rückwärtsgang aus, da meine Flieger sowas nicht brauchen :-) Für das Timing benutze ich aber keine Warteschleifen, sondern einen Timer. Das dürfte mit dem ATmega163 aufgrund des vorhandenen 16bit-Timers noch einfacher sein als mit dem ATtiny13. Mein Controller schläft die meiste Zeit im Idle-Modus ;-)
Hallo Rolf, erstmal danke für eure Antworten, und auch an Hannes für den Link. Ich weis schon, wie das Signal aussehen muss - lt. Fahrtregler-Beschreibung wird ein Signal zwischen 1,0ms und 2,0ms gefolgt von einem 20ms low-Pegel benötigt. Bei 1,5ms wird der Ruhepunkt eingestellt. Hab schon alles mögliche ausprobiert, aber ich treff entweder die passende Frequenz nicht, oder ich schließe den Fahrtregler falsch an den Controller an. Vom erzeugenden Pin geht das Signal direkt auf den Fahrtregler. Die Pull-Up Widerstände sollten lt. Quellcode am Port geschalten sein. Lediglich ein Kabel, aber mehr hab ich da nicht dazwischen. Mit dem Timer1 (16Bit) hab ich auch schon den automatischen PWM-Modus probiert, mit der Einstellung 9Bit-PWM. Aber das Ding läuft anders als erwartet. Weder das Datenblatt noch ein Buch hilft mir hier weiter. Gruß Stefan
@Stefan Sorry für die blöde Frage nach dem scope . Im ersten post steht es ja . Mit der PWM würde ich es nicht probieren . Besser einen timer als Zeitbasis nehmen , und sooft zählen bis die Zeit rum ist . Leider kenn ich mich nicht mit AVR-ASM aus . ( nur 8051er )
Man kann dafür den Compare-Interrupt verwenden. Da stellt man Wert ein, und es wird beim Erreichen dieses Wertes ein Interrupt ausgelöst. Da kann man dann die pins passend setzen und den nächsten Wert einstellen. Während der Timer läuft, kann man den Controller in den Idle-Sleep-Modus versetzen. Aus dem wacht er dann beim nächsten Interrupt automatisch wieder auf, und es spart Strom ;-)
Hallo nochmal an alle, ich möcht mich nochmal für die zahlreiche Hilfe bedanken. Und der Link von Hannes hat mir sehr weitergeholfen. Zu diesem Thema gibt es leider nicht viel. Vorallem keine guten Bücher. Und das macht es für Anfänger echt schwer. Also denn, wollte das bloß nicht so ohne Dank an euch einfach offen stehen lassen. Gruß Stefan
Hallo erstmal an alle, ich stecke bei der Programmierung noch voll in den Kinderschuhen obwohl meine richtige Schuhgröße schon sehr groß ist. Zu Deinem Problem Stefan, Du hast einen Regler für den Motor und möchtest den Regler ansteuern. Da gibt es zwei unterschiedliche Typen von Reglern und Motoren. Ich gehe mal davon aus das es ein Bürstenmotor ist. Zwei Drähte vom Regler zum Motor. Du erzeugst einen Impuls von 1,5 ms alle 20 - 22 ms. Wenn Du jetzt den Impuls von 1,5 ms zwischen 1 ms und 2 ms veränderst, sollte der Motor vor bzw. Rückwärts laufen. PWM ist hier das falsche! Die PWM macht der Regler den Du schon hast! Hast Du einen Flugregler erworben dann ist bei 1ms aus und bei 2ms Vollgas. Hast Du beim Einschalten ca 1ms ist mit Bremse größer 1,5 ms ohne Bremse. Sind drei Drähte vom Regler zum Motor ist es ein bürstenloser Motor. Die Ansteuerung des Reglers funktioniert wie oben geschrieben --> die Ansteuerung des Motors total anders - aber das macht ja der Regler. Schau mal bei http://sprut.de/electronic/modell/index.htm Grundlagen der Modellfersteuerung Gruß Peter
@Peter: Viele Leute bezeichnen die Impulsfolge vom Fernsteuerempfänger zum Servo oder Fahrtregler als PWM. Nunja, streiten möchte ich deswegen nicht, denn die Information ist ja als Pulsbreite codiert. Allerdings verstehe ich persönlich unter PWM auch etwas Anderes. ...
Warum geht die PWM nicht? Einfach die Periode des PWM-Signals auf 20ms stellen. Über das Tastverhältnis läßt sich dann die Länge des "1" Pulses einstellen. Bin aber nicht bei AVR's zuhause, sondern bei PIC. Dort ists mit ein paar Befehlen getan. * Einstellen der PWM-Periodenlänge (Register) * Einstellen des Tastverhältnisses (bsp. 1.5ms)(ebenfalls Register) * aktivieren der PWM. Aufzupassen ist nur, ob der 51660L einen pos.-Puls erwartet (steht im Begleitheft zum Bausatz dabei), sonst muss man Tastverhältnis "invertieren" oder alternativ einen Inverter zwischenschalten. Übrigens: ELV bietet auch so einen Fahrtenregler an - billiger als der beim Conrad. Mario
Ich habe gerade etwas ähnliches programmiert, allerdings in C. Ich betreibe einen ATmega162 auch bei 3,68MHz (STK500). Ich benutze den Timer 1 freilaufend. Damit hat er eine Overflow-Rate von ~17ms, was 1A in das 20ms-Raster passt (was dem Servo recht egal ist). Beim Overflow-Interrupt setze ich den Wert der Compare-Register und schalte beide Pins ein. In der jeweiligen Compare-ISR schalte ich dann einfach den Pin wieder aus. Dass das auch mit dem Fahrtregler geht, vermute ich, kann aber nicht sicher sagen, dass es geht. Irgendwo hatte ich noch so einen... Quellcode habe ich gestern oder Montag schon hier irgendwo gepostet. Momentan vollziehen die beiden Servos oszillierende Bewegungen; sie schwenken konstant von links nach rechts und zurück... ist bei einem Fahrtregler bestimmt interessant...
Hallo Mario, wie gesagt bin ich noch in den Kinderschuhen... ...die Komponenten hinter einem Fersteuerempfänger erwarten meiner Meinung nach alle eine Positive Impulsfolge. Ich glaube früher war da mal ein Unterschied zwischen den Einzelen Herstellern. PWM sollte auch nach Deiner Idee mit AVR funktionieren. Zum Steuern der Drehzahl halt nur das Register für das Tastverhältnis ändern. Peter
Hallo Peter, macht nix, jeder fängt einmal an ;) ergänzend muss ich dazu noch einfügen, dass das mit der PWM nur mit einem Servo je PWM-Kanal geht. Bei mehreren Servos, aber beispielsweise nur einem PWM-Ausgang gehts dann nicht mehr so. Da hilft der Link von Rahul weiter, d.h. da gehts genau so wie Du's beschrieben hast. Mario
Mein oben angegebener Link stimmt nicht mehr, da die Seite umgezogen ist. Hier ist der neue Link: http://www.hanneslux.de/avr/7ksend/7ksend01.html Das dort vorgestellte ASM-Programm (4433) generiert Impulse für 7 Kanäle, von denen 6 per Poti am ADC gesteuert werden und 1 Kanal per Schalter oder 2 Taster (3 feste Impulsbreiten). Da es sich um eine Art Testgerät handelt, lässt sich damit sowohl ein Fernsteuersender ansteuern, wie auch 7 Servos bzw. Fahrtregler (direkt angeschlossen) betreiben. Mit dem heutigen Wissen würde ich das Programm effektiver schreiben, es tut aber auch so seine Arbeit gut und zuverlässig. ...
Meine Version des Servo-Testers ist einfach nur ziemlich simpel, weil ich nur das Prinzip ausprobieren wollte. In der Compare-ISR könnte man auch noch den Timer zurücksetzen (auf 0xFFF0 oder so), in einem Byte eine 1 eine Stelle weiter wandern lassen und natürlich zuerst den Port mit 0 beschreiben. In der Overflow-ISR wird dann einfach das Byte an den Port geschrieben, und der entsprechende Puls für das jeweilige Servo generiert. Es gibt natürlich auch anderen Methoden... (ISR = Interrupt Service Routine; wird bei auftreten eines Interrupts abgearbeitet)
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.