Das völlig bescheuerte Bordcomputer-Projekt-Teil 7: Mathematik, der Microcontroller denkt nacht

Nun habe ich mittels Reverse Engineering die Funktionsweise des BC verstanden, es wird Zeit einen eigenen zu bauen. Im Microcontroller sind die Bibliotheken für die Displayanzeigen dank meiner Buntstiftzeichnung schon aufgebaut, füllen wir den Rest mit Leben.

Vorüberlegung: Zahlen auf das Display schreiben:

Wir können dreistellige Nummern anzeigen, ich habe mir eine Routine gebastelt, die mittels Modulo-Operation ( 11 % 5, Teilen von 11 durch 5 und Ausgabe des Restes =1) aus einer Zahl bis 999 die Ziffern extrahiert und dann innerhalb von gut 300 Zeilen Code entscheidet, welches LCD-Segment für die Zahl nun angeschaltet wird und welches nicht. Dazu gibt es noch die Möglichkeit, führende Nullen auszublenden und festzusetzen, ob die Zahl ein negatives Vorzeichen erhält (dann wird maximal zweistellig angezeigt, da das LCD nicht genügend Platz bietet ein (-) voranzustellen, ohne die erste Ziffer zu verlieren) sowie ob das Komma angeschaltet werden soll oder nicht. Wir nennen das Schätzchen „set_display_alphanum(unsigned int zahl, char komma_set, char minus_set)“.

Weitere Funktionen sind verantwortlich für das Setzen einer Einheit (L, km, km/h, L/100km usw.), für die Balkenanzeige des Tankfüllstandes in der Mitte  und für das Setzen von roten und grünen Segmenten im Rand des Rundinstrumentes.

Berechnen der Temperaturwerte

Jetzt wird es richtig knifflig, der Microcontroller kann Spannungen messen und Zeitintervalle. Für das Auswerten der Temperaturen und des Tankfüllstandes (alle Sensoren sind veränderliche Widerstände) kommen kleine Messschaltungen zum Einsatz und der Controller berechnet basierend auf einer Geradengleichung wie viel °C wir gerade haben.

Die Geradengleichung muss ich armer Mensch ihm aber verraten, und da fühlt man sich wieder wie in der 10. Klasse bei y=mx+n.

Nun will ich niemanden mit Details quälen, Fakt ist aber, unsere Sensoren sind nicht linear. Wir können daher beispielsweise nicht eine Geradengleichung für den gesamten Motortemperaturbereich nehmen:

Tempsensor_Kurve
Beim Motortemperaturfühler oben sollte man sogar 3 Geraden nehmen, für die Bereiche bis 70°C, 70-100°C und >100°C. Die Geradengleichung für das Stück 40-70°C würde dann lauten: U(V)=-0,046233V/°C*t+3,23V
Jetzt noch nach t umstellen und in den Code einfüttern und das für jede Gerade jedes Sensors, welche ich mir vorher berechnet habe.

Berechnung von Fuel Inst und Speed AVG

Wir können Zeiten messen, also Intervalle von wann bis wann an einem Beinchen des Microcontrollers etwas „interessantes“ passiert. Zum Beispiel eine Änderung von 0 auf 1, respektive von 0V auf 3,3V. Das machen wir uns zu Nutze um das Rechtecksignal des Geschwindigkeitsgebers zu „fangen“. Kommt ein Rechteck daher, wird dessen Länge, also wie lange das Signal vorhanden ist, bevor es wieder 0V ist, gemessen. Wir wissen schon, dass mein mechanischer Tacho ein Rechtecksignal ausgibt bei dem die Frequenz *1,5 die Geschwindigkeit in km/h ergibt. Ich werte nur das halbe Signal aus, die Zeit in der die Spannung >0 V ist, also muss ich nur halb so lange messen (das ist gut, der Controller arbeitet mit 12MHz Ausführungstakt, wenn da jetzt eine Zeit über 1s zu messen ist, ist das für den ewig, denn eine Zeiteinheit ist für ihn maximal 2,1*10^-5 s, er darf also für eine Sekunde einmal bis 46875 zählen, und bei 65000 ist beim Wertebereich des Controllers Schluss).

Ich muss Zeiten von ca. 0,8s bis 3,33ms messen, um von 1km/h bis 230km/h zu kommen, das geht schon.

Ähnlich soll dann auch die Messung des Einspritzsignals laufen, beim Motor sollte die Einspritzdauer (also wie lange Sprit durch das Einspritzventil fließt bevor es wieder geschlossen wird) so ungefähr zwischen 1ms und 10ms liegen, hier kommt die Zeitmessung des Controllers also nicht so ins Schwitzen.

Nun haben wir eine aktuelle Geschwindigkeit und eine aktuelle Einspritzzeit, es folgen allerhand Umrechnungen um zum Ziel zu gelangen:

Einspritzzeit(ms)*Einspritzmenge(ml)/Zeitintervall(ms) =ml/Zeitintervall(ms)

Ich messe immer ein Zeitfenster von 100ms. Die Einspritzmenge, die durch die Düse fließen kann, stand in einem Handbuch, so kommen wir auf Milliliter/100ms. Das kann man ein paar Mal machen und dann den Mittelwert auf L/h umrechnen. Fertig ist der Momentanverbrauch im Stand. Dieses Feature war übrigens im originalen BC gar nicht eingebaut.

Nimmt man nun die momentane Geschwindigkeit noch hinzu, kann man errechnen, wie viele Kilometer man in dieser Stunde zurücklegen würde, man gelangt zu einer Angabe in L/100km während der Fahrt. Ich lasse das Display später ab 5km/h von L/h auf L/100km umschalten, das halte ich für sinnvoll.

Die Bildung der Mittelwerte Fuel-AVG und Speed-AVG bringt eine weitere Messgröße ins Spiel, die Fahrzeit. Am einfachsten lässt sich die mittlere Geschwindigkeit aus der gefahrenen Strecke geteilt durch die dafür benötigte Zeit berechnen. Ich muss also ab meinem Startzeitpunkt einen Zähler mitlaufen lassen, der die Fahrzeit in Sekunden aufsummiert. Zudem summiere ich in einem zweiten Zähler ständig die zurückgelegte Strecke auf, ermittelt aus der aktuellen Geschwindigkeit pro Zeiteinheit.

Speed-AVG= Summe Kilometer/ Gesamtzeit

Um alles möglichst genau zu messen wird intern in cm und in s gerechnet, die Zahlen werden riesig, aber es funktioniert. Eine Rücksetzung des Speed AVG durch Drücken des RESET-Tasters löscht dann die beiden Zähler, und es geht von vorn los. Zur Berechnung des mittleren Spritverbrauches werden wieder Zähler benutzt, diesmal wird die Summe der Benzin-Milliliter geteilt durch die Summe zurückgelegter Kilometer benötigt.

Fuel-AVG (L/100km)= Verbrauchtes Benzin/ Gefahrene Kilometer *100

Hier bietet sich die Möglichkeit nachträglich auch zu kontrollieren bzw. zu Eichen, denn der mittlere Spritverbrauch lässt sich auch an der Zapfsäule berechnen, stimmen die Werte nicht überein, stimmt meine Momentanverbrauchsberechnung schon nicht und ich muss die Einspritzmenge anpassen.

Weiter

About the Author

blackengineer

blackengineerHier soll ich nun also Halbwahrheiten über mich verkünden: Es gab einmal den schönen Spruch "Wir sind die geworden, vor denen uns unsere Eltern immer gewarnt haben". Das trifft die Sache allerdings nicht unbedingt im Kern. Aber von vorn: Ich bin durch die Hölle gegangen, was in Fachkreisen auch "Studium der Elektrotechnik" heißt, und nun Ingenieur. Entgegen der landläufigen Meinung bin ich auch in der Lage, Dinge nicht ironisch auszudrücken (siehe letzter Satz), was aber für diesen Blog weitestgehend ignoriert werden darf. Das Studium fand in Dresden statt, wo ich auch meine Freundin Sarah fand, ohne die dieses Stück Internet nie entstanden wär. Ich bin ein vielinteressierter Geist und spiele gern mit Gedanken, Worten und... naja, hin und wieder auch gern Computer ;) Die Leidenschaft für alles, was mit Strom funktioniert, habe ich seit Kindesbeinen, was meinen Eltern sicher noch erschreckend bewusst sein dürfte, und da waren dichte beißende Lötdampfschwaden aus dem Keller, explodierende Kondensatoren vorm Frühstück und leidlich mit Tesafilm isolierte 230V-Stromkabelverbindungen (funktioniert bis heute!) noch harmlose Beispiele (man erinnere sich an den oben angebrachten Spruch) . Man ist mittlerweile professioneller geworden, stolzer Besitzer eines immer weiter wachsenden privaten Elektroniklabors und momentan - in Dublin: Der eigentliche Aufhänger für unseren Blog, wobei ich fürchte, dass dieser weiter wuchern wird, wenn wir im Dezember wieder deutschen Boden unter den Füßen haben. Was mache ich hier? Diese Frage wird ausführlich in den Artikeln dieser Site bearbeitet, nur kurz: Ich bin sowas wie die Geheimwaffe des Trinity Colleges für und gegen alle analogtechnischen Probleme und Entwicklungen. Eine letzte Frage sollte ich hier noch klären: WARUM DIESER NICK? ...Es begab sich, dass ich meine Hose wusch, und dieses kurzbeinige Exemplar schwarzer Baumwolle aus einem szeneeinschlägig bekannten Bekleidungsgeschäft trug diesen Namen. Klasse, dacht' ich mir, das passt zu dir – außerdem find' dich über Google keiner – dieser Nickname, das wird meiner.View all posts by blackengineer →

Leave a Reply