Cuenta el número de horas transcurridas

Hace mucho que no juego con circuitos, agradecería una revisión de cordura del siguiente diseño; Estoy tratando de contar la cantidad de horas desde que se presionó el botón de reinicio por última vez. Lo ideal sería que durara mucho tiempo solo alimentado por baterías, pero si alguna vez lo hago funcionar, ¡seré feliz!

(Diagrama de circuito a continuación)

Calculé mis valores astables NE555 forzando bruscamente la ecuación en Wikipedia para 'valores comunes' de resistencias y condensadores que estaban más cerca de 3600 segundos (he agregado el código ruby ​​a continuación para aquellos interesados). ¿Parecen sensatos?

  • C: 100mF
  • R1: 51KΩ
  • R2: 470Ω
  • Condensador CTL: 10 µF (saqué esto de la nada…)
  • Esto debería establecer el ciclo de trabajo en 1,00057 horas.

Estoy planeando usar los siguientes componentes. ¿Hay algo más que deba tener en cuenta?

  • 1x NE555 de baja potencia ( TLC555 )
  • 1x NAND cuádruple de 2 entradas ( SN7400N )
  • 1x contador de ondas binarias dobles ( 74HC393 )
  • 2 decodificadores BCD a 7 segmentos ( 4511 )
  • 1 pantalla de 2 dígitos y 7 segmentos ( cátodo común )
  • Los condensadores y resistencias anteriores: literalmente, no tengo idea de cuáles elegir de la ridículamente amplia variedad que existe...

(Me di cuenta de que la lógica NAND puede no ser clara; ¡me tomó un tiempo descubrir cómo implementar un combo AND + OR con NAND! Así que lo saqué debajo del diagrama del circuito)

¡Gracias!

Diagrama de circuito

Diseño de circuito

Restablecer el diseño de la puerta lógica

Restablecer el diseño de la puerta lógica


Código Ruby para aplicar fuerza bruta a los valores de los componentes NE555 más cercanos:

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)
¿Qué tipo de precisión estás buscando? Con esos capacitores grandes, la tolerancia es probablemente del 20% en el mejor de los casos y la tasa de deriva con el tiempo y la temperatura será considerable. Sería mucho mejor y más barato usar un oscilador de cristal de bajo costo y contarlo hasta la tasa que desee.
100mF es un condensador grande . Y cualquiera que tenga un precio razonable probablemente tendrá una tolerancia del 20% o más, lo que afectaría la precisión de su temporizador.
Realmente perdió el tiempo tratando de seleccionar valores fijos "estándar" para sus componentes, porque la tolerancia en sus valores será tan mala que tendrá que proporcionar un mecanismo de calibración de todos modos.
Ahh - ¡Pensé que sería la ruina! No necesito una gran precisión, pero el 20% es probablemente un poco alto (creo que podría salirme con la mía con un 10%) ¿Qué enfoque debo probar a continuación? El oscilador de @Barry + muchos divisores parece que debería funcionar.
Use un cristal de reloj de 32768 Hz y un 4060 para producir un tic de 1 Hz, luego divida por 3600 para obtener horas, luego cuente con un contador BCD.
Cambie el antiguo 7400 hambriento de energía a un CMOS 74HC00 o similar.
@Andy: con un cristal/reloj de 32768 Hz, no puede obtener un tic de 1 segundo de un 4060 ya que solo tiene 14 etapas de ancho.
@EMFields ¡Diablos, sí! se necesitan otro par de chanclas - ¡gracias!

Respuestas (1)

Algunos comentarios para empezar: -

  • El 4511 necesita entradas no utilizadas vinculadas a un nivel lógico apropiado
  • El 4511 necesita resistencias en serie en cada una de las salidas de segmento a la pantalla de cátodo común
  • Está utilizando TTL con calidad de museo, por lo que debe tener un pull-up en la entrada RESET y bajarlo a tierra con el interruptor.
  • Un día (Editar: o una hora) no es un período razonable para obtener de un 555 (incluso uno CMOS). Manténgalo entre 1 y 10 segundos. La fuga en un capacitor de 0.1F se burlaría de sus cálculos precisos. Puede contar hacia atrás una frecuencia más alta si lo desea. Un preescalador 74HC4040 permitiría un reloj de ~1 segundo.
  • Nunca obtendrá algo mejor que quizás un 5 % sin ajuste en un 555, e incluso si lo recorta, décimas de un por ciento. Puede que eso no le moleste, pero el conteo puede estar desfasado una hora en diez o veinte sin recortar. ¡Piense en cuántas semanas (Editar: días) se necesitaría para ajustar un temporizador con un ciclo de 1 día (Editar: o una hora)!
  • No sé qué es un 7469 ... ¿algo así como un contador de décadas dual 74390 tal vez?
  • 10uF es innecesariamente alto para la derivación de control; 100nF es más que suficiente.
  • No revisé su lógica (la semi-imagen es un poco dolorosa de leer) pero parece plausible como punto de partida del tablero de conexiones.
Énfasis en el punto 4 sobre la frecuencia razonable. Dice 1 día, pero los cálculos dan como resultado 1 hora (creo que simplemente lo escribió mal). Incluso 1 hora es incómoda para un 555.
Escribí mal, debería haber sido horas, pero tengo la impresión de que estoy tomando el enfoque incorrecto aquí (le dije que ha pasado un tiempo: P) ¡se agradecería cualquier sugerencia hacia mejores enfoques!
No es un enfoque general incorrecto. Los detalles están un poco fuera de lugar, en particular el uso del 555. Si pensara que era completamente inútil, no habría respondido. En 2014, la mayoría del uso probablemente haría esto con un microcontrolador y una página de código 'C' o un par de páginas de ensamblador.
Si no le importa la precisión (más o menos algunas horas en el transcurso de unos días), el 555 está bien. Pero elige una frecuencia mucho más rápida. Eso hará que los componentes sean más pequeños y más baratos. Use contadores en cascada que actúan como divisores para obtener los incrementos de 1 hora que desea. Si necesita la precisión, use un oscilador basado en cristal.
Gracias chicos, mi C es lo suficientemente bueno para codificar algo como esto en un chip AVR; Veré el costo inicial de un programador (¿un Arduino en estos días, supongo?) Contra un ciclo de trabajo más rápido y usando un contador en cascada (parece que un ciclo de 0.879s funcionaría para que el 74HC4040 de @SpehroPefhany alcance una hora) - ¡Has sido de gran ayuda!
@JP Tos @ Arduino. $15 por un STM32F4Discovery con programador integrado, IDE (CooCox) y compilador (GCC) gratuitos. Sí, una exageración masiva (ridícula, ridícula, etc.), pero al menos obtienes algo por tu dinero además de un juguete infantil casi inútil.