Anzahl der verstrichenen Stunden zählen

Es ist lange her, dass ich mit Schaltkreisen gespielt habe, ich würde mich über eine Plausibilitätsprüfung des folgenden Designs freuen; Ich versuche, die Anzahl der Stunden seit dem letzten Drücken der Reset-Taste zu zählen. Im Idealfall würde es lange halten, wenn es nur mit Batterien betrieben wird, aber wenn ich es jemals zum Laufen bekomme, bin ich glücklich!

(Schaltplan unten)

Ich habe meine astabilen NE555-Werte berechnet, indem ich die Gleichung auf Wikipedia für "gemeinsame Werte" von Widerständen und Kondensatoren , die 3600 Sekunden am nächsten lagen , brutal erzwang (ich habe den Rubincode unten für Interessierte hinzugefügt). Erscheinen sie vernünftig?

  • C: 100mF
  • R1: 51 kΩ
  • R2: 470Ω
  • CTL-Kondensator: 10µF (aus dem Nichts gezogen …)
  • Dies sollte den Arbeitszyklus auf 1,00057 Stunden einstellen.

Ich plane die Verwendung der folgenden Komponenten - gibt es noch etwas, das ich berücksichtigen sollte?

  • 1x NE555 mit geringer Leistung ( TLC555 )
  • 1x Quad 2-Eingangs-NAND ( SN7400N )
  • 1x dualer binärer Ripple-Zähler ( 74HC393 )
  • 2x BCD auf 7-Segment-Decoder ( 4511 )
  • 1x 2-stellige 7-Segment-Anzeige ( Common Cathode )
  • Die oben genannten Kondensatoren und Widerstände – ich habe buchstäblich keine Ahnung, welche ich aus der lächerlich großen Auswahl da draußen auswählen soll …

(Mir wurde klar, dass die NAND-Logik möglicherweise nicht klar ist - es hat eine Weile gedauert, bis ich herausgefunden habe, wie man eine UND + ODER-Kombination mit NANDs implementiert! - Also habe ich sie unter dem Schaltplan herausgezogen.)

Danke!

Schaltplan

Schaltungsdesign

Logikgatter-Layout zurücksetzen

Logikgatter-Layout zurücksetzen


Ruby-Code zum Brute-Forcing der nächsten NE555-Komponentenwerte:

require "pp"
capacitor = [1, 1.5, 2.2, 3.3, 4.7, 6.8]
resistor = [10, 11, 12, 13, 15, 16, 18, 20, 22, 24, 27, 30, 33, 36, 39, 43, 47, 51, 56, 62, 68, 75, 82, 91]
powers = [0.001, 0.1, 1, 10, 100, 1_000, 10_000, 100_000, 1_000_000]

target = 3600
tolerance = 1

best = []

ln2 = Math.log(2)

powers.each do |c_p|
  capacitor.each do |c_v|
    c = c_v * c_p
    powers.each do |r1_p|
      resistor.each do |r1_v|
        r1 = r1_v * r1_p
        powers.each do |r2_p|
          resistor.each do |r2_v|
            r2 = r2_v * r2_p

            value = ln2 * c * (r1 + 2*r2)

            proximity = (target - value).abs

            if proximity <= tolerance
              best.push(
                proximity: proximity,
                value: value,
                c: c,
                r1: r1,
                r2: r2
              )
            end
          end
        end
      end
    end
  end
end

best.sort! do |a, b|
  a[:proximity] <=> b[:proximity]
end

pp best.take(5)
Welche Art von Genauigkeit suchen Sie? Bei diesen großen Kondensatoren beträgt die Toleranz wahrscheinlich bestenfalls 20 %, und die Driftrate mit Zeit und Temperatur wird beträchtlich sein. Es wäre viel besser und billiger, einen kostengünstigen Quarzoszillator zu verwenden und ihn auf die gewünschte Rate herunterzuzählen.
100 mF ist ein großer Kondensator. Und jeder preisgünstige hat wahrscheinlich eine Toleranz von 20 % oder mehr, was sich auf die Genauigkeit Ihres Timers auswirken würde.
Sie haben wirklich Ihre Zeit damit verschwendet, "Standard"-Festwerte für Ihre Komponenten auszuwählen, weil die Toleranz ihrer Werte so schlecht sein wird, dass Sie sowieso einen Kalibrierungsmechanismus bereitstellen müssen.
Ahh - ich dachte, das wäre der Untergang! Ich brauche keine große Genauigkeit, aber 20 % sind wahrscheinlich ein bisschen hoch (ich könnte mit 10 % davonkommen, denke ich). Welchen Ansatz sollte ich als nächstes versuchen? @Barrys Oszillator + viele Teiler scheint zu funktionieren?
Verwenden Sie einen 32768-Hz-Uhrkristall und einen 4060, um einen 1-Hz-Tick zu erzeugen, teilen Sie ihn dann durch 3600, um Stunden zu erhalten, und zählen Sie dann mit einem BCD-Zähler.
Tauschen Sie den uralten leistungshungrigen 7400 gegen einen CMOS 74HC00 oder ähnliches aus.
@Andy: Mit einem 32768-Hz-Quarz / einer Uhr können Sie aus einem 4060 keinen 1-Sekunden-Tick herausholen, da er nur 14 Stufen breit ist.
@EMFields Hölle ja! noch ein paar Flip-Flops werden benötigt - danke!

Antworten (1)

Ein paar Kommentare zu Beginn: -

  • Der 4511 benötigt unbenutzte Eingänge, die mit einem geeigneten Logikpegel verbunden sind
  • Der 4511 benötigt Vorwiderstände an jedem der Segmentausgänge zur Anzeige mit gemeinsamer Kathode
  • Sie verwenden TTL in Museumsqualität, daher sollten Sie einen Pull-up am RESET-Eingang haben und ihn mit dem Schalter auf Masse ziehen.
  • Ein Tag (Edit: oder eine Stunde) ist kein angemessener Zeitraum, um von einem 555 (sogar einem CMOS) zu kommen. Halten Sie es bei 1-10 Sekunden. Die Leckage an einem 0,1-F-Kondensator würde Ihre genauen Berechnungen verspotten. Sie können eine höhere Frequenz herunterzählen, wenn Sie möchten. Ein 74HC4040-Vorteiler würde einen Takt von ~ 1 Sekunde ermöglichen.
  • Sie werden nie besser als vielleicht 5 % ohne Anpassung an einem 555er, und selbst wenn Sie ihn trimmen, Zehntelprozent. Das mag Sie nicht stören, aber die Zählung kann ohne Trimmen in zehn oder zwanzig Stunden um eine Stunde abweichen. Überlegen Sie, wie viele Wochen (Edit: Tage) es dauern würde, einen Timer mit einem 1-Tages-Zyklus (Edit: oder einer Stunde) zu trimmen!
  • Ich weiß nicht, was ein 7469 ist. Vielleicht so etwas wie ein 74390-Doppeldekadenzähler?
  • 10 uF sind unnötig hoch für den Steuerbypass - 100 nF sind mehr als genug.
  • Ich habe Ihre Logik nicht überprüft (das Halbbild ist etwas schmerzhaft zu lesen), aber es sieht als Ausgangspunkt für ein Plugboard plausibel aus.
Betonung auf dem 4. Punkt über die angemessene Häufigkeit. Er sagt 1 Tag, aber die Berechnungen ergeben 1 Stunde (ich glaube, er hat sich nur vertippt). Selbst 1 Stunde ist für einen 555 umständlich.
Ich habe mich vertippt - hätte Stunden dauern sollen, aber ich habe den Eindruck, dass ich hier den falschen Ansatz verfolge (ich habe Ihnen gesagt, dass es eine Weile her ist: P). Hinweise auf bessere Ansätze wären dankbar!
Es ist kein falscher Gesamtansatz. Die Details sind ein bisschen daneben - insbesondere die Verwendung des 555. Wenn ich dachte, es wäre völlig hoffnungslos, hätte ich nicht geantwortet. Im Jahr 2014 würden die meisten Benutzer dies wahrscheinlich mit einem Mikrocontroller und einer Seite C-Code oder ein paar Seiten Assembler tun.
Wenn Sie sich nicht um Genauigkeit kümmern (plus oder minus ein paar Stunden im Laufe von ein paar Tagen), ist der 555 in Ordnung. Aber wählen Sie eine viel schnellere Frequenz. Das macht die Komponenten kleiner und billiger. Verwenden Sie kaskadierende Zähler, die als Teiler fungieren, um die gewünschten 1-Stunden-Schritte zu erhalten. Wenn Sie die Genauigkeit benötigen, verwenden Sie einen quarzbasierten Oszillator.
Danke Leute, mein C ist gerade gut genug, um so etwas auf einen AVR-Chip zu codieren; Ich werde mir die Vorabkosten eines Programmierers (ein Arduino heutzutage, schätze ich?) im Vergleich zu einem schnelleren Arbeitszyklus und der Verwendung eines Kaskadenzählers ansehen (sieht so aus, als würde ein Zyklus von 0,879 s für den 74HC4040 von @SpehroPefhany funktionieren, um eine Stunde zu erreichen). - Du warst mir eine große Hilfe!
@JP Husten @ Arduino. 15 $ für einen STM32F4Discovery mit integriertem Programmierer und kostenloser IDE (CooCox) und Compiler (GCC). Ja, massiver (lächerlicher, lächerlicher usw.) Overkill, aber immerhin bekommt man neben einem grenzwertig nutzlosen Kinderspielzeug etwas für sein Geld.