Arduino Auslastung Tacho und Drehzahl messen

OP #7535581
Lesenswert?

Hallo in die Runde,

ich bin in den letzten Zügen mit einem Arduino Nano einen Tacho mit Drehzahlmesser zu bauen. Der Tacho funktioniert tadellos mit dem 2,4 Adafruit TFT. Evtl. erinnert sich noch einer an den Post mit dem Display und zu langem schreiben der Zahlen wegen der Libary ….. ? Das ist gelöst und eine große Zahl am Tacho schreiben dauert nun ca. 20 s und eine kleine 7 ms. Maximal also 47 ms und je nachdem wie schnell man fährt aller zig Sekunden die hunderter Meter als kleine Zahl.

Ein Timer (1ms) ist für das Zählen der ms bis zum nächsten Impuls/ Interrupt in Verwendung. Der zweite Timer derzeit für das Update vom TFT aller 0,2 oder 0,3 s glaub ich.

Nun habe ich 3-4 Windungen mal um das Zündkabel gemacht mit der anliegenden Schaltung. Das Signal sieht wie im Bild aus.

Zur Weiterverarbeitung bin ich mir nicht ganz schlüssig, ob ich mit dem Impuls einen Ausgang high setzen soll, der beim nächsten Impuls auf low geht, so dass ich mit pulseIn() die Zeit messe (Standgas 2000 upm) also 30 ms warten oder ob ich den zweiten Interrupt nutzen sollte und mit der Flanke die Zeit hole und bis zum nächsten Impuls warte und wieder die Zeit hole und damit die Drehzahl berechne.

Bezüglich Prozessorauslastung/ Abarbeitung fehlen mir leider etwas die Erfahrungen und ich wäre für Hilfe/ Ratschläge dankbar.

Danke.

Angehängte Dateien:
#7535616
Lesenswert?

Schalte doch die beiden 4V7 Z-Dioden antiseriell, damit am Ausgang auch wirklich 4,7V erreicht werden.

Bei deiner Z-Diodenschaltung kommen die Impulse nie über 0,7V und die Flussspannung der Gleichrichterdiode wird so kaum erreicht.

Wenn die Gleichrichterdiode eine hohe Sperrspannung aushält, dann genügt auch eine einzige Z-Diode parallel zum Kondensator, weil sowieso nur positive Impulse ausgelesen werden.

Angehängte Dateien:
#7535688
Lesenswert?

Daniel E. schrieb:

Zur Weiterverarbeitung bin ich mir nicht ganz schlüssig, ob ich mit dem Impuls einen Ausgang high setzen soll, der beim nächsten Impuls auf low geht, so dass ich mit pulseIn() die Zeit messe (Standgas 2000 upm) also 30 ms warten oder ob ich den zweiten Interrupt nutzen sollte und mit der Flanke die Zeit hole und bis zum nächsten Impuls warte und wieder die Zeit hole und damit die Drehzahl berechne.

So kompliziert, verstehe ich nicht.

Habe schon ein paar mal Drehzahlmessungen auf Atmegas gemacht: Dazu benutzt man den Timer1 im Input Capture Mode: https://www.mikrocontroller.net/articles/High-Speed_capture_mit_ATmega_Timer

Beim Auslösen des Interrupts wird der 16-Bit Wert einfach in einer Variable abgelegt. Berechnung der Drehzahl erfolgt dann erst beim Refresh des Displays, also erst wenn man den Wert braucht.

Nutzt man dann noch den Overflow-Interrupt von Timer1 so kann man den Timer per Software von 16 auf 24 Bit erweitern. Damit habe ich schon Motordrehzahlen mit einer Genauigkeit von 2U/min und einer Samplingrate von 1000Hz auf einem Nano gemessen. Allerdings ohne Anzeige.

#7535702
Lesenswert?

Daniel E. schrieb:

Nun habe ich 3-4 Windungen mal um das Zündkabel gemacht mit der anliegenden Schaltung. Das Signal sieht wie im Bild aus.

Merkwürdig.

Eigentlich begrenzen die Dioden auf 0.7V, die nachfolgende frisst 0.7V und der Kondensator wird nie entladen, es sollte also eine Dauerspannung bon vielleicht 0.1V anliegen.

Ums nicht abgeschirmte Zündkabel vor dem Verteiler misst man normalerweise durch kapazitive Kopplung die Spannung, nicht den Strom. Es tut dann ein hochohmiger Vorwiderstand und die 'Spule' ist am anderen Ende gar nicht angeschlossen

Ein ordentlich programmierter AVR hat jedenfalls keinerlei Problem, motorentypische Drehzahlen und Tachogeschwindigkeiten zu messen, es wird üblicherweise sogar durch einen Kurbelwellensensor die 60-fache Frequenz gemessen. Man kann durch schlechte Programmierung natürlich auch einen 3GHz Core damit überlasten.

OP #7535784
Lesenswert?

So kompliziert, verstehe ich nicht.

Habe schon ein paar mal Drehzahlmessungen auf Atmegas gemacht: Dazu benutzt man den Timer1 im Input Capture Mode: https://www.mikrocontroller.net/articles/High-Speed_capture_mit_ATmega_Timer

Beim Auslösen des Interrupts wird der 16-Bit Wert einfach in einer Variable abgelegt. Berechnung der Drehzahl erfolgt dann erst beim Refresh des Displays, also erst wenn man den Wert braucht.

Klingt sehr gut, macht meine 1ms zählen überflüssig und bringt bei hohen Geschwindigkeiten noch mehr Genauigkeit, danke für den Hinweis 👍

#7536127
Lesenswert?

Daniel E. schrieb:

Klingt sehr gut, macht meine 1ms zählen überflüssig und bringt bei hohen Geschwindigkeiten noch mehr Genauigkeit

Für Deine Anwendung ist ein Capture-Eingang nicht zwingend notwendig. Schon ein PCINT eines beliebigen Pins und ein 8 Bit Timer bringen genug Auflösung und Genauigkeit für diese niedrigen Frequenzen. Soetwas funktioniert dann schon auf einem ATtiny45. Stichwort: reziproker Frequenzzähler.

OP #7537235
Lesenswert?

Hallo zurück,

so wie ich den Nano verstehe bietet dieser nur einen Capture INPUT IPC bei Pin 12/ 8 mit Timer 1. Damit kann ich ja genau die Drehzahl messen. Für die Radumfangsgeschwindigkeit/Zeit bräuchte ich einen zweiten Capture Eingang, welchen es nicht gibt.

Also entweder mit weiter die ms zählen oder ich müsste bei HIGH Signal einen Timer lesen und beim nächsten HIGH Signal nochmal und mir die zweit zwischen den Events ausrechen. Liege ich da richtig ?

Danke.

#7537635
Lesenswert?

Daniel E. schrieb:

Du meinst das ? bei HIGH Signal einen Timer lesen und beim nächsten HIGH Signal nochmal und mir die zweit zwischen den Events ausrechen?

Fast. Nicht bei HIGH, sondern bei einer Flanke, die man beim Input Capture einstellen kann. Der Timer läuft dauerhaft durch. Der Input Capture speichert den Zeitpunkt in Hardware, da kann die CPU das relativ entspannt auslesen, speichern und irgendwann berechnen.

OP #7564170
Lesenswert?

Grüße in die Runde, den Timer 1 capture hab ich programmiert 👍 und mit dem Frequenzgenerator läuft es. Das signal geht final auf einen Komparator mit Hysterese, bei 4 V kippt er und Hysterese ist 1 V.

Die damalige Schaltung hat sich als ungünstig erwiesen und ich habe anliegende realisiert. Die 15 V Suppressordiode werde ich gegen 7-9 V Typ final tauschen.

Leider kommt es vor, dass die Spannung gelegentlich sehr lange ins Minus geht und dort verbleibt. Die Aufnahme anbei war mit einer 5.1 V Supressordiode gemacht.

Hat jemand eine Idee und Abhilfe ?

Vielen Dank.

Angehängte Dateien:
#7564281
Lesenswert?

Hallo,

Du solltest mal in der Fahrzeugelektronik suchen! Eingangsstufe in CMOS 4000...11 aufbauen bzw. IMG-1922jpeg ! FF und Tiefpass, sicher kannst Du dann Impulse für die digitale Verarbeitung abgreifen.

Um 1970..75 hat man so gemessen. ELV Elektor Drehzahlmesser mit UAA170/180

#7564357
Lesenswert?

Daniel E. schrieb:

Das signal geht final auf einen Komparator mit Hysterese, bei 4 V kippt er und Hysterese ist 1 V.

Die Eingänge eines ATmega haben schon einen Schmitttrigger mit einer Hysterese von einigen 100 mV. Siehe Datenblatt. Da muß man keine Schaltung verwenden, die nach Übersteuerung in irgendeiner Sättigung verharrt. Zusätzlich kann man die Hysterese per Hardware vergrössern und auch noch eine Totzeit nach Erkennen eines Impulses einfügen.

#7565506
Lesenswert?

Hallo,

Egon

Leider hat sich noch keiner dazu geäußert, warum die Signallinie...

oh doch, man muss sich nur freimachen von diesen fachmännischen Lesebewertungen!!

Die ganze Eingangsstufe ist falsch und unsinnig. Es soll die Spannung auf "15V" begrenzen??! (evtl. 3V3) Was ist das für ein Arduino? der wird gegrillt. Die Diode am Ausgang ist über, wenn so abgesichert wird wie von mir beschrieben. Ein CMOS Gatter hat dies intern schon, evtl. noch eine ESD Absicherung.--jahrelang damals im Betrieb. Achtung: Feuchtigkeit und defekte Kabel sind immer der Tot der Schaltung!

Aber es gibt, wie auch schon von anderen da gelegt, weitaus bessere Kopplungsmöglichkeiten am Fahrzeug bis hin zum Lin- oder Can-Bus.

Gast #7565574
Lesenswert?

Egon schrieb:

Dieser hier, alles mit Masse verbunden.

Hier wird die Spannung auf +15V begrenzt. Das ist für den Mikrocontroller viel zu viel.

Der Eingang des Mikrocontrollers wirkt elektrisch wie ein Kondensator mit ca. 5 pF Kapazität.

Die Diode (oben rechts) leitet positive Spannung zum Mikrocontroller. Damit wir der Kondensator (im Mikrocontroller) geladen.

Um den Eingang wieder zu entladen, brauchst du weitere Bauteile, oder musst das per Software erledigen. Ansonsten bleibt der Eingang Stundenlang auf HIGH.

Negative elektromagnetische Felder werden von der Schaltung erst ab ca. -1,2V durch die beiden Dioden abgeleitet. Der Eingang des Mikrocontroller hat allerdings Schutzdioden, die schon ab 0,6V leiten.

Elektromagnetische Felder müssen nicht zwingend von der Zündleitung kommen, denn sie sind überall in der Luft vorhanden.

Es fehlt eine Strombegrenzung. Du riskiert, mindestens den Mikrocontroller zu zerstören, eventuell auch weitere Bauteile, die damit verbunden sind.

Es macht keinen Sinn, diese Schaltung ohne Mikrocontroller auszumessen. Dann misst du irgendwas, nur nicht das, was später funktionieren soll. Auch solltest du die Eigenschaften deines Messgerätes kennen und berücksichtigen, wie es das Signal beeinflusst. Meine Multimeter würden das Signal wahrscheinlich so stark verändern, dass die Schaltung während der Messung nicht funktioniert.

Ich habe den Eindruck, dass hier ein grundlegendes Verständnis von Stromkreisen fehlt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren