Was ist der richtige Uhrenchip für die Herstellung eines Tachometers mit einem AVR?

Ich baue einen Hot Rod und habe mich entschieden, selbst einen Tacho mit einer 3-stelligen Nixietube-Anzeige zu bauen. Ich plane die Verwendung eines Atmel AVR-Mikrotrolleys (ATmega32, glaube ich). Ich hätte gerne eine CMOS-Uhr, mit der ich die Zeit vergleichen kann, um den Tacho so genau wie möglich zu halten.

  1. Was ist ein guter Uhrenchip?

  2. Wie verkabele ich die Schnittstelle mit dem AVR?

  3. Wie verwende ich es richtig in Software?

Hier ist, was ich bisher habe:

  • Impulsgenerator für die Übertragung (Zeichenwelle, verwendet die selbstversorgte 4069-Rechteckwellenwandlerschaltung, schaltet sie jedoch vom PS und nicht von der Welle ab)
  • Nixie-Röhren und Fassungen
  • Atmel Mikrocontroller und Sockel
  • Treiberchips für Nixie-Röhren
  • Programmierbuchse für AVR

Ich würde gerne eine Bestellung bei Mouser aufgeben und die Hardware so schnell wie möglich gebrückt bekommen, also bin ich für jede Hilfe dankbar.

Antworten (7)

Ihr Tachometer muss die verstrichene Zeit zwischen zwei Impulsen messen und muss die Tageszeit nicht kennen.

Ich würde in Betracht ziehen, den kalibrierten internen Oszillator des AVR zu verwenden. Seine +-1% Abweichung von der Nennfrequenz ist wahrscheinlich genauer als der Umfang der Reifen Ihres Fahrzeugs.

Wenn Ihnen das nicht ausreicht, geben Sie fünfzig Cent mehr für einen Quarzoszillator aus.

Sie erhalten nur eine Abweichung von +/- 1%, wenn Sie das Atmel-Kalibrierungsskript auf dem Chip ausführen, glaube ich
Vielleicht. Ich habe meine eigene Kalibrierungsfirmware geschrieben, nur um herauszufinden, dass der werkseitige OSCCAL nur 1 (nicht 1 %) von der perfekten Kalibrierung abweicht. Und der USART funktionierte gut mit oder ohne Kalibrierung.
Die Werkskalibrierung von Atmel ist nur zu 10 % genau. Sie haben eine Anwendungsnotiz, um dies auf 1% zu erhöhen. PICs OTOH haben eine Werkskalibrierung auf 1 %.

Ich würde mir keine großen Sorgen um die Genauigkeit des internen AVR-Oszillators machen, sie ist gut genug im Vergleich zu dem Reifendruck, der so stark von der Tagestemperatur, dem Asphalt, der aggressiven Fahrweise usw. abhängt, dass er den Umfang in einem ernsthaften Prozentsatz ändern kann . Sobald Sie die Kalibrierung durchführen und das Beste aus dem Gadget herausholen können, ist es in Ordnung. Ein informativer Tacho tut genau das, informiert Sie, wenn er 60 km/h statt 36 km/h anzeigt, ist das kein dramatischer oder traumatischer Unterschied.

Sie können wahrscheinlich den Chips-Oszillator verwenden. Ich habe eine ähnliche Sache mit einem alten PIC gemacht (gut, ich habe ein zweizeiliges LCD-Display verwendet). Der Sensor am Getriebe hat so viele tausend Impulse pro Meile gesendet, was Ihnen ziemlich viel Spielraum zum Kalibrieren für Reifengröße und Übersetzungsverhältnisse usw. gibt. Sie können also eine beliebige Anzahl von Lösungen wählen, von der Messung der Zeit zwischen einzelnen Impulsen bis zur Messung 10 Impulse oder so ähnlich, mit einer Zeitüberschreitung, bei der Sie eindeutig wissen, dass das Auto angehalten hat und die Geschwindigkeit null ist. die Sie für jede Lösung benötigen würden. Wenn Sie die Impulse pro Meile kennen oder herausfinden, ist es nicht schwer, die Zeit zwischen den Impulsen bei unterschiedlichen Geschwindigkeiten zu berechnen und dann die Plus- oder Minusgenauigkeit der Uhr auf dem Mikrocontroller hinzuzufügen, um herauszufinden, was Ihr Geschwindigkeitsfehler ist. Ich vermute, dass die analoge und zeitliche Natur des Sensors und der Drähte selbst so viele Fehler aufweisen werden wie die Uhr, die Sie als Referenz verwenden. (Jitter in den Impulsen mit fester Rate). Sie können auch Slop in den Antriebsstrang werfen, Reifengrößen variieren (beim Abziehen, den Reifen mit der Bremse oder dem Gaspedal belasten usw.), Ihnen geht es wahrscheinlich gut, ich würde mit dem internen Oszillator beginnen.

Mit einem externen oder internen Oszillator könnten Sie einen Timer haben, der jede Sekunde oder so ähnlich zählt und Tacho-Ticks pro Sekunde zählt und die Anzeige (Röhren) basierend darauf aktualisiert (anstatt zwischen jedem Tacho-Tick zu messen). Das größte Problem, das ich hatte, als ich dies tat, war nicht das Erfassen oder Timing der Impulse, ich hatte eine verdammt lange Zeit, die Division durch Zehner zu machen, um die Geschwindigkeit in Dezimalzahlen zu drucken, Hex war einfach, Oktal noch einfacher, aber dezimal, wenn die Der Programmspeicher war ein kByte oder weniger und der Arbeitsspeicher wurde in Bytes gemessen. Ihr avr hat wahrscheinlich mehr Ressourcen als ich damals und einen guten (und erschwinglichen) C-Compiler.

Würde gerne Bilder sehen wenn es funktioniert...

Hier sind einige Tipps:

http://winavr.scienceprog.com/example-avr-projects/measuring-motor-speed-and-display-result-on-lcd.html

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=642909

Wie andere gesagt haben, benötigen Sie keine Echtzeituhr, es sei denn, Sie interessieren sich für Datum und Uhrzeit. Sie müssen nur die Zeit zwischen den Umdrehungen messen.

Danke, ich habe die Links überprüft und ich denke, wir können darauf verzichten. Es gibt einen Tacho auf dem Markt, mit dem Sie zum Kalibrieren auf der Autobahn fahren und für 2-Meilen-Markierungen einmal einen Kalibrierknopf drücken. Dies wird zählen, wie viele Pulse in einer Meile sind, und dann können wir die Geschwindigkeit basierend auf diesen Zahlen berechnen und Speed ​​Buddys zur Bestätigung verwenden. Jetzt brauche ich nur noch eine einfache Transistor- und Widerstandsauswahl und -implementierung, und ich bin bereit zu bestellen.
Ich möchte auch Hochspannungs-Blinker mit Neonröhren haben, also dachte ich, ich würde 2 Widerstände verwenden, um die Blinkerspannung aufzuteilen und diese dann durch einen Transistor zu leiten. Ich habe ein paar mpsa42-Transistoren, von denen ich denke, dass sie funktionieren werden. Danke Ed

Ich würde dem Onboard-RC in einer Automobilanwendung zur Geschwindigkeitsmessung nicht vertrauen. Schauen Sie sich die Spezifikation für Drift über Temperatur an. Mit welchen Temperaturextremen rechnen Sie dort, wo Sie leben oder reisen könnten?

Mit einem einfachen Kristall und zwei Kappen erhalten Sie einen Oszillator, der viel genauer ist, als Sie brauchen.

Ein Resonator würde wahrscheinlich gut funktionieren. Einige haben die Kondensatoren eingebaut. Niedrigere Kosten als Kristalle normalerweise, obwohl ich für Hobbyprojekte denke, dass das Zählen von Cents ein wenig albern ist.

Ich habe gerade ein ähnliches Projekt für einen Freund abgeschlossen, er kaufte einen Golfwagen und wollte darauf einen SpeedOMeter installieren. Es war einfach. Ich bitte ihn, eine Scheibe zu produzieren, die an einem der Vorderreifen befestigt werden würde, Magnete in die Scheibe eingebettet, ein Magnetsensor (eBay). Der Sensor ändert seine logische Ausgabe immer dann, wenn sich ein Magnet seinem Kopf nähert. Er maß den Reifenumfang und gab mir einen ungefähren Wert von 52,8 Zoll, was bedeutet, dass eine Umdrehung pro Sekunde 3 Meilen pro Stunde bedeutet. Auf dieser Grundlage bat ich ihn, 15 kleine Magnete in die Scheibe einzubauen. Wenn ich während 200 ms Impulse vom Sensor erfasse, erhalte ich 3 Zählwerte, also 3 Meilen pro Stunde. Es war einfach. Aber es könnte eine Kalibrierung erforderlich sein, seine Messungen könnten falsch sein, der laufende Reifen könnte einen anderen Umfang haben usw. Keine große Sache. Er würde sich mit zwei blauen 7-Segment-LED-Anzeigen (1,5" groß), um die Geschwindigkeit anzuzeigen. Ich wähle einen einfachen AtMega88 (in der Schublade). Der AtMega könnte das Display direkt ansteuern, es werden keine Transistoren benötigt, wenn der Strom nicht zu hoch ist. Das Schöne ist, dass das blaue große Display zwei LEDs in Reihe unter jedem Segment verwendet, was bei gleichem Einzel-LED-Strom die doppelte Helligkeit hätte. Aber es gab einen Haken, zwei blaue LEDs würden mehr als 5 V benötigen, sie benötigen 6,3 V, um eine schöne Tageslichthelligkeit zu haben. Er kaufte die 7 Segmente in Common Cathode-Version, was die Dinge komplizierter machte. Der AtMega kann nicht mit 6,3 V betrieben werden, daher mussten wir für den AtMega eine virtuelle Masse auf +1,3 VDC erstellen, während die Display-Masse die echten Null Volt sein wird. Die Lösung war einfach, den AtMega mit 6,3 V zu speisen, aber sein ZeroV würde über zwei einfache Siliziumdioden 1N914 oder 1N4148 mit realer Masse verbunden werden. Der AtMega hätte +5 V oder weniger zwischen den VCC- und GND-Pins, und das Display wird mit 6,3 V direkt von den I/O-Port-Pins des AtMega angesteuert. Es hat gut funktioniert. Jetzt Taktsicherung verwenden, um den internen 8-MHz-Oszillator zu verwenden. Schließen Sie den Pulssensor direkt an den T1-Pin (PD5) an und programmieren Sie den Zähler so, dass er ständig zählt, wenn der T1-Pin nach oben geht. Programmierte Counter1 (16 Bits), um ab einem bestimmten Wert zu zählen, und unterbricht, wenn der Zähler Null erreicht, gab es mir alle 200 ms eine Unterbrechung. Lesen Sie in der Interrupt-Routine einfach den T1-Zähler und setzen Sie ihn auf Null. Speichern Sie den gelesenen Wert in 4 Registern und schieben Sie sie nach vorne, um nur die letzten 4 Messwerte in diesen Registern zu behalten. Dann addiere sie alle und dividiere sie durch vier, einfach durch zweimaliges logisches Verschieben nach rechts. Dadurch wurde beispielsweise die Instabilität zwischen dem angezeigten Wert 3 und 4 verringert. Verwenden Sie eine einfache Segmenttabelle, die auf jedem der Doppeldisplays leuchtet, von -0 bis 29 und voilá, suchen Sie einfach die Tabelle anhand des Werts des Durchschnittswerts und legen Sie sie auf die Port-Pins ab, die das 7-Segment-Display ansteuern. Lief wie am Schnürchen. Ah, der Golfwagen fährt mit einer Höchstgeschwindigkeit von 20 Meilen pro Stunde, das ist der Grund, warum die Tabelle nur bis 29 geht. Kalibrierung ging problemlos. Ein einfacher Jumper veranlasst den AVR, den 200-ms-Interrupt zu deaktivieren, die Impulse vom T1-Pin zu zählen, beginnend bei Null, während er den Wagen für genau 22 Fuß fährt, was 264 Zoll entspricht. Wenn der Reifen genau 52,8" im Umfang hat, dreht er genau 5 Umdrehungen, genau 75 Impulse auf dem Sensor. Jetzt kommt Mathematik. Der Zähler 1 läuft alle 200 ms über, wenn er mit einem bestimmten Wert geladen wird, das ist die Teilung von 8 MHz mit 256 Prescaler, was genau ist nummer 31250. Was mache ich nun? Multiplizieren Sie 31250 mit 75 (das ist eine feste Konstante von 2343750 = 0x23C346) und dividieren Sie durch die tatsächlichen Impulse, die während der 22-Fuß-Bewegung gezählt wurden. Da ich nicht bereit war, eine vollständige Verwüstung der 24-Bit-Division zu verursachen, subtrahierte ich einfach den Impulszählerwert von 0x23C346 oft genug, um Null zu erreichen, dies ist kein Berechnungsgeschwindigkeitsrennen, es hat funktioniert. Badabim. Ich muss den neuen Wert in den Überlauf von Zähler 1 laden und habe eine andere Zeitspanne, 200 ms oder andere, in der mich der Überlauf von Zähler 1 unterbricht, um den Wert der Zählwerte von T1-Impulsen während dieser Zeit zu lesen. Einfach. Jetzt muss der Benutzer zum Kalibrieren nur noch einen Jumper einsetzen, die 22 Fuß laufen und den Jumper entfernen. Wenn der Jumper entfernt wird, wird die Berechnung durchgeführt und der neue Zähler1-Wert wird im EEPROM gespeichert. Nun, jedes Mal, wenn es das Gerät einschaltet, Es liest das EEPROM für den Wert für die Überläufe von Zähler 1 und ist bereit zu gehen. Einfach, weniger als 100 Bytes Programmierung in Assembler. Ich liebe diese Sprache. Ihm gefiel die Idee, einen AVR zu verwenden, da er es anfangs mit einfachen Zählern und Timern in reiner TTL-Logik machen wollte. Jetzt möchte er, dass ich den AVR aktualisiere, um die Blinkersteuerung und Timer usw. zu übernehmen.