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

INTRODUCCIÓN:

Soy estudiante del 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 necesarios para este proyecto son temas que están por encima de mi nivel en comparación con 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). He creado un programa simple para enviar un byte de información a un registro de desplazamiento (TTL) 595 IC. Luego, cada dígito binario se transfiere de cada una de las 8 salidas del 595 IC a su pin correspondiente 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 la cantidad de veces que uso la función "retraso ()" en mi código, pero aún tendría el mismo problema.

SOLUCIÓN:

Me han dicho que use un reloj (555 IC). No sé nada acerca de este IC. ¿Hay alguien que haya tenido alguna experiencia con el 555 IC que pueda darme alguna orientación cuando comience 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 mencioné?

Adjunto una foto de mi diseño si ayuda. Había quitado 3 de los 595 IC cuando se tomó esta foto, pero la imagen muestra claramente mi microcontrolador, el registro de desplazamiento 595 y la 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 lo que estoy haciendo mal y podría hacerlo mejor.

Disposición

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);
}

Respuestas (2)

Realmente debería usar firmware controlado por interrupción (temporizador) para asegurarse de que su reloj marque con precisión. Los retrasos del software provocarán una deriva gradual debido a las variaciones en el flujo de su programa. Aquí hay 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 "LED parpadeante con interrupción de desbordamiento del temporizador". El cristal de 16 MHz de Arduino es bastante preciso para un proyecto de reloj de juguete si escribe el software correctamente.

Este estilo de escribir software está "impulsado por eventos", por lo que primero debe tenerlo en cuenta. El hardware le dice que algo sucedió (en este caso, ha pasado un segundo) y su software reacciona. En lugar de decirle a su software que "espere un segundo" y luego haga algo.

Intenté algo similar hace un tiempo y mi Arduino Mega se apagó alrededor de 1 o dos segundos en un día. No está mal para un reloj sin calibrar.

555 es en gran medida 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 datos y escribir en la pantalla. De esa manera, la cantidad de tiempo que toma el procesamiento no es importante, siempre que se complete antes de que se agote el siguiente retraso.

Esto significa ejecutar el software y el retraso 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 hacer esto con precisión.