Digitaluhr ---> Schlechte Genauigkeit (Hilfe zur Fehlerbehebung)

EINFÜHRUNG:

Ich studiere an meiner Universität im Studiengang Elektrotechnik. Ich baue eine Digitaluhr als Eigeninitiative, um mehr zu erfahren. Einige der Anforderungen und Schritte, die für dieses Projekt notwendig sind, sind Themen, die über meinem Niveau liegen, verglichen mit dem, wo ich in meinem Programm bin. Ich bin jedoch sehr engagiert in diesem Projekt und würde gerne mehr darüber erfahren, wie ich die Probleme, die ich hatte, verbessern kann.

DETAILS/PROJEKT:

Ich verwende einen Arduino Micro-Controller (MODELL: UNO). Ich habe ein einfaches Programm erstellt, um ein Informationsbyte an ein (TTL) 595 IC-Schieberegister zu senden. Jede Binärziffer wird dann von jedem der 8 Ausgänge des 595 IC zu ihrem entsprechenden Pin aus der LED übertragen.

PROBLEM:

Mir ist aufgefallen, dass ich eine Verzögerung erlebe, weil ich (4) 595-ICs zur Steuerung einer 4-stelligen LED verwende. Daher ist meine Genauigkeit weg. Ich könnte meinen Code verkürzen, um die Häufigkeit zu begrenzen, mit der ich die Funktion "delay()" in meinem Code verwende, aber ich hätte immer noch das gleiche Problem.

LÖSUNG:

Mir wurde gesagt, ich solle eine Uhr (555 IC) verwenden. Ich weiß nichts über diesen IC. Gibt es jemanden, der Erfahrungen mit dem 555 IC gemacht hat und mir eine Anleitung geben kann, wenn ich anfange, dies in mein Projekt zu implementieren? Benötige ich einen Arduino Micro-Controller, wenn ich diesen verwende oder nicht? Gibt es andere Vorschläge, wie ich mein Problem beheben kann, das ich angegeben habe?

Ich hänge ein Bild von meinem Layout an, wenn es hilft. Ich hatte 3 der 595 ICs entfernt, als dieses Bild aufgenommen wurde, aber das Bild zeigt deutlich meinen Mikrocontroller, 595 Schieberegister und 4-stellige LED-Anzeige. Ich werde auch meinen Code anhängen, den ich gemacht habe. Es ist sehr generisch, da ich ein Anfänger bin. Wenn also etwas in meinem Code offensichtlich falsch ist, nehmen Sie es mir leicht. Lassen Sie mich jedoch auf jeden Fall wissen, was ich falsch mache und besser machen könnte.

Layout

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

Antworten (2)

Sie sollten wirklich (Timer-)Interrupt-gesteuerte Firmware verwenden, um sicherzustellen, dass Ihre Uhr genau tickt. Softwareverzögerungen führen aufgrund von Schwankungen in Ihrem Programmablauf zu einer allmählichen Drift. Hier ist ein guter Überblick über die Verwendung von Timern auf der Arduino-Plattform. Sie können etwa dem Muster folgen, das im Abschnitt "Blinkende LED mit Timer-Überlaufunterbrechung" beschrieben ist. Der 16-MHz-Kristall des Arduino ist für ein Spielzeuguhrprojekt sehr genau, wenn Sie die Software richtig schreiben.

Diese Art des Schreibens von Software ist "ereignisgesteuert", also müssen Sie sich zuerst darum kümmern. Die Hardware sagt Ihnen, dass etwas passiert ist (in diesem Fall ist eine Sekunde vergangen) und Ihre Software reagiert darauf. Anstatt dass Sie Ihrer Software sagen, dass sie "eine Sekunde warten" soll und dann etwas tun.

Ich habe vor einiger Zeit etwas Ähnliches ausprobiert und mein Arduino Mega hat an einem Tag etwa 1 oder zwei Sekunden abgeschaltet. Nicht schlecht für eine unkalibrierte Uhr.

555 ist die falsche Antwort für diese Anwendung oder jede Anwendung, die ein präzises Timing erfordert.

Eine Antwort ist eine externe RTC mit einem Kristall, aber das ist nicht ideal, da es zusätzliche Hardware und Komplexität erfordert.

Eine bessere Antwort ist, am Ende jeder (genauen) Verzögerung SOFORT die nächste Verzögerung zu starten, DANN die Software auszuführen, um Daten zu verarbeiten und auf das Display zu schreiben. Auf diese Weise ist die Dauer der Verarbeitung unwichtig, solange sie abgeschlossen ist, bevor die nächste Verzögerung abläuft.

Das bedeutet, dass die Software und die Verzögerung parallel ausgeführt werden: Dafür sind die programmierbaren Timer im AVR-Prozessor da. Und hier ist der Link von Vicatcu zur Verwendung von Timern nützlich. es ist der normale Weg, dies genau zu tun.