Ich versuche, einen Tachometer für mein Auto zu bauen, indem ich die Ausgabe des Geschwindigkeitssensors des Autos verwende. Der Geschwindigkeitssensor gibt eine Sinuswelle aus. Hier ist es auf einem Oszilloskop:
So wie ich es verstehe, muss dieses Signal zwischen 0 und 5 V liegen, damit das Arduino glücklich ist.
Es scheint, dass die Spitze-zu-Spitze dieser Welle ungefähr 8 V beträgt, was bedeutet, dass ich, wenn ich die negative Spannung dieses Signals irgendwie "abhacke", etwas wie 0-4 V übrig lassen sollte, was ich brauche.
Wie gehe ich vor, um dieses Signal vom Arduino zu lesen? Ich möchte die Schaltung aufgrund der rauen (ish) Umgebung, in der sie sitzen wird, einfach halten.
Ich habe einige Leute gesehen, die einfach eine Diode und einen Widerstand vorschlagen, und andere schlagen Operationsverstärker, Schmitt-Trigger und andere Konzepte vor, auf die ich nicht stark bin.
Jede Hilfe ist sehr willkommen!
Es gibt mehrere Möglichkeiten. Mit einem Operationsverstärker und einigen diskreten Komponenten können Sie einen Nulldurchgangsdetektor erhalten, der einen Impuls liefert, dessen Amplitude nicht größer ist als die positive Versorgungsschiene zum Operationsverstärker, der mit einem externen Interrupt oder Pin-Wechsel erkannt werden kann Interrupt auf dem Arduino.
Unten ist ein Beispiel eines Nulldurchgangsdetektors.
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
Wie ich in Ihrem Oszilloskopbild sehe, erstreckt sich Ihr Signal über einen Bereich von ungefähr –4 V bis ungefähr +2,5 V. Das Hauptproblem bei diesem Signal ist nicht sein negativer Teil, sondern die Tatsache, dass die positive Spannung nicht hoch genug wird. Die meisten Arduinos werden mit 5 V betrieben und haben Schmitt-Trigger an ihren digitalen Eingängen. Die Spannungsschwelle für das Pin-Schalten HIGH
liegt typischerweise bei etwa 2,6 V, aber dies ist nur ein typischer Wert. Das einzige, was das Datenblatt garantiert, ist, dass der Pin gelesen wird, HIGH
wenn sein Potenzial mindestens 0,6 V CC beträgt , dh 3 V auf einem 5 V Arduino.
Eine Option wäre die Verwendung eines Arduino mit 3,3 V, wie die 3,3-V-Version des Pro Mini. Damit lesen die digitalen Pins garantiert HIGH
bei 2 V. Das ist aber grenzwertig für dein Signal. Ihr Bild zeigt, dass einige der Schwingungen maximal 2 V erreichen. Daher würde ich diese Option vermeiden.
Die andere Möglichkeit besteht darin, dem Signal einen DC-Offset hinzuzufügen, damit es um V CC /2 = 2,5 V oszilliert. Auf diese Weise haben Sie eine verschobene Sinuswelle, die ungefähr von –0,75 bis +5,75 V reicht. Dann sind Sie garantiert um sowohl die Schwelle zum Lesen zu erreichen LOW
, die nicht niedriger als 0,3 V CC = 1,5 V ist, als auch die Schwelle zum Lesen HIGH
. Ich würde eine Schaltung wie diese verwenden:
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
Der Spannungsteiler erzeugt einen DC-Offset von V CC /2. Der Kondensator auf der linken Seite lässt die AC-Wellenform herein. Zusammen bilden der Kondensator und der Spannungsteiler einen Hochpassfilter mit einer Grenzfrequenz von 1/(πRC). Wenn Sie beispielsweise R = 100 kΩ und C = 1 µF wählen, dann haben Sie eine Grenzfrequenz von 3,18 Hz. Ihr Signal hat etwa 300 Hz, daher sollten Sie in der Lage sein, ein Signal zu messen, das bis zu 100-mal langsamer ist als das abgebildete.
Für den negativen Teil des Signals haben die Arduino-Eingänge Schutzdioden, die sich darum kümmern. Sie müssen nur sicherstellen, dass der Strom durch diese Dioden 1 mA nicht überschreitet. Aus diesem Grund hat das obige Filter einen Strombegrenzungswiderstand nach dem Spannungsteiler. Ein 10-kΩ-Widerstand sorgt dafür, dass Sie den normalen Eingangsspannungsbereich sicher um bis zu 10 V überschreiten können, dh Sie sind sicher, solange die verschobene Sinuswelle zwischen -10 V und +15 V bleibt.
Bearbeiten : Wie aus dem Kommentar von Dmitry Grigoryev hervorgeht, lässt diese Schaltung das Rauschen durch, wenn die Fahrzeuggeschwindigkeit Null ist. Rauschen an einem digitalen Eingang ist oft kein Problem, da es durch die Schmitt-Trigger des Eingangs unterdrückt wird. Ihre Rauschamplitude scheint jedoch ziemlich groß zu sein und ist wahrscheinlich größer als die Hysterese von ~ 0,5 V, die Sie an den Arduino-Eingängen haben. Dann können Sie störende Übergänge erkennen, die als endliche Geschwindigkeit angesehen werden.
In diesem Fall besteht eine einfache Lösung darin, den DC-Offset zu ändern, um ihn von den Übergangsschwellen wegzubewegen. Beispielsweise setzt ein 47-kΩ-Pulldown in Kombination mit einem 100-kΩ-Pullup die DC-Vorspannung auf 1,6 V. Sie können mehr asymmetrische Widerstände verwenden, wenn Sie die DC-Vorspannung noch niedriger machen müssen. Beachten Sie, dass das Ändern der Widerstände auch die Grenzfrequenz ändert. Die 47-kΩ/100-kΩ-Widerstände in Kombination mit einem 1-µF-Kondensator haben eine Grenzfrequenz von etwa 5 Hz.
Angenommen, die Geschwindigkeit ist proportional zur Frequenz und Sie planen, sie durch Zählen der Kanten zu messen, sollte etwas so Einfaches wie ein BJT mit gemeinsamem Emitter gut funktionieren:
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
Die meisten BJTs können problemlos einigen Volt Sperrspannung standhalten, und 2 V positive Spannung reichen aus, um sie in Sättigung zu treiben. Die Tatsache, dass das Signal invertiert wird und das Tastverhältnis nicht 50 % beträgt, sollte Sie nicht daran hindern, die Flanken richtig zu zählen.
Sobald Sie den Schaltplan aus den bisherigen hervorragenden Antworten herausgefunden haben, richten Sie einen Interrupt mit steigender Flanke ein: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
Dadurch können Sie jedes Mal, wenn die Wellenform von negativ nach positiv wechselt, ein bisschen Code ausführen. Ich habe tatsächlich vor einiger Zeit einen Code geschrieben, um dies zu tun, um einige PWM-Sachen zu messen (praktischer 0-5-V-Eingang, keines der Filterprobleme, mit denen Sie es zu tun haben). Ich entschied mich dafür, eine FIFO-Liste der Kreuzungszeitdeltas zu führen, und dann, um die Frequenz zu erhalten, addierte sie und bitverschoben, um sie zu teilen und den Durchschnitt dieser Samples zu erhalten. Das Arduino hat keine Hardware-Division, so dass die Anzahl der Samples diktiert wurde, um die Bitshift-Division durchführen zu können. Ohne Mittelwertbildung fand ich das Signal sehr zittrig.
Edgar Bonnet
Edgar Bonnet
Majenko
FiddyOhm