Forum: Mikrocontroller und Digitale Elektronik PPM für 4017 erzeugen


von Phillip H. (philharmony)


Lesenswert?

Hallo zusammen
Ich möchte an einen Atmel controller mit 8- oder 16bit Timer/Counter das 
Signal erzeugen, um über einen HC4017 10 Servos anzuhängen.
Für diesen brauche ich, wenn ich das richtig verstanden habe, je eine 
steigende Flanke, um am Clock-Eingang, um den vorherhigen Kanal auf Low 
und den nächsten auf High zu schalten. Als letztes würde dann für die 
verbleibende Restzeit der Reset pin gezogen, um alle ausgänge 
abzusschalten und dann wieder bei 0 anzufangen.
1. Frage: Braucht es die Restzeit? Diese wäre ja maxmial 10ms lang, was 
mit dem Timer wieder schwirig wird, wenn ich ihn auf 1-2ms optimiere.
2. Frage: Nach lolassen des Reset-Pins, geht da gleich der erste Kanal 
auf High oder braucht es erst eine Clock-Flanke?
3. Frage: Genügt es, in der Timer-Routine einfach den Pin high zu 
setzen, die neue Zeit ins Compare-Register zu geben und am ende den Pin 
wieder auf low, oder braucht es zwei Timer-Durchläufe, einen für den 
Puls, einen für die Zeit bis zum nächsten?
Ich kriege das im Kopf noch nicht so ganz zusammen, wie das am besten zu 
lösen ist.
LG

von Manfred H. (manfredbochum)


Lesenswert?

Lass 2 timer laufen.
Aeussere Schleife mit 24mS, darin den Timer mit 1-2mS.

zu2. Erst nach clocksignal
zu3. Keine Ahnung

von Oldie (Gast)


Lesenswert?

Verstehe nicht ganz, was dabei rauskommen soll.
Und was das mit PPM zu tun hat.

Sollen die 10 Servos immer hintereinander eigeschaltet werden?

Der 4017 hat 10 Ausgänge: 0...9. Solange Reset anliegt, wird der
Servo am Ausgang 0 eigeschaltet. Wwenn Reset und Clock-Enable
gleich Null sind, wird mit jeder positiven Flanke am Clock-Eingang
auf die Servos am Ausgang 1, 2, ..., 9, 0, ... geschaltet.

Erscheint mir recht sinnlos.

von Phillip H. (philharmony)


Lesenswert?

> Erscheint mir recht sinnlos.
Nicht ganz so linnlos wie man meinen könnte.
http://diydrones.com/profiles/blogs/drive-10-servos-using-only-2

von Oldie (Gast)


Lesenswert?

Mag ja einen Sinn ergeben, doch der erschließt sich mir nicht
durch das Filmchen.

Erklär mal das Wirkungsprinzip: Also was an den 4017-Ausgängen
für welches Verhalten des Servos anliegen muss.

Dann lässt sich bestimmt erklären, wie man das mit den
mega8-Countern verwirklicht.

Jedenfalls dürfte ein festes Signal (High, vielleicht auch Low)
keine Wirkung haben, sonst könnte man nicht den 0-Ausgang des
4017 nutzen, der bei Reset immer High ist.

von Mani (Gast)


Lesenswert?

Hallo,

möchtest du an deinen Controller 10 Potis anschließen um jedes Servo 
einzeln steuern zu können?
Würde mich auch interessieren.

Gruß Mani

von Oldie (Gast)


Lesenswert?

Von 10 Potis ist in dem Video nix zu sehen. Da sind es nur
vorher festgelegte Sequenzen, die einfach ablaufen.

Die Ersparnis an Output-Pins beim mega8 wird wohl mit einer
richtigaufwändigen Software-Ansteuerung des HC4017 erzeugt.

Aber solange der TO nicht erklären kann, was da eigentlich
ablaufen soll, ist ihm wohl nicht zu helfen.

Es sei denn, hier kennt sich zufällig jemand mit diesen
"diydrones" und den dort verwendeten Servos aus.

Die nächste Frage des TO wird dann aber sein, wie er denn
die Servos gezielt beeinflussen kann...

von Modellbauer (Gast)


Lesenswert?

Oldie schrieb:
> Aber solange der TO nicht erklären kann, was da eigentlich
> ablaufen soll, ist ihm wohl nicht zu helfen.

Was ist denn dabei unklar. Nach jedem Clock-Puls springt der Zähler 
einen Stand weiter, d.h. wenn man z.B. Clock-Pulse mit 1.5ms Abstand 
(entsprechend einer Frequenz von 667Hz) auf den Zähler gibt, bekommt 
jeder der an den Zählerausgängen angeschlossenen Servos einen High-Puls 
für die Dauer von 1.5ms, also Mittelstellung. Der Abstand der 
Clock-Pulse legt jeweils die Dauer der einzelnen Servopulse fest. Der µC 
muss nur die gewünschten Servostellungen in Clock-Puls Abstände 
übersetzen.

von Phillip H. (philharmony)


Lesenswert?

Hey Leute, von 7 Beiträgen nur ein einziger der irgendwie auf die Fragen 
antwortet. Wäre es nicht möglich, daß die jenigen, die jetzt mit genau 
dieser Idee, diesem Projekt, diesen Bauteilen nichts anfangen können, 
einfach mal NICHTS schreiben? Ich habe mir die Variante mit Tiny und 
4017 nicht selbst ausgedacht, sondern bei verschiedenen Projekten 
gesehen (u.a. Paparazzi, die damit komplexe Flugregler betreiben und 
völlig Problemlos auch Brushless-Controller für Quadcopter ansteuern). 
JA, es gibt sicher andere Varianten, die fallen bei unserem Projekt 
(dabei sind die Servos nur ein kleiner Teil) aber aus verschiedneen 
Gründen weg. Diese Gründe sind hier auch nicht wichtig, es geht mir 
einfach um die drei Fragen in meinem Eröffnungspost.
Vielleicht hat jemand von Euch das auch schonmal so gemacht, und könnte 
ein Codebeispiel oder eine kurze Beschreibung geben? Bin mir einfach bei 
den drei o.g. Fragen unsicher.
Vielen Dank und liebe Grüße

von Mani (Gast)


Lesenswert?

Guck dochmal Post2
hab ich doch schon beantwortet.

zu1.
Wenn du HF mässig übertragen willst, brauchst du die Lücke. Der 
Empfänger nimmt den ersten Puls nach der Lücke um wieder bei Kanal eins 
zu starten.

Stell doch mal bitte konkret eine Frage. Dann können wir die behandeln. 
Vielleicht klappts dann.

Gruß Mani

von Phillip H. (philharmony)


Lesenswert?

Hi Mani, ja Post 2 habe ich gesehen, vielen Dank. Jetzt habe ich einige 
Beispiele gesehen, die es doch nur in einem Timer machen. Daher bin ich 
etwas unsicher.
Das Teilprojekt sieht so aus:

Der Tiny ist per z.B. I2C an das Restprojekt angeschlossen und bekommt 
die Stellwerte für die einzelnen "Servo-PWMs" einzeln in Digitaler Form 
0-255.
Diese liegen irgendwo in einem Array und der Tiny soll daraus nun ein 
Signal bauen, das via 4017 auf die 8-10 Servos übertragen wird. Keine 
Funkstrecke, kein zu Dekodierendes Signal, mich interessiert nur die 
Erzeugung des "Summensignals", der Rest ist einigermaßen klar.

Da man den 4017 ja meines Wissens nach nicht komplett "stummschalten" 
kann, sondern immer einer der Ausgänge H Pegel hat, gehe ich davon aus, 
daß das Verlinkte Arduino-Projekt nicht einmal die Restzeit einhält um 
immer auf genau 20ms Gesamtlänge zu kommen. Dadurch würde der Frame aber 
ja unterschiedlich lang, also nur ca 10ms wenn alle Servos am linken 
Anschlag stehen sollen bis 20ms wenn alle rechts stehen. Und da bin ich 
mir eben unsicher, ob das eine gleichmäßige Ansteuerung erlaubt, oder ob 
manche RC-Bauteile wie Fahrtenregler, Brushlesscontroller o.ä. das 
mitmachen.
Oder ob ich etwas übersehen habe, und es doch eine Möglichkeit gibt, am 
4017 alle 10 Ausgänge auf Low zu setzen.

Gelesen habe ich auch schon, den O0 nicht zu benutzen und hier die 
Restzeit abzuwarten, dann fehlte aber ja ein Anschluss.

von STK500-Besitzer (Gast)


Lesenswert?

Phillip Hommel schrieb:
> Oder ob ich etwas übersehen habe, und es doch eine Möglichkeit gibt, am
> 4017 alle 10 Ausgänge auf Low zu setzen.

richtig, Q0 liefert bei einem Reset H-Pegel.
Der 4017 wurde in älteren RC-Empfängern auch als Decoder und 
Signal-Multiplexer verwendet.
Da wurden dann der erste (Q0) und letzte (Q9) nicht als Ausgang, sondern 
zum Synchronisieren mit dem Sendesignal verwendet.

Vielleicht wäre es für dich einfacher, auf ein Schieberegister oder 
einen 16-fach-Multiplecer zu wechseln, wenn du wirklich 10 Ausgänge an 
einem Tiny brauchst. Oder du verwendest den Dezimalzähler 4017 mit der 
Einschränkung, nur 9 Bits verwendent zu können und für das letzte nimmst 
du einen Portpin des Controllers.

Aber eigentlich braucht man für moderne Modellbau-Elektronik (Servos und 
Fahrtregler) die 20ms Wiederholungsrate nicht mehr.
zumindest habe ich Servos an einem Controller mit 3,686MHz mit einem 
16Bit-Timer laufen - das ist eine Wiederholungsrate von knapp 18ms.

von Phillip H. (philharmony)


Lesenswert?

>...wenn du wirklich 10 Ausgänge an
>einem Tiny brauchst. Oder du verwendest den Dezimalzähler 4017 mit der
>Einschränkung, nur 9 Bits verwendent zu können und für das letzte nimmst
>du einen Portpin des Controllers.

Ne es müssen nicht zwingend 10 Stück sein, geht eher darum "je mehr 
desto besser". Ziel ist es, verschiedene Standard-Module aufzubauen die 
per i2c an ein Master-Board angehängt werden. Einige dieser Module sind 
bereits fertig, haben alle einen Tiny drauf und benutzen das selbe 
Framework für i2c, Befehlsatz etc. Soll eben alles so weit wie möglich 
standardisiert sein. Das System kommt dann innerhalb eines recht 
komplexen Projekts bei unterschiedlichen Anwendungen zum Einsatz und 
wird dann nach den jeweiligen Bedürftnissen konfiguriert. Ich entwickle 
nur den "Baukasten".

: Bearbeitet durch User
von Harald W. (wilhelms)


Lesenswert?

STK500-Besitzer schrieb:

> Der 4017 wurde in älteren RC-Empfängern auch als Decoder und
> Signal-Multiplexer verwendet.

Ja, m.W. war das in den späten 70er Jahren die typische Standard-
schaltung, die von fast allen Empfängerherstellern verwendet wurde:
Einfach, aber wirkungsvoll.
Gruss
Harald

von Oldie (Gast)


Lesenswert?

Hab ich mir gedacht -
mit deinen Minimalinformationen kann dir hier bisher keiner helfen.

ERLÄRE doch einfach, was die Servos brauchen!
Bei der Pulserzeugung hätten hier 100 Leute Ideen!

Irgendwo lässt du verlauten, dass ein 1,5 ms-Pulse Mittelstellung
bedeutet.
Ist das ein Puls, der auch x mal kommen kann, ohne dass die
Neutralstellung verlassen wird?

Dann kommt 10 / 20 ms für alle links/rechts
Also 1 ms = links, 1,5 ms Neutralstellung, 2 ms = rechts?

Was passiert bei längeren / kürzeren Zeiten?
(Reset-Zustand bei Servo Null?)

von Klaus R. (klaus2)


Lesenswert?

...und ein 4017 kann nicht latchen, was ich hier als Problem sehe - 
oder?

Sowas macht man mit schieberegistern inkl. latch, vermute ich.

Btw: Der TO will 10 servos an 1-2 pins eines uC betreiben, sprich alle 
informationen seriell übertragen & dann mit einem 4017 auf die 10 
modellbau servos demultiplexen.

Klaus.

von Peter D. (peda)


Lesenswert?

Phillip Hommel schrieb:
> Ne es müssen nicht zwingend 10 Stück sein, geht eher darum "je mehr
> desto besser".

Du kannst auch 2 74HC164 kaskadieren, dann hast Du 16 Ausgänge.

Wenn man den Zähler bzw. Schieberegister mit einem PWM-Ausgang taktet, 
sind die Pulse völlig jitterfrei, d.h. unabhängig von Programmlaufzeiten 
und anderen Interrupts.
Die Sache ist daher durchaus sinnvoll.

von Mike (Gast)


Lesenswert?

Klaus R. schrieb:
> ...und ein 4017 kann nicht latchen, was ich hier als Problem sehe -
> oder?

Was willst du da latchen. Der Zähler muss einfach nur im richtigen Takt 
seine Clock-Impulse bekommen. Wenn er einmal durch ist, geht es mit dem 
Clock-Puls Abstand für die Pulslängenzeit von Servo 0 weiter.

Wenn man einen zweiten Timer einsetzt, darf man den Kanal 0 nicht 
belegen, d.h. man verschenkt einen Kanal.

Oldie schrieb:
> Irgendwo lässt du verlauten, dass ein 1,5 ms-Pulse Mittelstellung
> bedeutet.
> Ist das ein Puls, der auch x mal kommen kann, ohne dass die
> Neutralstellung verlassen wird?
Du solltest dir einfach mal ein paar Grundlagen über die Steuerung von 
Modellbauservos anlesen. Dann verstehst du auch, worum es hier geht.
http://de.wikipedia.org/wiki/Servo#Ansteuerung

Oldie schrieb:
> Was passiert bei längeren / kürzeren Zeiten?
> (Reset-Zustand bei Servo Null?)

Dann versucht der betroffene Servo, die Stellung anzufahren, die der 
Zeit entspricht und fährt gegen den Poller, falls die Zeit zu lang oder 
zu kurz ist (Bereich gewöhnlich 1..2ms, manchmal auch breiter). Den 
Resetzustand gibt es in dem Sinne nicht, nur um beim Starten die 
Synchronisation sicher zu stellen. Der Zähler muss immer laufen, wenn 
man alle Ausgänge für Servos benutzt werden.

von Phillip Hommel (Gast)


Lesenswert?

Also nochmal kurz zusammengefasst:
Die Restzeit brauche ich nicht beachten, einfach Zeit servo 1 laufen 
lassen, impuls, Zeit servo 2,Impuls , am Ende Reset, fertig.
Es reicht eine steigende Flanke für den Wechsel, irgendwann danach Pin 
wieder auf low.
Richtig soweit?
Vielen Dank für die Antworten.
Lg

von Mike (Gast)


Lesenswert?

Phillip Hommel schrieb:
> Die Restzeit brauche ich nicht beachten, einfach Zeit servo 1 laufen
> lassen, impuls, Zeit servo 2,Impuls , am Ende Reset, fertig.

Wenn du alle 10 Ausgänge nutzen möchtest, gibt es kein "fertig", sondern 
nach Impuls zum Schalte auf 9 kommt Wartezeit für Steuerpulsbreite Servo 
9, dann Reset (oder Impuls zum Schalten auf 0), dann Wartezeit für 
Steuerpulsbreite Servo 0, dann Impuls, Wartezeit Servo 1, Impuls Servo 
2, ...

Dabei ist Reset besser als Impuls zum Schalten auf 0, weil dann sicher 
gestellt ist, dass der Zähler immer synchron zu den Zeitvorgaben zählt, 
d.h. die Servozuordnung stimmt. Die Zykluszeit liegt, je nach 
Servostellungen irgendwo um 15ms, womit IMHO jeder Servo gut leben kann.

von Phillip H. (philharmony)


Lesenswert?

>Wenn du alle 10 Ausgänge nutzen möchtest, gibt es kein "fertig"
Is klar, war ein rethorisches "Fertig", kein Zyklusbeendendes :)

von Oldie (Gast)


Lesenswert?

Da dies eine Frage im µC & Elektronik Forum ist, hätte
ich nicht vorausgesetzt, dass jeder diese Servos kennt.

Nach kurzer Umschau bei den Servos, weiß ich, dass ihr
Verhalten keine große Wissenschaft ist, sondern in 2 Zeilen
erklärt werden kann. - Ist das denn sooo schwer?

Die Umsetzung für einen µC + 4017 ist damit auch klar!
(Und 80% der vorherigen Zeilen stellen sich als genauso
unwissendes Gelaber heraus.)

Man muss den 4017 ständig durchzählen lassen und für
jeden Servo die Position als Höchststand für einen µC-Counter
in einer Tabelle vorhalten.

Der Reset ist EINE (eher ungünstige) Möglichkeit, um die
Zuordnung vom Tabellenwert zum richtigen Servo im
Programmablauf sicher zu stellen.

Um den Ablauf sicherer zu machen, würde ich auf die Ansteuerung
des 4017-Reset verzichten, sondern den 4017-Carry-Ausgang auf
einen µC-Eingang schalten: Dann wird die Zuordnung nach jedem
Umlauf bestätigt und das Programm einfacher.
- Benötigt auch nur zwei Pins.

Der µC-Counter sollte in einem PWM-Mode arbeiten, bei dem
der Zähler-Höchststand für jede Servo-Pulsdauer einstellbar ist,
während die Pulsweite fest auf < 1 ms (z.B. 0,5 ms) für die
fallende Flanke des 4017-CLK-Signals eingestellt ist.

Ja, die Zykluszeit ist nicht fest, sondern setzt sich aus der
Summe aller Pulsweiten (= 10..20 ms) zusammen.
Das geht mit einem 4017 nicht anders. Allerdings wird die
Zykluszeit beim 4022 noch kürzer (8..16 ms), Zwei 4022 machen
16...32 µs.

Eigentlich voll easy, wenn man weiß, wie ein µC funktioniert
und was ablaufen soll!

von Anja (Gast)


Lesenswert?

Vor deinem monolog wussten wir auch schon wie servos funcktioniren

von Geometer (Gast)


Lesenswert?

Was ist das für eine Anja?

Sonst kennt man Anja hier für recht intelligente und hilfreiche
Beiträge.

Und "funcktioniren" kann sie auch besser schreiben!

von Phillip H. (philharmony)


Lesenswert?

Noch eine Frage: Ich hätte gerne die Möglichkeit, die Servosignale 
abzuschalten. Würde es genügen, VCC des 4017 über einen IO-Pin des 
ATTiny25 zu schalten, sollte Transistor dazwischen, oder geht das so gar 
nicht?
LG

von Bernie (Gast)


Lesenswert?

Über einen Transi.
UND: Den Clock-Ausgang dabei fest auf NULL, oder Eingang.

von Peter D. (peda)


Lesenswert?

Phillip Hommel schrieb:
> Noch eine Frage: Ich hätte gerne die Möglichkeit, die Servosignale
> abzuschalten.

Einfach über den Resetpin. Der Ausgang 0 ist ja eh nicht nutzbar.

von Bernie (Gast)


Lesenswert?

Peter Dannegger (peda) schrieb:
> Der Ausgang 0 ist ja eh nicht nutzbar.

Wenn ich hier richtig mitgelesen haben, sind wir da schon
drüber hinaus. - Obwohl es die einfachste Lösung wäre.

siehe: Modellbauer (Gast), 22.07.2014 22:31
und:  Oldie (Gast), 23.07.2014 21:37

von Modellbauer (Gast)


Lesenswert?

Phillip Hommel schrieb:
> Noch eine Frage: Ich hätte gerne die Möglichkeit, die Servosignale
> abzuschalten.

Wozu?
Schalte die Servos ab, wer weiß, was die sonst ohne Sollwertvorgabe 
machen.

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.