Go Down

Topic: Impulsdauer / Impulszähler / Frequenzanzeige - Umsetzungsmöglichkeit fehlt. (Read 1 time) previous topic - next topic

Orestos

Hallo Freunde,

ich bin gerade dabei eine Multifunktionsanzeige fürs Auto herzustellen...

Sie folgende Funktionen erfüllen:

- Öltemperatur anzeigen
- Öldruck anzeigen
- Ladelufttemperatur anzeigen
- Ladedruck anzeigen
- Lambdawert anzeigen
- Abgastemperatur anzeigen
- Wassertemperatur anzeigen
- Innenraumtemperatur anzeigen
- Boardspannung anzeigen.

Außerdem (hier liegt der Knackpunkt) möchte ich:

Geschwindigkeit anzeigen UND Verbrauch errechnen. ----- LIKE MPGUINO

Alle anderen Funktionen sind Betriebsbereit, nur hier klemmts.


Mit Geschwindigkeit habe ich weniger das Problem. Hierfür sehe ich mehrere Möglichkeiten - Bloß die Umsetzung klappt nicht so richtig.
Als Signalquelle habe ich das VSS Signal, welches ein Rechtecksignal liefert - aus der Frequenz kann man die Geschwindigkeit ausrechnen bzw. aus Anzahl der Impulse die Entfernung.

So entsprechen bei meinem Fahrzeug 5083 Impulse ~ 1Km  

was wiederrum bedeutet dass bei einer Geschwindigkeit von 250Km/h das VSS Signal eine Frequenz von 352,99Hz hat.
bei 200km/h - 282,39Hz
bei 150km/h - 211,79Hz
bei 100km/h - 141,94Hz
usw.

(werde die These mitm Oszi prüfen.)


daraus ergibt sich
Quote
f * 0,70824 = V
oder
Quote
1/T * 0,70824 = V


Die Geschwindigkeitsanzeige lässt sich somit irgendwie mit pulseIn() und millis() realisieren. Wie genau ist mir noch unklar.



Das größere Problem sehe ich in der Messung der Einspritzzeiten.

Um den Verbrauch möglichst genau zu Berechnen muss die Dauer des Einspritzzyklen aufgezeichnet werden.
(Werde später die Einspritzzeiten einer Tankfüllung messen und kann somit den Kraftstoffverbrauch berechen ->  Zeit * x = Liter )

- Theoretisch mit pulseIn() möglich, nur wenn die Funktion in void loop integriert ist kann man nicht gewährleisten dass genau zu der Einspritzzeit das Program an der Stelle ausgeführt wird. - oder habe ich einen Denkfehler?

- Theoretisch möglich wäre auch die benutzung von attachInterrupt()  - nur gibts hier auch ein Problem. Bei 8000U/min werden ca. 70 Einspritzzyklen/Sec durchgeführt. Der Dutycycle beträgt hierbei bis zu 85%.
  Reicht die verbleibende Zeit um das restliche Programm auszuführen?

Mein anderes Problem ist, wenn ich das Arduino ausschalte möchte ich dass die Daten gespeichert bleiben(Zumindest die Einspritzzeiten) Wie und wohin speichere ich sie? externes i2c eeprom?


Ich erwäge momentan ob ich für die Aufzeichnung der Einspritzzeiten nicht von einem separaten Arduino ausführen lasse, der außerdem nichts anderes macht und sie dann über i2c an das "Hauptarduino" übertrage.



Vieles ist mir gerade beim schreiben und Biertrinken klar geworden :-) ganz schlüssig bzgl. der Ausführung bin ich dennoch nicht.



Was haltet ihr davon? Habt ihr Vorschläge oder Anregungen?

Beste Grüße und vielen Dank im Vorraus.



 


michael_x

pulseIn geht nicht, weil das hängt bis die erwartete Flanke gekommen ist.

Ich würde Interrupts nehmen. 70 Pulse / sec ist zwar kein Problem, aber mit einer Interrupt-Routine geht am sichersten nichts verloren.
Den anderen Interrupt kannst du für die Geschwindigkeit nehmen.

Die Interrupt-Routinen sammeln nur und sind so sehr schnell.
Die loop() ist dadurch sehr unkritisch, kann lange brauchen wie sie will, und verarbeitet die Pulse seit dem letzten Mal.


Zum Speichern der aufsummierten Zähler (Strecke / Einspritzdauer) würde ich z.B. den RAM einer RTC nehmen. Für die nächste Erweiterung ( Logging ) brauchst du die Uhr sowieso ;) 

uwefed

@Orestos Du schreibst nicht, ob dein Fahrzeug ein Diesel oder ein Benziner ist.
Ist es nicht einfacher diese Daten vom CAN-Bus zu holen?

Grüße Uwe

Orestos

es ist ein Benziner, kein Motorcanbus.
Man könnte die Daten aber aus OBD holen.

Das VSS-Signal und Injektorsignal habe ich aber bereits am Radiostecker. Muss sie nur abgreifen.

Orestos

ist ein möglich in einem Interrupt mit millis() zu arbeiten? Meinte irgendwo zu lesen dass man es nicht machen sollte.

Wie könnte ich die Zeit eines Interrupts sonst "stoppen"?

nehmen wir an ich belege 2 Interrupt Pins mit dem selben signal (hab eh ein Mega) und mach folgendes:

Quote

void setup() {
volantine unsigned long startP=0;
volantine unsigned long endP=0;
volantine unsigned long lasttime=0;
volantine unsigned long time=0;

double liter;

attachInterrupt(0, startPulse, RISING);
attachInterrupt(1, endPulse, FALLING);
}


void loop () {

liter=time/1000/60*.44;           //millis -> min * 0.44 da die Einspritzdüsen 440cc/min liefern.



}

void startPulse () {

startP = millis();

}

void endPulse (){

endP = millis();
lasttime = endP - startP;
time= time + lasttime;
}







würde es funktionieren?

für Geschwindigkeit/Entfernung das selbe Prinzip? Wobei da 1 interrupt Pin reichen würde. Muss nur die Zeit von Flanke bis Flanke wissen.

Go Up