Von PWM zu sauberen Ausgang

Ich habs jetzt nur mit 5V gemessen, kann grad nicht runter gehen weil da noch n Akku mit dran hängt zum laden. Mach ich nachher mal bei 3V.
Ich bin jetzt erstmal dabei an der Software zu schrauben bis ich die Instrumente habe.

p.s.: Jo, das Gehäuse ist echt nicht schlecht
 
Steuerst du die Instrumente direkt an oder sind die "geeicht" auf 5V?
Ich weiß leider immer noch nicht wie viel Strom / Spannung die wirklich brauchen, nur so hörensagen. Habe auch keine "nakten" Anzeigen gefunden, nur fertige Messgeräte.
 
Ich wusste den Strombereich meiner Instrumente (10mA), da konnte ich den nötigen Vorwiderstand ausrechnen und hab einen Teil davon als Trimmer verwendet. Zum 'Eichen' gibt es den jumper, wird der gesteckt, gibt die soft-pwm '11 Uhr 59' aus, was dem Vollausschlag der Instrumente betrifft. Mit den Trimmern den Ausschlag justieren, jumper runter und fertig.
Eigentlich müssten deine Instrumente auch eine Widerstandsmessung der Drehspule aushalten, die werden gegen den Anschlag schnalzen, aber dafür ist er da und durchbrennen werden die durch den Messstrom nicht. Dann kannst du die Empfindlichkeit (Strom) ausrechnen und das ergibt deinen nötigen Vorwiderstand.
Wo ich rumgefummelt hab', war eine PWM-Frequenz zu finden, die den DCF-Empfang nur wenig störte, bei wenig Zittern der Zeiger und wenig 'singen' der Drehspulen.
 
Zuletzt bearbeitet:
Hallo Tschoeatsch,
Wo ich rumgefummelt hab', war eine PWM-Frequenz zu finden, die den DCF-Empfang nur wenig störte, bei wenig Zittern der Zeiger und wenig 'singen' der Drehspulen.

(gehört nicht direkt zum Thema...)
du hättest hier vielleicht auch für jeden PWM Kanal einen RC-Tiefpass mit Operationsverstärker als Treiber danach (Impedanzwandler) verwenden können. Dann sind die Schaltsignale kürzer und sind auch nicht an den Messwerken vorhanden.

Als Pegelwandler für das DCF77 Modul verwendest du einen Operationsverstärker als Komparator, hättest du nicht den im Mikrocontroller integrierten Komparator verwenden können oder benötigst du das Signal an PB4?

Deine Uhr gefällt mir ebenfalls sehr gut :cool: Da bekomme ich richtig Lust diese nachzubauen :)

Dirk :ciao:
 
Ich hab' gern ein Kontrolllichtchen, um den Empfang abzuschätzen, deswegen das zusätzliche Zeugs nach dem Empfänger. Die Dcf-lib von bascom will einen Datenpin, das wäre das nächste. Auf RC-Tiefpass mit Opv-treiber komm' ich nicht von selber, dazu reicht's bei mir net, vielleicht kann ich mir das mal für zukünftige Anwendungen als Stichwort merken.
 
@Bandgap kanibalisieren: beim Tiny87/167 wäre das sogar datenblattkonform möglich. Da scheint man sowas wie'n internen Impedanzwandler zwischen die interne 1V1/2V56-Referenz und den XREF/AREF-Pin schalten zu können. Dann darf der Pin bis 100µA belastet werden. Für mehr als das garantiert Dir hier auch keiner, aber beim Mega8/48/88/... gilt das ja nicht mal bis 100µA...
(Der Tiny hat 'n USI (mit alternativen Pins) und 'n SPI, und 'n UART der LIN kann
Timer1 hat 2 PWM-Kanäle, von denen jeder bis zu 4 Pins ansteuern kann (Timer0 nur einen Kanal/Pin)
eine interne 100µA-Stromquelle (für den LIN?), deren Spannung dann mit dem ADC gegen einen externen R gemessen werden kann,
der ADC kann differentiell messen
Auf den negativen Eingang des AC könne Bruchteile der 2V56-Referenz (1/1, 1/2, 1/4, 1/8) gekoppelt werden.
So auf den ersten Blick, hab den noch nicht genauer angesehen)
 
Nur mal kurz zur Rückversicherung (bevor ich schon wieder neu bestellen muss)…

Ich werde mir jetzt die Drehspulinstrumente neu ordern (100µA, Ri=1KΩ).
Dann würde ich die 1,1V Bandgap kanibalisieren und wie es @Tschoeatsch gemacht hat (gute Idee, ich wollte es erst mit PWM limitieren. Zu kompliziert gedacht).

2x 100µA sind locker drin was die Bandgap schafft, passt.
Maximaler Strom wäre also (1,1V/1000Ω) = 1,1mA. Zu viel.
Würde ich jetzt n 10KΩ Trimmer dazu nehmen, wäre Rmax=11KΩ, also Imax 0,1mA.
Macht an R1 (10KΩ) 1V, an R2 (der Anzeige) 0,1V
Rechnung soweit korrekt?

Bräuchte ich also n Trimmer etwas über 10K, da man ja sonst schon am Anschlag ist (oder drüber, je nach Toleranzen)
 
Vielleicht den regelbaren Bereich noch etwas spreitzen? Nimm einen 4,7k Trimmer und einen 8,2k Widerstand (wenn das jetzt gängige Werte sind). Ist halt wieder ein Teilchen mehr pro Anzeige :(
 
  • Like
Reaktionen: TommyB
Ich merk schon, du kennst mich mittlerweile :D
Hm, so gehts natürlich auch :)

8,2K Widerstand und 5K Trimmer, passt, danke ;)
 
Zuletzt bearbeitet:
Immer wieder schön die ersten Lebenszeichen zu sehen :)
Das mit der Spannungsglättung habe ich jetzt auch komplett weg gelassen. Herrjeh, dass die Dinger träge sind wusste ich ja, aber so extrem… Das hätte ich nicht gedacht.

Jetzt heißt es also Platine löten, Gehäuse bauen und neue Skala erstellen und ausdrucken.

p.s.: Der Widerstandswert hat übrigens nicht gepasst. Lag aber an mir, ich Dussel hab den Spannungsfall der Diode vergessen zu berücksichtigen.

Hier mal ein (schlechtes) Video vom proof of concept:
 
  • Like
Reaktionen: Dirk
Wie hast'n das jetzt umgesetzt?
Bandgap->Rheostat->Instrument->Diode->PWM ?
Wie gesagt, wenn Du den PWM nicht als PWM nutzt, sondern in den IRQs die Beine selbst zwischen Gnd und offen zappeln läßt, kannst Du auch de Dioden sparen...

Ansonsten (*Daumen*)
 
Wie hast'n das jetzt umgesetzt?
Bandgap->Rheostat->Instrument->Diode->PWM ?
Jupp, genau so :)

Wie gesagt, wenn Du den PWM nicht als PWM nutzt, sondern in den IRQs die Beine selbst zwischen Gnd und offen zappeln läßt, kannst Du auch de Dioden sparen...
Ja, ich war auch erst am überlegen. Bin dann aber zu dem Entschluss gekommen dass es, grade bei sehr hohen / niedrigen Werten möglicherweise zu Timing Problemen kommen könnte. Außerdem spart es ein paar wenige Taktzyklen, was sich möglicherweise in einer 10 Sekunden längeren Batterielaufzeit äußert :D
 
Tickt ja schon! Wie machst du das mit der Stundenanzeige? Ich hatte ja nur zwischen 0 und 11, mit 12..23 drüber. Schaut mittags blöd aus. Ich würde die Skala bis von 0 bis 12 gehen lassen, da hat Mitternacht und Mittag verschiedene Anzeigen und die Bezeichnungen 13 bis 23 würde ich weglassen. Aber das ist das, was ich machen würde, wie hast du es vor?
 
Ich mach das mit 2 Anzeigen, eine für Stunden, eine für Minuten.
Skala für Stunden: 0..12 ( 1er Schritte )
Skala für Minuten: 0..60 ( 10er Schritte )

Warum 12 als Maximum?
Weil ich bei den Stunden die Minuten mit einfließen lassen möchte, daher würde auch der Bereich 11..12 genutzt. Erst bei exakt 12:00 respektive 0:00 gibts den Sprung auf 0.
Bei Minuten ähnlich, wegen der Einteilung.

Ich habe mich für 0..12 entschieden da die Anzeige sonst zu unleserlich wäre würde sie 24h anzeigen. Man sollte normalerweise auch davon ausgehen können dass Spezies Humanoid weiß ob es AM oder PM ist ;)
Für die Uhr selbst ist es ja egal, ein Wecker soll es auch nicht werden.

Wie wird es umgesetzt?
Durch ein bisschen Mathe und ein paar Konstanten im EEPROM.
Der Timer rennt von 0..65535. Gespeichert wird der Startwert (Wert der Zahl 0, meistens 0x000F) zu dem x Mal der Step Wert addiert wird (*).
Bei Stunden wäre das PWM = Start + (Stunden * Step * 60) + (Minuten * Step)
Und bei Minuten: PWM = Start + (Minuten * Step)
Code:
.ESEG
    EE_HoursPWM:
        .DW 0x000F, 0x005B    // Minimum, Step value (1 each minute)
        ;.DW 0x0003, 0x1555    // Minimum, Step value (1 each hour)
    EE_MinutesPWM:
        .DW 0x000F, 0x0444    // Minimum, Step value (1 each minute)

(*): Tatsache, im Quelltext addiere ich noch, in einer Schleife. Sehr unschön.
Hardware Multiplikation kann ich so nicht nehmen, da es nur 8x8Bit=16Bit ist.
Ich habe auch schon eine Alternative gesucht und gefunden, Aber zwischen finden und verstehen damit man es umsetzen kann, das ist so eine Sache für sich...
http://www.avr-asm-tutorial.net/avr_en/calc/HARDMULT.html#mult16by8
 
Hm, auf die 12 wird ja dann nie gezeigt, oder hab' ich da was falsch verstanden? Und auf die 60 doch auch nicht. Wozu dann hinschreiben und den 'Anzeigewinkel' dadurch verkleinern? Gut, bei den Minuten verliert man nicht viel :rolleyes:

Edit: ah, du hast ja keine 'springende Stunde', ok, dann passt das so.
 
Bei Stunden doch auch nicht. Bei 11:59 steht der Stundenzeiger doch fast auf 12
 
Ja, ok, eine 'vollanaloge' Anzeige.
Mit Assembler bist du ja viel 'feiner' an der Zeit dran. In hab' bascom und müsste mühsam Bruchteile einer Stunde ausrechnen, drum bin ich auf eine 'gleitende Stunde' garnicht gekommen.
 
Zuletzt bearbeitet:
Hmm...
Geht der Zeiger denn in der einen Sekunde schnell genug von ganz "oben" nach ganz "unten" zurück?
Zur Multipliziererei: mit'nem Mega kannst Du die Hardware multiplizieren lassen (MUL). wenn Du Words multiplizieren willst, mußt Du das Distributivgesetz anwenden (jaja, gleich holste Teer und Federn). Beim Tiny mußte das in SW machen (ist aber auch kein Thema - wie in der Schule mit dem Dezimalsystem gelernt... Bei der Division genauso. Nur daß Du kein kleines EinMalEins im Kopf haben mußt, da's nur Nullen und Einsen gibt (also nur Vergleiche)

ABER: Du brauchst doch gar nicht multiplizieren. Kannst Du doch direkt integrieren. Sagen wir mal, Du willst jede Sekunde die Darstellung aktualisieren.
Dazu hast Du 'n Sekunden-IRQ.
In jedem IRQ addierst Du Deinen "Eins-von-sechzig"-Sekunden-Step auf den Sekunden-PWM, und den "Eins-von-43200"-Sekunden-Step auf den Stunden-PWM.
Prinzipiell mußt Du jedesmal prüfen, ob Du einen Minuten- bzw Halbtagesüberlauf hast, und dann ggf auf einen Startwert zurücksetzen. Sowas läßt sich "schön" realisieren, indem man den Startwert soweit hochschiebt, daß das Maximum mit dem Überlauf des Timers zusammenfällt, und dann die Steps addiert, oder andersrum - also von oben die Steps subtrahiert (Je nach verwendetem PWM-Modus). Beim SUBtract/ADD fällt dann ggf das Carry, und man kann ohne Vergleich bedingt hopsen.
Wegen der Auflösung sollte man (zumindest beim Stundenzeiger) mit 24bit rechnen (addieren/subtrahieren), und davon dann die oberen 16bit in die OC-Register kopieren (also quasi mit einem Byte "hinter dem Komma" rechnen).

Also drei Register, die den Stundenwert vorhalten, zwei/drei Register für den Minutenwert, und je zwei Register für die Steps. Und die "Null"-Werte.
Nullwerte und Steps könnten natürlich auch als Flash-Konstanten (Immediate) verwendet werden, aber wenn Du das irgendwie anpaßbar machen willst, mußt Du sie halt aus dem EEPROM in Rechenregister laden lassen.

Wie stellst Du Dir das mit dem Stellen der Uhr vor? 'n Tastendruck abfragen, und dann entsprechend (stepweise) die Zähler rauf-/runterleiern.

P.S.: interessant wäre dann, statt der Aktualisierung im Sekundentakt irgendwas zu wählen, was in der Trägheit der Instrumente "verschwindet" -> "vollanaloge Anzeige" (<-Tschoeatsch) - wobei die höhere Auflösung den Controller dann weniger schlafen läßt...
 
Zuletzt bearbeitet:
Also von Max auf Min (und anders herum) braucht die Anzeige so geschätzte 1 - 1,5 Sekunden. Passt aber, Sekunden lasse ich mir nicht anzeigen.

Das mit pro Sekunde hochzählen.. So geht es natürlich auch. Ich bin noch am überlegen wie ich das umsetze, da ich eigentlich lieber den RTC als Zeitbasis nutzen wollte, der AVR fragt den dann alle x Sekunden mal ab. Vielleicht hole ich mir auch beim Start die Sekunden ab, z. B.: 10:12:45 und warte dann 16 Sekunden, danach immer 60 Sekunden. Mal schaun.

Beim Multiplizieren, Werte > 16 Bit brauche ich eigentlich nicht, da das Ergebnis immer Min..0xFFFF sein wird (also doch die unteren Register, nicht die oberen, oder?). Außer man vergisst die .EEP mit zu flashen (wie ich. Die Fehlersuche war … lustig).
Daher Memo an mich selbst: debugWire flasht den EEPROM nicht.

Mit dem Stellen, ja ungefähr so war der Plan. Ein Taster für Stunden += 1, einen Minuten += 1, einen für PWM=Min, einen für PWM=0xFFFF (letzten beiden zum kalibrieren der Anzeigen).

Sekunden lass ich garnicht mit einfließen. Die würde man selbst bei der Minutenanzeige nicht mehr sehen können.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)