Rechtecksignal stauchen

Hallo alle zusammen.

Ich tüftle an einem Elektronikproblem herum.
Mit meinem Ein-Chip-Controller will ich ein übliches Servo aus dem Modellbaubereich mindestens ½ mm-weise ansteuern. Das PWM-Ausgangssignal geht zwar von 0-255 und ist mit einer Periode von 20 ms und einer Spannung von 5 V ideal, aber leider ist nur der Wertebereich von ca. 10 bis 30 (also 21 Schritte bei 180 Grad Drehung) für mich benutzbar und daher etwas zu grob.

Ich suche jetzt nach einer Möglichkeit das Rechtecksignal zu stauchen, damit ich den PWM-Ausgang besser ausnutzen kann.
Die Signallänge müsste also erst gemessen werden, und in der darauf folgenden Auszeit sollte ein um ca. 5 verringerter Puls erzeugt werden.
Aus 1 ms werden 0,2 ms, aus 2 ms 0,4 ms usw…
Das wäre mein Wunschgedanke.
Natürlich könnte man das Spiel nicht bis zum Wert 255 weiter treiben, weil das 0-Signal immer kürzer wird und irgendwann der generierte Puls nicht mehr hineinpasst.
Aber wenn ich bis 150 komme, ist das Signal ausreichend aufgelöst.
Super wäre es wenn es einen Integrierten Schaltkreis mit dieser Funktion geben würde.
Die Schaltung müsste aber auf jeden Fall mit 5 V auskommen.

Über eine Antwort würde ich mich sehr freuen.

Wenn ich dich richtig vertehe, willst du einen größeren bereich der PWM nutzen für die Ansteuerung…

Was hältst du von einem Spannungsteiler? wenn du die max. Ausgangspannung mit einem Spg-Teiler halbierst, hast du doppelt soviele Werte…

Hallo Mad,

ich bin mir nicht sicher, ob ich das richtig verstanden habe.

Du möchtest am Ausgang kürzere Pulse bei gleich bleibender Frequenz?

Oder möchtest du insgesamt eine höhere Frequenz (kürzere Periodendauer)?

Für den ersten Fall kann man mit recht einfachen und kostengünstigen Mitteln auf den Standardtimer NE555 zurückgreifen. Dieser wird mit wenigen Bauteilen z.B. als Monoflop beschaltet und liefert am Ausgang das invertierte Eingangssignal, wobei man durch eine RC Kombination Einfluß auf das Puls-Pausenverhältnis nehmen kann. Ist ein TTL IC und somit auch für deine 5V Applikation tauglich.

Geht das in die Richtung? Oder war’s völlig falsch? :smile:

Gruß, Felix

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,
da wirst Du nicht um einen Controller mit 16Bit-Timer herumkommen.
Oder Du musst eine Interrupt-Routine schreiben, die durch verschiedene zusätzliche Verzögerungszeiten die Impulsbreite feiner verändert als der 8Bit-Timer und die durch den 8Bit-Timer aufgerufen wird. Verstanden, was ich meine?
Gruß
loderunner

PWM-Ausgangssignal geht zwar von 0-255 und ist mit einer
Periode von 20 ms und einer Spannung von 5 V ideal, aber
leider ist nur der Wertebereich von ca. 10 bis 30 (also 21
Schritte bei 180 Grad Drehung) für mich benutzbar und daher
etwas zu grob.

Hallo,

deine Ausführungen zum Stauchen habe ich auch nach mehrmaligem Lesen nicht verstanden. Man wird halt alt.

In jedem Fall gibt eine übliche PWM eine Impulsfolge mit dem Tasverhältnis von 0…100% aus, die bei 8bit eben in 255 Schritten geändert werden kann. Wenn du davon nur 10% nutzen kannst, liegt das Problem eigentlich beim Servo, die Erkenntnis nutzt aber nichts. Vermutlich wird das Servo übersteuert, also wäre die erste zu prüfende Möglichkeit, die 5V zu verringern (falls das Servo nicht rein digital arbeitet). Daraus 1 V zu machen braucht nur ein paar Widerstände.

Geht das nicht, musst du die PWM-Auflösung erhöhen, das geht sicher auch per Software: um z.B. 95% Tastverhältnis zu erzeugen, lässt du die PWM 9 Zyklen mit 255 machen und einen mit 128. Da die Zeitbasis 10x so lang ist, sollte man die PWM schneller als 20 ms machen, das geht aber bestimmt, die meisten Controller arbeiten ja heute mit 4 bis 20 MHz.

Gruss Reinhard

Hallo Reinhard, loderunner, felix und TRN.

Danke für Eure Bemühungen.
Zum Verständnis möchte versuchen mein Anliegen näher zu Beschreiben.

Ziel ist es ein Servo exakt anzusteuern. Das Signal für ein Servo ist ein Rechteckpuls von ca. 0,7 bis 2,5 ms. Die Periode bleibt dabei konstant auf 20 ms.
Mit dem PWM-Signal durchfahre ich die 0,7-2,5 ms in ca 20-25 Schritten, danach ist das Servo logischerweise am Endanschlag und den weiteren Wertebereich bis 255 kann ich nicht nutzen.
Meine Idee war nun, das PWM-Signal („zu stauchen“ ist vielleicht auch nicht das richtige Wort, eher „verkürzen“) oder „zusammenschieben“.
Also der Controller schmeißt z.B. ein 10 ms-Signal raus und die Gesuchte Schaltung macht daraus ein 2 ms-Puls. Die vom PWM-Signal vorgegebene Periode von 20 ms muß natürlich beibehalten werden.
Damit erreiche ich eine deutliche Auflösung des ursprünglichen PWM-Signal’s.
Der Vorschlag von felix mit dem 555er hat mir eigentlich gut gefallen, nur kann ich mir nicht vorstellen das ein Monoflop eine Signalverkürzung erreicht, die natürlich auch noch dynamisch sein muß.

Die Schaltung müsste doch erst einmal erkennen wie lang der letzte Puls war und dann ein entsprechend verkürztes Signal ausgeben.

Vielleicht fällt dem einen oder anderen noch etwas ein.

Vielen Dank bis hier hin!

Hallo,

Mit dem PWM-Signal durchfahre ich die 0,7-2,5 ms in ca 20-25
Schritten, danach ist das Servo logischerweise am Endanschlag
und den weiteren Wertebereich bis 255 kann ich nicht nutzen.

warum ist das denn so?
Ehe du eine weniger elegante und recht aufwendige elektronische
Lösung dafür aufbaust, würde ich doch lieber prüfen, ob’s nicht
z.B. mit einem Getriebe viel besser geht, oder?
Gruß Uwi

Meine Idee war nun, das PWM-Signal („zu stauchen“ ist
vielleicht auch nicht das richtige Wort, eher „verkürzen“)
oder „zusammenschieben“.

Hallo,

warum ist das denn so?

weil das die Ansteuerungsnorm für Servos so vorsieht. Das dadurch erzeugte Signal wird dann im Servo in eine Gleichspannung umgewandelt, die durch ein Poti gemessene Position damit verglichen und ein kleiner Gleichstrommotor entsprechend nachgeführt.

Ehe du eine weniger elegante und recht aufwendige
elektronische Lösung dafür aufbaust, würde ich doch lieber prüfen,
ob’s nicht z.B. mit einem Getriebe viel besser geht, oder?

Das Getriebe ist im Servo schon drin.

Es hilft alles nichts, er muss sich das Signal nicht vom Timer direkt machen lassen, sondern Timergesteuert eine Interruptroutine aufrufen, die das Signal dann in entsprechender Auflösung erzeugen kann.

Gruß
loderunner

Hallo.

Danke für Eure Beiträge.

Wie loderunner schon richtig bemerkte, scheidet eine weitere Getriebe-stufe aus, da die Weglänge mir dann nicht mehr ausreicht.

Meine eigenen Versuchte sind immerhin soweit gediehen, daß ich durch ein RC-Glied und eine Transistorschaltung ein zeitversetztes Signal erzeugen kann. Es ist aber leider nicht sehr sauber und deckt nicht annähernd den Arbeitsbereich ab den ich brauche.
Wenn ich aber schon soweit komme, dachte ich, würde es so eine Funktion von der Stange geben, aber danach sieht es ja nun nicht mehr aus.

Die andere Lösung ist natürlich, wie schon gesagt wurde, eine Unterroutine in Assembler. Das würde dann Wunderbar hinhauen, aber leider gibt es auch ein Paar Nachteile, z.B. ein achtel weniger Programmspeicherplatz oder die Doppelbelegung des späteren Servoausgang. Auch habe ich noch keine Ahnung von Assembler-Programmierung (was mich aber reizen würde).

Wahrscheinlich läuft es auf ein nächtliches Studium in ASM-Programmierung hinaus. Wie heißt es so schön „Man wächst mit seinen Aufgaben“.

Fals jemanden noch etwas einfällt, immer her damit. Ich bleibe auf jedenfall am Ball und ziehe das durch, egal wie.

Gruß
Mad

Wahrscheinlich läuft es auf ein nächtliches Studium in
ASM-Programmierung hinaus. Wie heißt es so schön „Man wächst
mit seinen Aufgaben“.

so isses.

Mein Ansatz: prüfen, ob die PWM ein Signal von 0…2,5 ms ausgeben kann. Wenn ja ist das schon die halbe Miete - per Timer einen einzelnen solchen PWM-Zyklus alle 20 ms ausgeben.

Gruss Reinhard

Hallo Reinhard.

Sicher ist das PWM-Signal in der Lage 0 - 2,5 ms lange Pulse auszugeben. Das entspricht ungefähr den ersten 30 von 255 Werten.
Mein Problem ist aber, daß ich diese 30 Werte dehnen müßte, um die Auflösung zuerreichen die ich brauche.

Könntest du mir die Sache mit dem Timer einmal näher erklären?
Es ist aber schon klar, daß mein Contoller das angesteuerte Servo über den gesamten Drehbereich regeln muß, und nicht nur einen ganz speziellen Punkt anfahren soll.

Gruß Mad

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Sicher ist das PWM-Signal in der Lage 0 - 2,5 ms lange Pulse
auszugeben. Das entspricht ungefähr den ersten 30 von 255
Werten.

Wenn Du die Timerfrequenz erhöhst, bekommst Du evt. 255 Werte bei Impulslängen von 0…2,5ms. Du startest den Timer nach Impulsende aber nicht sofort neu, sondern erst in einer kleinen Interruptroutine, die alle 20(?)ms aufgerufen wird.
Du hast bislang noch nicht geschrieben, welchen Controller Du verwendest, deshalb weiß ich natürlich auch nicht, ob das so geht.
Gruß
loderunner

Hallo.

Als Contoller verwende ich die C-Control Micro von Conrad-Elektronik.
Dieser basiert auf dem Motorola 68HC05-B. Ich hoffe das hilft.

Würde ich durch den Trick mit dem Timer wirklich eine „feinere“ Auflösung meines Signal erreichen? Im Moment stehe ich da etwas neben mir.

Bis dann und Danke.
Gruß Mad

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Als Contoller verwende ich die C-Control Micro von
Conrad-Elektronik.

Sorry, da weiß ich immer noch nicht, ob das geht, was ich vorgeschlagen habe. Und momentan habe ich nicht mal Zeit zum nachschauen.

Würde ich durch den Trick mit dem Timer wirklich eine
„feinere“ Auflösung meines Signal erreichen?

Ja. Der Timer macht ja nichts anderes, als einfach Taktsignale zu zählen. In Deinem Fall erreicht er irgendwann einen programmierten Wert und erzeugt dann eine Flanke des PWM-Signals (keine Ahnung, welche der beiden). Er zählt weiter, bis er irgendwann Null erreicht und erzeugt dann die andere Flanke. Er zählt wieder weiter bis zum programmierten Wert etc.
Die Auflösung ergibt sich aus der größten Zahl des Timers, in Deinem Fall sind das 8Bit, also kann der programmierte Wert von 0 bis 255 gehen.
Durch den ausgewählten Takt in Verbindung mit der Zählerbreite ergibt sich die Zeit, die der Zähler von Null bis wieder Null braucht. In Deinem Fall sind das die 20ms (50Hz), also hast Du wohl einen Takt von 50Hz*256=12,8kHz.
Wenn Du nun 2ms der 20ms mit 256 Stufen auflösen willst, brauchst Du einen Timer, der mit 16Bit zählt und mit 3,3MHz getaktet wird (3.3Mhz geteilt durch 65536 ergibt wieder die 50Hz, also 20ms).
Alternativ kannst Du den 8Bit-Timer verwenden, indem Du ihn alle 20ms startest, dabei die eine Flanke des PWM-Signals erzeugst und ihn nur einmal bis Null zählen lässt, um die andere Flanke machen zu lassen. Der Timer müsste dann wie der beschriebene 16Bit-Timer mit 3,3MHz zählen. Für das Starten dieses Timers benötigst Du dann einen zweiten Timer, der ebenfalls 8Bit breit ist, wie der jetzt von Dir verwendete mit 12,8Khz getaktet wird und bei jedem Nulldurchgang eine entsprechende Interruptroutine aufruft.

Habe ich mich jetzt deutlicher ausgedrückt? Wie gesagt, ich weiß nicht, ob man das der C-Control entlocken kann.
Gruß
loderunner

Hallo loderunner.

Danke für Deine ausführliche Antwort! Ja, ich glaube jetzt habe ich Dich verstanden. Ich werde mal sehen ob ich das so gebacken bekomme.

Vielen Dank für Deinen Vorschlag

Gruß Mad