Forum: Mikrocontroller und Digitale Elektronik ICM7218 und LED dimmen


von Nils W. (derniwi)


Lesenswert?

Hallo,

ich habe an einem Arduino Due einen ICM7218 (über Level-Konverter) 
angeschlossen und im Prinzip läuft alles wie gewünscht.

Jetzt möchte ich die Helligkeit der LEDs noch über den Mikrokontroller 
regeln. Leider bietet der ICM dafür keine direkte Möglichkeit. Das 
Problem ist allerdings, dass ich weder eine gemeinsame Masse noch einen 
gemeinsamen Pluspol an der LED-Anzeige habe (zwei Module 5461BS). Die 
Kathoden werden hier für die Segmente a-g der jeweiligen Anzeige 
verwendet werden, die Anoden dienen zur Auswahl des entsprechenden 
7er-Segments.

Somit entfällt leider auch die Idee, über PWM direkt einen Transistor 
mit Vorwiederstand anzusteuern, der dann die Helligkeit über die Anoden 
steuern würde.

Eine Alternative wäre noch, die Spannung des ICM7218 über einen 
Transistor zu regeln. Hierzu würde ich mal schauen, ob ich mir einen 
Spannungsteiler berechnen kann, der die minimale Betriebsspannung des 
ICM bis +5V regelt. Da ich über den MC leider nur noch freie 
PWM-Anschlüsse habe, muss ich mir hierfür noch einen kleinen DAC 
erstellen, da ich den Stromanschluss des ICM nicht gerne pulsierend 
betreiben möchte.

Oder gibt es bessere Alternativen? Bin jetzt nicht so der 
Elektronik-Crack...

Liebe Grüße
Nils

von Karl H. (kbuchegg)


Lesenswert?

Hast du schon probiert, wie lange der IC braucht um aus einem Shutdown 
die Ausgangsstufe wieder zu befeuern?

von Dieter W. (dds5)


Lesenswert?

Karl Heinz schrieb:
> Hast du schon probiert, wie lange der IC braucht um aus einem Shutdown
> die Ausgangsstufe wieder zu befeuern?

Das könnte ein Problem sein, da nach Datenblatt im shutdown auch der 
interne Multiplex Oszillator abgeschaltet wird.

Eine "wake up from shutdown" Zeit kennt das DB leider nicht.

von Peter D. (peda)


Lesenswert?

Du hättest besser einen MAX7219 nehmen sollen, der hat ein Intensity 
Register.

von Nils W. (derniwi)


Lesenswert?

Hallo,

naja, das mit dem Shutdown scheidet wahrscheinlich aus.

Eine Idee wäre noch die Verwendung von Optokopplern, aber hier habe ich 
noch nicht rausgefunden, ob man den Ausgangswiderstand regeln kann oder 
ob die Dinger eher als reine Schalter fungieren.

Den MAX7219 hatte ich mir auch angeschaut, ich hatte aber die 
LED-7-Segment-Anzeigen schon und die haben eben eine gemeinsame Anode. 
Damit kann der MAX7219 leider nicht umgehen.

OK, die LEDs kosten nicht die Welt, da muss ich mal schauen, was ich 
sonst mache. Allerdings scheint es schon etwas cshwieriger zu sein, 
4-stellige 7-Segment-LEDs zu bekommen, die gemeinsame Kathoden haben und 
preislich noch interessant sind.

Liebe Grüße
Nils

von Peter D. (peda)


Lesenswert?

Nils Winkler schrieb:
> ich hatte aber die
> LED-7-Segment-Anzeigen schon und die haben eben eine gemeinsame Anode.
> Damit kann der MAX7219 leider nicht umgehen.

Doch.
Dem MAX7219 ist es schnurz, er kann beides.
Nur must Du dann in der Software Digits und Segmente vertauschen.
Statt der Digits 1,2,3,... werden dann eben die Segmente A,B,C,.. 
gemultiplext.

von Dieter W. (dds5)


Lesenswert?

Peter Dannegger schrieb:
> Dem MAX7219 ist es schnurz, er kann beides.

Im Prinzip hast Du natürlich Recht, aber dann müssen die (schwächeren) 
Digittreiber den Segmentstrom liefern und die maximale Helligkeit leidet 
darunter ganz ordentlich.

Edit:

War ein Denkfehler!

Die Ströme bleiben ja gleich, nur es leuchten dann halt zur gleichen 
Zeit nicht x Segmente in einem Digit sondern das Segment n in allen 
Digits wo es angezeigt werden soll.

: Bearbeitet durch User
von Nils W. (derniwi)


Lesenswert?

OK. Verstehe. Das wird dann ein wenig aufwendiger, da der ICM ja schon 
mit Ziffern umgehen kann. Ich müsste mir also eine Mapping-Tabelle 
erstellen und berechnen, welche Zahl geschrieben werden muss, um alle 
Zahlen darzustellen...

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Nils Winkler schrieb:
> Ich müsste mir also eine Mapping-Tabelle
> erstellen und berechnen, welche Zahl geschrieben werden muss, um alle
> Zahlen darzustellen...

Das ist ein Einzeiler (mit Tabelle: 2 Zeilen).

Allerdings muß man noch nach Segmenten umsortieren, ist aber auch kein 
Hexenwerk.
Man braucht einen Speicher für die 8 Segmentbytes. Den gibt man nach 
einer neuen Zahl komplett aus.
In "display.h" steht die Anschlußzuordnung der Digits und Segmente.
1
#include <avr/io.h>
2
#include "display.h"
3
4
uint8_t display_ram[8];
5
6
uint8_t numbers[] = { _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, };
7
8
void write_digit( uint8_t digmask, uint8_t val )
9
{
10
  uint8_t i;
11
12
  val = numbers[val];                           // convert to 7-segment
13
14
  for( i = 8; i; i-- ){                         // sort single digit into segment memory
15
    display_ram[i-1] = (display_ram[i-1] | digmask) 
16
                     ^ ((val & 0x80) ? 0 : digmask);
17
    val <<= 1;
18
  }
19
}

von Nils W. (derniwi)


Lesenswert?

Hallo,

ich wollte nochmal eine kurze Rückmeldung geben. Den MAX7219 habe ich 
mittlerweile bekommen und konnte auch das Programm anpassen bzw. bin 
gerade dabei, eine Bibliothek dafür zu erstellen.

Beim Anschließen hatte ich ein paar kleinere Probleme, da der MAX die 
Segmente einer 7-Segment-Anzeige anders definiert hat. Und auch die 
Reihenfolge der Stellen ist etwas anders, aber das alles habe ich soweit 
im Griff.

Jetzt fehlen wir noch die Punkte, aber die kriege ich sicherlich auch 
noch hin. Wenn dann alles fertig ist, kann ich das ja auch mal online 
stellen.

Danke und Gruß
Nils

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.