Reloj digital --- Mala precisión (Ayuda para la resolución de problemas)

3

INTRODUCCIÓN:

Soy un estudiante en el programa de Ingeniería Electrónica en mi Universidad. Estoy construyendo un reloj digital como una iniciativa propia para aprender más. Algunos de los requisitos y pasos que son necesarios para este proyecto son temas que están por encima de mi nivel en comparación con el de mi programa. Sin embargo, estoy realmente comprometido con este proyecto y me gustaría saber más sobre cómo puedo mejorar los problemas que he tenido.

DETALLES / PROYECTO:

Estoy usando un microcontrolador Arduino (MODELO: UNO). Construí un programa simple para enviar un byte de información a un (TTL) 595 IC shift-register. Cada dígito binario se transfiere luego cada una de las 8 salidas en el 595 IC a su pin correspondiente fuera del LED.

PROBLEMA:

He notado que debido a que estoy usando (4) 595 IC para controlar un LED de 4 dígitos, estoy experimentando un retraso. Por lo tanto, mi precisión se ha ido. Podría acortar mi código para limitar el número de veces que uso la función "retraso ()" en mi código, pero todavía tendría el mismo problema.

SOLUCIÓN:

Me han dicho que use un reloj (555 IC). No sé nada de este IC. ¿Hay alguien que haya tenido algo de experiencia con el 555 IC que podría orientarme cuando comienzo a implementar esto en mi proyecto? ¿Necesitaré un microcontrolador Arduino si uso esto o no? ¿Hay alguna otra sugerencia sobre cómo puedo solucionar el problema que dije?

Adjunto una imagen de mi diseño si ayuda. Había eliminado 3 de los 595 IC cuando se tomó esta foto, pero la imagen muestra claramente mi microcontrolador, 595 registor de cambios y pantalla LED de 4 dígitos. También voy a adjuntar mi código que he hecho. Es muy genérico ya que soy un principiante, así que si hay algo evidente en mi código que está mal, tómatelo con calma. Sin embargo, por todos los medios, hágame saber qué estoy haciendo mal y podría hacerlo mejor.

int clockpin = 11; //595 pin 11
int latchpin = 12; //595 pin 12
int datapin  = 13; //595 pin 14
int binary = 0;

void setup()
{
pinMode(latchpin, OUTPUT);
pinMode(clockpin, OUTPUT);
pinMode(datapin, OUTPUT);
}

void loop()
{
digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 63);
digitalWrite(latchpin, HIGH);

delay(1000);

digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 6);
digitalWrite(latchpin, HIGH);

delay(1000);

digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 91);
digitalWrite(latchpin, HIGH);

delay(1000);

digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 79);
digitalWrite(latchpin, HIGH);

delay(1000);

digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 102);
digitalWrite(latchpin, HIGH);

delay(1000);

digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 109);
digitalWrite(latchpin, HIGH);

delay(1000);

digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 125);
digitalWrite(latchpin, HIGH);

delay(1000);

digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 7);
digitalWrite(latchpin, HIGH);

delay(1000);

digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 127);
digitalWrite(latchpin, HIGH);

delay(1000);

digitalWrite(latchpin, LOW);
shiftOut(datapin, clockpin, MSBFIRST, 111);
digitalWrite(latchpin, HIGH);

delay(1000);
}
    
pregunta Shane Yost

2 respuestas

7

Debería usar realmente el firmware de interrupción (temporizador) para asegurar que su reloj marque con precisión. Los retrasos en el software causarán un cambio gradual debido a las variaciones en el flujo de su programa. Aquí es una buena descripción general de cómo usar los temporizadores en la plataforma Arduino. Puede seguir algo como el patrón descrito en la sección "Parpadeo del LED con interrupción de desbordamiento del temporizador". El cristal de 16MHz de Arduino es bastante preciso para un proyecto de reloj de juguete si escribes el software correctamente.

Este estilo de software de escritura es "dirigido por eventos", por lo que primero debe tener una idea de esto. El hardware le dice que algo sucedió (en este caso ha pasado un segundo) y su software reacciona a ello. En lugar de decirle a su software que "espere un segundo" y luego hacer algo.

    
respondido por el vicatcu
2

555 es la respuesta incorrecta para esta aplicación, o cualquier aplicación que requiera una sincronización precisa.

Una respuesta es un RTC externo con un cristal, pero eso no es ideal ya que implica hardware y complejidad adicionales.

Una mejor respuesta es, al final de cada retraso (preciso), INMEDIATAMENTE inicie el siguiente retraso, LUEGO ejecute el software para procesar los datos y escribir en la pantalla. De esa manera, el tiempo que lleva el procesamiento no es importante, siempre y cuando se complete antes de que se agote el siguiente retraso.

Esto significa ejecutar el software y la demora en paralelo: para eso están los temporizadores programables en el procesador AVR. Y ahí es donde el enlace de vicatcu sobre el uso de temporizadores es útil; Es la forma normal de hacerlo con precisión.

    
respondido por el Brian Drummond

Lea otras preguntas en las etiquetas