Projektvorstellung: Schaltkulissenbeleuchtung BMW E31

Hemi

Aktives Mitglied
Premium Benutzer
30. Nov. 2008
1.103
19
38
Korntal-Münchingen, Germany
Sprachen
  1. ANSI C
  2. C++
  3. PHP
  4. Java
Hallo zusammen,

hier möchte ich mein aktuelles Projekt vorstellen. Es handelt sich dabei um eine Schaltkulissenbeleuchtung für unsere BMW 8er Fahrer.

Die Schaltkulissenbeleuchtung ist eine Ganganzeige, wo angezeigt wird, welche Fahrstufe eingelegt ist, sprich P, R, N, D, 3, 2, 1. Die originale Anzeige ist sehr aufwendig aufgebaut, mit viel Mechanik und Lichtleiter. Genau diese Mechanik und die Lichtleiter sind das Problem, mit der Zeit wird das Plastik brüchig und die Lichtleiter werden stumm und dunkel. Also ist die Überlegung nahe diese Anzeige gegen eine mit LEDs zu ersetzen. Dazu kommt noch, dass die originale Anzeige bei BMW 80€ + MwSt. kostet.

Am Wahlhebel ist ein Sensor mit vier Ausgängen verbaut. Über diese Ausgänge wird dem Getriebesteuergerät mitgeteilt, welche Fahrstufe eingelegt ist. Die Wertetabelle dieser Ausgänge ist bekannt.

Vor einiger Zeit habe ich dafür schon mal eine Anzeige gebaut, allerdings mit einem 4-zu-16 Decoder. Die war sehr unflexibel, wegen Leuchtstärke und etc. Also, musste eine neue Version her.

Die neue Anzeige muss:

  • die Fahrstufe anzeigen
  • die Leuchtstärke muss über die Leuchtregelung vom Auto regelbar sein
  • aus nur einer Platine bestehen (die alte hatte zwei Platinen)
  • mit beiden Getriebearten umgehen können, sowohl adaptiv als auch "dumm" (Wertetabelle ist unterschiedlich)
  • farblich passen (BMW-Farbe: amber, 617nm)

So ist dann das Projekt entstanden.

Eingänge:
vier Eingänge für die Sensorausgänge
ein Eingang (ADC) für die Spannungsmessung (für die Leuchtstärke)
ein Jumper für die Getriebeartumschaltung

Ausgabe:
sieben LEDs für die Buchstabenbeleuchtung (leuchten alle permanent, die Leuchtstärke regelbar)
sieben LEDs für die Fahrstufenanzeige (es leuchtet nur eine LED, die Leuchtstärke regelbar)

Somit habe ich dann die Hardwareanforderungen:
  • MCU: Atmega644 (klar geht auch kleiner, aber da ich ein BurnIn Socket dafür habe, passt es und ich brauche dann auch kein ISP im fertigen Design)
  • LED-Treiber: TI TLC59116. 16 PWM-Kanäle, bis 120mA pro Kanal, über I²C steuerbar
  • Optokoppler für die Eingänge: 2x LTV826S (zwei dual Optokoppler)
  • ADC über Spannungsteiler
  • Spannungsversorgung: LM1117-5
  • Resetcontroller: MCP130T (evtl.)

Und hier ist die vorläufige Schaltung dazu: klick mich

Platinendesign ist so gut wie abgeschlossen. Der schwerste Teil, das Positionieren der LEDs ist fertig, der Rest ist eher einfach. Die Platine ist eine doppelseitigbestückte Platine. auf der Vorderseite sind die LEDs und Treiber und auf der Rückseite dann die MCU und der Rest.

Die Software:
ADC-Werterfassung: fertig
TLC59116-Ansteuerung: fertig
Mapping ADC-Wert nach TLC59116: fertig
Erfassung Getriebeart: fertig

Die Module zusammenführung: offen.

Hier sieht man die Anzeige (es ist die alte Version mit dem Decoder):

007.jpg


Und ohne die Abdeckung:

005.jpg


Wie man sieht müssen die LEDs genau in den "Fenster" drin sein, sonst wird es hässlich.

Im aktuellen Desgin werde ich für die Buchstaben PLCC2 LEDs nehmen und für die Striche dann die SMT, die LEDs sind von OSRAM.

Hier ist die alte Version im eingebauten Zustand:

016.jpg


So, das Layout poste ich, wenn ich weiter bin. :)

Grüße und danke für's Lesen
Heinrich
 
Hallo zusammen,

das Projekt geht weiter und ich habe auch weiter gemacht.

Wichtig Erkenntnis: Es ist (leider) nicht möglich die gesamte Schaltung auf einer Platine unterzubringen, da kein Platz. Deswegen habe ich die Schaltung erst mal auf zwei Schaltungen aufgeteilt.

Erstmal der Anzeigeteil:

anzeige_sch.png

Wie man sieht absolut unspektakulär, ein paar LEDs, ein LED-Treiber...

Und hier ist dann die Steuerung dafür:

ecu_sch.png

Auch nichts Spezielles. Ein Spannungsteiler für ADC, 2x Doppel- Optokoppler an den Eingängen, eine robuste Spannungsversorgung mit TVS-Diode und ein Reset-Controller.

Dann kommt meine "Lieblingsbeschäftigung", das Routen.

Grüße
Heinrich
 
Gestern habe ich die Platine für die Anzeige bekommen, sieht ganz niedlich aus:

platine.jpg

Man sieht die 14 LEDs.

Und hier ist die Rückseite:

platine_rueckseite.jpg

Hier kommt ein LED-Treiber (TLC59116) hin und sein Widerstand für die Strombegrenzung.

Hier ist die Abdeckung der Schaltkulisse von oben zu sehen:

abdeckung.jpg

und von unten:

abdeckung_hinten.jpg
 
Die Platine ist eingesetzt:

abdeckung_platine.jpg

Und hier ist das Ganze von oben zu sehen:

abdeckung_platine2.jpg

Die Tage kommt noch das restliche Material (LEDs, MCUs, Treiber, ...), dann kann ich mal weiter löten und schauen, wie ich es zum Laufen bringe :)

Grüßle
Heinrich
 
Heute sind die Bauteile gekommen, also habe ich erstmal etwas gelötet.

led_vorne.jpg

led_hinten.jpg

Und hier ist mein QFP-Adapter für ISP und JTAG:

adapter.jpg

Grüße
Heinrich
 
Sodelle,

gestern habe ich noch etwas gewerkelt und den TLC59116 zum Laufen gebracht. Leider ist die Lötstopmaske um ca. 0,1 bis 0,2mm verrutscht sodass die GND-Fläche offen war. Als ich eine der LEDs angelötet habe, habe ich auch eine Lötbrücke erzeugt und somit einen Kurzschluss, was ich natürlich nicht gesehen habe. Aber wow, der 7805 ist ja echt robust, er glüht, schaltet ab aber geht nicht kaputt, nicht übel. Also die LEDs wieder ab, Kontakte säubern und wieder sauber anlöten. Zum Glück habe ich so ein Ding, sodass es kein Problem war die PLCC2 LEDs zu entlöten und sie haben es sogar überlebt. Die Investition hat sich also gelohnt. Leider hat da Q-Print etwas unsauber gearbeitet...

Dann ging es mit I²C und dem TLC59116 weiter. Ich muss sagen, der Chip ist einfach nur top. Hatte am Anfang etwas Schwierigkeiten mit der Initialisierung (Betriebsmodi der LED, ob einfach nur an, über PWM regelbar, PWM + Groupblinking, ...), aber danach war es überhaupt kein Problem die LEDs anzusteuern, einfach PWM-Wert (duty cicle) in den Register des PWM-Kanals schreiben und fertig, top. Und vor allem, man sieht auch den Unterschied zwischen sagen wir mal 240 und 250.

Die LEDs: Die LEDs sind Klasse. Die PLCC2 eignen sich sehr gut für die Flächenbelechtung. Das Lichtkegel ist absolut gleichmäßig, es gibt keine dunklen oder hellen Stellen und der Öffnungswinkel ist auch top, sind 120° und mit 900mcd sind die DInger richtig stark, hatte da etwas Bedenken. Das sind diese hier: klick mich Amber weil BMW diese Farbe hat.

Heute Abend stelle ich 1-2 Bilder ein, hoffentlich sieht man vernünftig die Farbe.

Grüße
Heinrich
 
So, hier sind die versprochenen Bilder.

Alle LEDs sind aus:

leds_aus.jpg

Duty 50% (ADC-Wert 128):

leds_halb.jpg

Duty 100% (ADC-Wert 255):

leds_voll.jpg

In Echt sieht es wesentlich besser aus. :)

Hier ist noch das AVR Studio-Projekt mit den Routenen für I2C und TL59116:

Anhang anzeigen Beleuchtung_644.zip

Grüße
Heinrich
 
Hallo Heinrich!

Ich kann mir gut vorstellen, dass es in der Realität noch besser aussieht.....
allerdings reichen die Bilder schon aus, um einen neidisch zu machen. :cool:

Das ist dir mal wieder wirklich gut gelungen!
Gerade die Profi-Platine macht einiges her.

Schade, dass uns soooo viele Kilometer trennen.....
Deinen 850er hätte ich mir gern mal in natura (und von innen im dunkeln) angesehen. :)


Grüße,
Cassio
 
Hallo Cassio,

danke für die Blumen erstmal :)

Ja, die Platine ist schon sehr schick, den 8er Freunden gefällt es auch sehr gut. Das war auch ein Krampf sie auszumessen, sie passt noch nicht zu 100%, aber das ist ja auch okay, ist eben ein Prototyp. Mir war es wichtig, dass es erstmal richtig funktioniert.

Ich bin wie gesagt vom LED-Controller echt begeistert, absolut unprolematisch das Dingen.

Ich habe nur eine Kleinigkeit und zwar "wackelt" der ADC rum. Das heißt, der ADC-Wert schwankt um ein Bit hin und her, mal ist es 8 und bei der nächsten Messung ist es 9. Dabei mache ich aus einem 10-bit Wert einen 8 Bit Wert (shift um 2 nach rechts). Es ist halt nur so, dass man den Unterschied um 1 deutlich sieht, vor allem, wenn man den an LEDs vorbei schaut, da sieht ma deutlich, wie sie blinken. Wie kann man sowas vermeiden? Ich könnte ja die Differenz zwischen dem alten und dem aktuellen ADC Wert ausrechnen und wenn er größer, sagen wir, 2 ist, dann den Wert setzen, sonst den Wert verwefen, quasi als "Rauschen". Aber, das mag mir nicht so gut gefallen :(

Grüße
Heinrich

PS: Hast Du schon was mit den PCA9635 gemacht? Die sind ja quasi das Gleiche wie TLC59116, sogar die Register sind zum größten Teil identisch.
 
Warum läßt Du den ADC dann nicht gleich als 8-Bit-ADC arbeiten (ADLAR setzen, und nur das ADCH auswerten)?
Ansonsten bildet man einfach Mittelwerte, idealerweise aus 2^x Stützstellen. Am einfachsten, indem man 256 Werte (Bytes) zusammenaddiert (logischerweise in ein Word), und von diesem dann nur das High-Byte verwendet...
 
Warum läßt Du den ADC dann nicht gleich als 8-Bit-ADC arbeiten (ADLAR setzen, und nur das ADCH auswerten)?

Ähm, wird so nicht gehen. Es müssen immer beide Register ausgelesen werden und zwar zuerst der ADCL und dann der ADCH.

Ansonsten bildet man einfach Mittelwerte, idealerweise aus 2^x Stützstellen. Am einfachsten, indem man 256 Werte (Bytes) zusammenaddiert (logischerweise in ein Word), und von diesem dann nur das High-Byte verwendet...

Jupp, gute Idee. Okay, 256 Werte brauche ich jetzt nicht unbedingt, acht reichen auch völlig aus.

Grüße
Heinrich
 
Halle Heinrich,
Ähm, wird so nicht gehen. Es müssen immer beide Register ausgelesen werden und zwar zuerst der ADCL und dann der ADCH.

wenn du nur eine Auflösung von 8 bit benötigst, dann setzt du das Bit ADLAR (ADC Left Adjust Result). Wie von LotadaC beschrieben, musst du dann nur ADCH "lesen".

When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently, if
the result is left adjusted and no more than 8-bit precision is required, it is sufficient to read
ADCH. Otherwise, ADCL must be read first, then ADCH.

Dirk :ciao:
 
Ah, wieder was gelernt, danke schön. Werde es dann heute Abend ins Programm übernehmen.

Grüße
Heinrich
 
PS: Hast Du schon was mit den PCA9635 gemacht?


Hallo Heinrich!

Nein, dazu bin ich noch gar nicht gekommen...... :(
Die liegen hier immer noch in der silbernen Tüte, so wie sie hier angekommen sind. :wink:

Momentan habe ich ein anderes Projekt in Arbeit.....
das ich hier aber leider nicht einstellen "kann".

Wenn das Thema durch ist, dann werde ich mich wieder um meine privaten Dinge kümmern können und dazu gehören auch deine netten LED-IC`s. :D


Grüße,
Cassio
 
So, habe es gerade ausprobiert, es funktioniert absolut problemlos.

Code:
void adc_init (void) {
	
	// AVCC with external cap on aref pin, left adjust result
	ADMUX = (1 << REFS0)|(1 << ADLAR);
	
	// adc enable, prescale 128
	ADCSRA = (1 << ADEN)|(1 << ADPS0)|(1 << ADPS1)|(1 << ADPS2); 
}

uint8_t adc_getValue (uint8_t channel) {
	uint8_t adcValue = 0;
	
	ADMUX |= (channel & 0x07);
	// "single conversion"
	ADCSRA |= (1<<ADSC);

	// wait till conversion is done	
	while (ADCSRA & (1<<ADSC) ) {}
			
	adcValue = ADCH;
	
	return adcValue;
}

uint8_t adc_getValueAvg (uint8_t channel) {
	uint16_t tempValue = 0;
	uint8_t counter = 7, count = 0;
	
	for (count = 0; count <= counter; count++) {
		tempValue += adc_getValue(channel);
	}
	
	tempValue = tempValue/8;
	
	return tempValue;
}

Und zwei neue Bilder gibt es dann auch:

Halbe Leuchtkraft:

abgedeckt_halb.jpg

Volle Leuchtkraft:

abgedeckt_voll.jpg

Die Anzeige-LED (die neben dem Buchstaben) muss einen halben mm nach links und dann passt es perfekt.

Kritik erwünscht, was die Ausleuchtung der Anzeige angeht.

Nun kann ich mich an die Steuerung ranmachen, die Schaltung ist soweit fertig, "nur noch" das Layout.

@Cassio: Soso, Dein geheimes Projekt :) Dann mach mal hinne.

Grüße
Heinrich
 
So, nach einer berufsbedingten Pause geht es nun weiter. Ich habe nun auch den zweiten Teil der Anzeige fertig gestellt, die Steuerung.

Drauf sind:
  • Atmega644PA + Quarz
  • Spannungsversorgung mit LM1117-5.0
  • Schaltung für vier digitale Eingänge
  • Schaltung für den ADC-Eingang
  • Umschaltung der Arbeitsmodi (EGS/AGS)
  • Ausgang zum Anzeigemodul

Die Werte für die Spannungsteiler muss ich nochmal nachrechnen, die sind blödsinnig.

Die Schaltung sieht so aus:

steuerung.png

Fällt jemanden was auf, was suboptimal ist?
 
Hi Heinrich,

Fällt jemanden was auf, was suboptimal ist?

also (meine Meinung / wie ich es machen würde) ...

- für R9 (Reset) würde ich 22k statt 10k nehmen und noch nen 100nF nach GND.
- bei R13/R14 (SCL/SDA) weiß ich nicht ob 10k nicht etwas hochohmig ist. Da würd ich 4k7 nehmen.
- Bei D5 (ADC1) fehlt ein Spannungswert. 5,1V Z-Diode oder auch 4,7V?
- Warum sind D3,4,7,8 mit 4,7V? Wenn es Eingänge für Logikpegel sind, evtl ne 5,1V nehmen?

Sonst ist mir nichts aufgefallen.

Ob man bei Logikeingängen mit 5,1V Z-Diode als Schutz arbeitet oder mit 4,7V ist wohl Geschmackssache.
Mit 5,1V und nem vernünftigen Vorwiderstand sollte auch nichts passieren. Mit 4,7V verringert man das High-Potential in Richtung unerlaubtem Bereich und verschlechtert den Störabstand des Signals. Schwer zu sagen was da besser wäre.

Gruß
Dino
 
Morgen Dino,

ich zitiere Dich mal:

also (meine Meinung / wie ich es machen würde) ...

- für R9 (Reset) würde ich 22k statt 10k nehmen und noch nen 100nF nach GND.

Stimmt, ich hatte davon einen Reset-Controller mit dran hängen, als ich den entsorgt habe, ist der Kerko mit rausgeflogen.

- bei R13/R14 (SCL/SDA) weiß ich nicht ob 10k nicht etwas hochohmig ist. Da würd ich 4k7 nehmen.

Japp, wird gemacht

- Bei D5 (ADC1) fehlt ein Spannungswert. 5,1V Z-Diode oder auch 4,7V?

Es ist ebenfalls eine mit 4,7v.

- Warum sind D3,4,7,8 mit 4,7V? Wenn es Eingänge für Logikpegel sind, evtl ne 5,1V nehmen?

Könnte man letztendlich machen, der Atmega verträgt ja bis zu Vcc + 0,5v an den Pins, die 5,1v Diode geht genau so. Der Atmega erkennt HIGH-Zustand ja bei bereits 0,6*Vcc, also bei 3v. Die 4,7v reicht also auch dicke, letztendlich egal.

Sonst ist mir nichts aufgefallen.

Ob man bei Logikeingängen mit 5,1V Z-Diode als Schutz arbeitet oder mit 4,7V ist wohl Geschmackssache.
Mit 5,1V und nem vernünftigen Vorwiderstand sollte auch nichts passieren. Mit 4,7V verringert man das High-Potential in Richtung unerlaubtem Bereich und verschlechtert den Störabstand des Signals. Schwer zu sagen was da besser wäre.

Gruß
Dino

Jepp, so sehe ich es auch.

Bei dem ADC-Eingang bin ich mir etwas unsicher. Ich komme mit 13,8v rein. Ich muss dann um den Faktor ca 2,8 runter um auf 5v zu kommen. Hier wäre eine 5,1v Z-Diode richtiger, glaube ich. Sonst geht mein ADC nur bis 4,7v. Was zieht der ADC an Strom? Habe es im Datenblatt irgendwie nicht finden können.

Danke & Grüße
Heinrich
 
Hallo Heinrich,
Was zieht der ADC an Strom? Habe es im Datenblatt irgendwie nicht finden können.

der Eingangswiderstand ist >50MOhm (typisch 100MOhm). Schau mal bei Electrical Characteristics / ADC Characteristics.

Die Z-Diode am ADC kann dir dann schon eher die Messung vermasseln.

Dirk :ciao:
 
Hallo Dirk,

wie kann man es sauberer lösen oder die Werte zu versauen?

Ganz ohne Schutz geht es halt auch nicht.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)