PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Idee für Ansteuerung "mehrerer" 7-Seg.-Displays?



Jaecko
27.01.2008, 14:27
Moin.

Für ein geplantes Projekt müsste ich so geschätzt 60 einzelne 7-Segment-Anzeigen mit Daten füttern können.

Der bisherige Plan sieht die Beschaltung wiefolgt vor:
Jede Anzeige bekommt einen 4511 zur Auswertung; alle Eingänge (A-D) der 4511 sind miteinander verbunden.
2 ATMega32 schalten - je nach per I2C erhaltenem Befehl - einen der 4511 auf Enable, so dass dieser die BCD-Daten auf das Display legen kann.
(Die BCD-Daten kommen von einem ATmega8, der die anzuzeigenden Daten aufbereitet)
Vorteil: Kein Flimmern der Segmente durch Ansteuerung über 4511.
Durch "Haltefunktion" der 4511 müssen die Daten nur dann gesendet werden, wenn sie aktualisiert werden müssen.
Nachteil: Nen Haufen 4511 benötigt...

Eine Direktansteuerung der Segmente per AVR möcht ich nicht machen, da die Anzahl der Segmente zu gross ist, um ein "flimmerfreies" Bild hinzukriegen und gleichzeitig noch genug Rechenzeit zu haben.

Hat jemand noch ne bessere Idee, wie man die Ansteuerung evtl "vereinfachen" könnte?

mfG

PicNick
27.01.2008, 14:55
Ich selbst würde bei 60 Anzeigen eher versuchen, das wie eine DotMatrix aufzuziehen. d.h. alle gleichnamigen segment sind verbunden und sind eine ROW, die Kathoden sind die COLUMNS.
Für die Rows braucht man da recht kräftige Treiber ( max 60 * ~20 mA) mit off. Emitter.
Die KAthoden hängen auf Schieberegister (60 /8 = 8 Stk), da wird weniger verlangt.

Anderes Argument: bei 60 Anzeigen + 4511, die ja idente Schaltungen sind, kannst du die Platinen wegen der grossen Anzahl recht günstig machen lassen.

Tja.

Jaecko
27.01.2008, 15:33
Die Kathoden-Schaltung mit Schieberegistern müsste so wie im Anhang funktionieren. Gezeichnet sind da mal nur 3; Getaktet werden alle, nur eines kriegt jedoch eine 1 am Anfang. Wird die 1 beim letzten rausgeschoben, kriegt das nächste eine 1.

(Beim Schreiben ist mir grad aufgefallen, dass man die 1 fürs nächste ja von der letzten Stelle des vorherigen Registers abfragen kann)

Fehlt jetzt nur noch ein entsprechender Treiber für die Rows. Was wäre denn da was brauchbares? Sollten ja dann 1-1,5A sein.

Edit: Anhang aus Platzgründen entfernt

PicNick
27.01.2008, 15:41
Nein, die Schieberegister müßten in SERIE hängen, d.h. die mußt ALLE 60 Bits reinschien, dann Output enablen UND die passende ROW aufdrehen.

Treiber sollten schon feste Knöpfe sein, vielleicht 2N 3055 , die nehm ich gerne.

Jaecko
27.01.2008, 16:26
Das mit in Serie hängen versteh ich grad nicht ganz.
Bisher war geplant, dass ich einfach eine 1 reinschieb und die mit jedem Takt eins weiterschieb (damit die Kathoden eben der Reihe nach durchschalte).

Du meinst also, ich sollte das Bitmuster, das ich brauche, komplett reinschieben (z.B. 000000000000010000000000), dann alle Enable?
Nur die Frage, ob damit dann nicht zu viel Zeit "draufgeht"...

PicNick
27.01.2008, 16:49
Ich hab eine Dot-Matrix angesteuert mit 19 x 5*7.
Da hab ich erst alle 95 Kathoden seriell auf 0 oder 1 gesetzt.
Dann die entsprechende ROW aufgedreht und alle Kathoden enabled
Während des reinschiebens bleibt ja das Display stehen und hat Zeit, zu leuchten. Das ging ganz gut.
Das "reinschieben" geht ja mit einigen hundert kHz, das ist mit dem SPI kein Problem.

Jaecko
27.01.2008, 17:16
achja, der Enable aktualisiert ja nur die Ausgänge mit den neuen Daten. Hatte da den Denkfehler, dass Enable die Ausgänge abschaltet.

Und ich glaub jetzt hab ich auch dein Vorgehen verstanden: Du baust also zuerst alle Segmente A auf, dann B, dann C...; mit der seriellen Fütterung wird bestimmt, bei welcher Ziffer das Segment leuchten soll.
Dann macht das auch Sinn, da das tatsächlich schneller geht als meine Version (die Ziffern der Reihe nach aufbauen, also für die 1: SegB + SegC an, Ziffern-Kathoe kurz an, Segmente für Ziffer 2 vorbereiten, Ziffer 2 kurz an, etc...)

Besserwessi
27.01.2008, 17:30
Als Treiber für die Segmente würde ich je einen PNP darlington Transistor (z.B. BDW94) vorschlagen. Wenn die Matrix 7x60 Aufgebaut wird, müßten nacheinander die Segmente Durchlaufen werden. Da kommt einiges an Bits umsortieren auf den AVR zu. Auch der Speicherbedarf (RAM) wird nicht ohne sein: mindestens wohl 120 Bytes. Das wird gehen, ist aber nicht ohne.

Als Alternative könnte man jeweils 6 Stellen zusammenfassen und statt der Schieberegister 10 mal den 4511 als Speicher und Segmentteiber nehmen. Wenn man mit der Treiberleistung des 4511 Auskommt, könnte das einfacher werdem. Statt einer 7(8)x 60 Martix hätte man dann 70(80)x6. Die Dezimalpunkte (in Klammern bei der Matirx) kämen aber irgendwie noch dazu, wenn man die denn braucht.
Hängt auch davon ab, wie die LED Stellen Angeordnet sind. Bei so viel Teilen kann es sich lohnen mehr für die ICs auszugben und dafür eine einfachere Leiterplatte zu haben.

Jaecko
28.01.2008, 10:02
Die Dezimalpunkte werden nicht einzeln angesteuert; die werden je nach Position dauerhaft aktiviert.

Wobei ich jetzt vor dem nächsten Problem steh: Vorwiderstände... die brauch ich da ja fast, da die LEDs sonst nicht sehr lange halten werden... Nur wären das 420 Widerstände; etwas viel...
Mehrere Segmente zusammenfassen wird auch schwierig, da die Segmente dann ungleichmässig hell leuchten...

elayne
28.01.2008, 13:01
Versuchs doch mit Wiederstandsnetzwerken, wird vielleich einfacher.

Jaecko
28.01.2008, 13:19
ha stimmt... die Dinger hätt ich jetzt ganz übersehen.
Gibts Widerstände nicht auch irgendwo in IC-Form? Also dass man z.B. 8 Stück in nem DIP-16 Gehäuse hat?

EDIT 2: Aus Ressourcengründen werden statt gem. Kathoden gem.Anoden verwendet; müsste ja genau so gehen.

EDIT: Mir fällt grad auf, dass die Widerstandsnetzwerke nicht gehen, da die alle einen gemeinsamen Punkt haben. Da hab ich dann Probleme mit der Verschaltung:

+5V
=> "kleiner" PNP-Transistor (aktiviert jeweilige Ziffer(n), gesteuert durch Schieberegister) (Columns)
=> Anode d. Segmentanzeige
=> Kathode d. Segmentanzeige
=> Alle Segmente (A-G) zu jeweils einem der 7 Leistungstransistoren (NPN) (Rows)
=> GND

Da müssten also noch irgendwo die Widerstände rein.
Wäre es keine gemeinsame Anode sondern getrennt, könnte man das Widerstandsnetzwerk dort verbauen.

elayne
28.01.2008, 16:05
Stimmt, den Aspekt mit dem gemeinsamen Punkt im Netzwerk habe ich nicht bedacht. Ich kenne mich nicht besonders in 7 Segment Anzeigen aus, aber ist es nicht möglich einen Leistungswiederstand hinter die gemeinsame Anode zu schalten? Würde den Strom dann doch für jedes Segment begrenzen. Kann aber sein das ich falsch liege und einen Faktor nicht bedacht habe.

Gruß
elayne

Besserwessi
28.01.2008, 16:27
Wenn man die LEDs gemultiplexed ansteuert, braucht man nur für je 6 bis 10 LEDs einen Widerstand. Das macht dann 42 bis 70 Widerstände, halt für jeden Treiberausgangs einen.
Es gibt mehrere Widerstände zusammen, es ist aber schwirig da das richtige zu finden. Als Vorwidederstände hat man auch kaum Vorteile, da man ja genausoviele Anschlüsse braucht. SMD Widerstände lassen sich mit etwas Übung wirklich gut löten. Schon wegen der gesparten Löcher lohnt sich das im Vergleich zu bedrahteten.

Jaecko
28.01.2008, 16:51
Anscheinend hat sich wieder mal ein Denkfehler eingeschlichen: Problem mit dem Widerstand war, dass ich nicht für jedes Segment einen Widerstand verwenden wollte (420 Stück)... dachte zuerst, einer pro Anzeige reicht nicht, da die Anzeige dann bei einer "1" heller leuchtet als bei einer "8" ,da ja einmal nur 2, und einmal alle 7 Segmente leuchten; da aber eh immer nur 1 Segment leuchtet, ist das egal.

the_Ghost666
29.01.2008, 11:49
Wenn du die Mittel hast (finanziell), dann könnte ich dir den MAX 7221 oder 7219 von Maxim-IC empfehlen (bekommst du auch als Sample). Das ist ein Controller mit integriertem Treiber für eine LED-Matrix aus 64 LEDs oder 8 7-Segmentanzeigen. Du kannst ihn mit nem einfachen, seriellen Protokoll (SPI) ansteuern und mehrere kaskadieren (Daisy-Chain, der DataOut des Vorgängers an den DataIn des Nachfolgers, wie bei einem Schieberegister).
Du brauchst nur einen Widerstand pro 8 7-Segmentanzeigen, der am MAX den Strom bestimmt. Ausserdem kannst du die Helligkeit in Software einstellen und er hat einen Dekodier-Modus, um entweder jede LED einzeln oder die Segmente BCD-Kodiert zu schalten.
Ich habe mir mal ein Board mit 8 Segmenten gebaut, doppelseitig brauchst du keinen einzigen Draht. Ich weiß allerdings nicht, wie du es aufbauen möchtest, ob als Zeile oder eine Art Fläche.