www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM für Fahrtregler


Autor: Stefan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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 ;-)

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: buz11 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne scope kriegst Du es nicht hin ...
Hast Du einen ?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ein normales Röhrenoszilloskop
mit einem Signalweg.

Gruß Stefan

Autor: buz11 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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 )

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;-)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Fleischhauer (altbastler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

...

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter Fleischhauer (altbastler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

...

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.