Forum: Mikrocontroller und Digitale Elektronik LED Ansteuerung mit Atmel AVR


von Andre Wippich (Gast)


Lesenswert?

Hi.

Das soll nur ne kurze Frage sein:

Kann ich eine LED wie folgt mit einem Atmel Mikrocontroller (ATMega16)
betreiben?

Pin1 ---- Vorwiderstand --- LED --- Pin2

Ich möchte mir nämlich eine LED-Matrix bauen - die LEDs der Matrix
werden schnell nacheinander, aber nie gleichzeitig angesteuert - es
fliessen also immer nur 20mA. Da ich dann Zeilen und Spalten getrennt
ansteuerun muss, komm ich um die zwei Pin Geschichte nicht herum und
hatte es mir bisher so überlegt (dargestellt für jeweils eine LED):

+5V --- HEXFET(Gate an Pin1) ---- Vowiderstand --- LED --- Pin2

Aber da die Pins der Atmel-MController-Serie alle 20mA schaffen, dürfte
das doch so wie oben (ohne FET) gehen, oder? Ich habe mal gehört, dass
man den Strom in den Controller reinfließen lassen soll (Controller
stellt Masse zur Verfügung), allerdings weiß aber nicht mehr warum...

Gruß, André

von Hubert.G (Gast)


Lesenswert?

Ein Port kann zwar theoretisch 20mA, allerdings ist der max. Gesamtstrom
des µC begrenzt. Wie hoch steht im Datenblatt.
Bei deiner zweiten Variante musst du überlegen ob der Hexfet genügend
Gatespannung hat um durchzuschalten.

von Andre Wippich (Gast)


Lesenswert?

Also die Absolute Maximal Ratings sprechen von 200mA. Ok, von der Grenze
sollte man sich natürlich fernhalten, aber mit meinen 20mA (LED) + 15mA
(Mikrocontroller) bin ich davon ja weit entfernt...

Der Hexfet ist dafür ausgelegt mit 5V am Gate betrieben zu werden
(daher liebe ich diese Teile g). Der macht meines Erachtens dann auch
ausreichend weit auf. Allerdings nimmt jeder FET auch Platz weg und das
würde ich gerne vermeiden, indem ich die LEDs direkt an die
Mikrocontroller-Pins lege.

von Andre Wippich (Gast)


Lesenswert?

Noch eine weitere intersannte Frage in Bezug auf die Belastbarkeit des
Mikrocontrollers (200mA max.) wäre die Stromaufnahme in Variante a)
(ohne FET).

Wenn ein Pin 5V, der andere 0V liefert und die LED mit Widerstand
dazwischenhängt... dann dürfte das für den MC doch nur eine Belastung
von 20mA bedeuten obwohl zwei Pins im Spiel sind, oder?

von TravelRec. (Gast)


Lesenswert?

Das Problem ist, Daß Du Deine Anzeige im Zeitmultiplexbetrieb fahren
willst, also leuchten die LEDs nur für ein bestimmtes Tastverhältnis
(z.B. 1/16). Demzufolge mußt Du einen vielfach höheren Strom halt
kurzzeitig nacheinander durch die LEDs jagen, um einen adäquaten
Lichtpegel zu bekommen. Mit 20 mA kommst Du da nicht weit, 200mA sind
da schon realistischer, aber das kommt auf den Wirkungsgrad Deiner LEDs
an.

von Andre Wippich (Gast)


Lesenswert?

Ich probiers erstmal mit 20mA. Mein erstes Ziel ist einfach nur ein
Punkt oder eine Schlange aus 3-4 Punkten die sich zufällig über die
10x10 Matrix bewegt (nettes Dekoobjekt g). Bei 3 LEDs dürfte das mit
dem Verhältnis noch hinhauen und ich kill mir nicht die LEDs wenn ich
beim Testen mal versehentlich Standbild mache :-) Notfalls ist es
erstmal nur ein Punkt der wandert :-]

Wenn ich dann später zu Schrift und Bildausgabe übergehen will, pack
ich mir 20 HEXFETs um die Matrix. Grund warum ich das noch nicht mache:
Habe nur 10 P-Channel HEXFETs bestellt und Reichelt hat die geradezu
unnatürlich schnell verschickt :-( Konnte heute nix mehr dran ändern
(bräuchte noch 10 N-Channel Hexfets)... Aber da ich eh ab und zu da
bestelle, kann ich das bei der nächsten Bestellung mitordern. Lasse im
Rahmen der Matrix schonmal Platz dafür :-)

von lalala (Gast)


Lesenswert?

KackNOOB

von Andre Wippich (Gast)


Lesenswert?

Donnerwetter bin ich jetzt beeindruckt!

von lalala (Gast)


Lesenswert?

geh ins bett, mach ich jez och! vielleicht morgen(später) mehr!!
N8 auch

von Winfried (Gast)


Lesenswert?

Denk dran, dass die Spannung stark zusammenbricht, wenn du aus einem Pin
20 mA ziehen willst. Gerade der High-Treiber ist nicht stark belastbar.
Schau mal ins Datenblatt, da sind Diagramme drin.

Beim ATtiny12 sind es dann unter 1 V High-Pegel bei 20 mA und 5 V. Der
Low-Treiber kann dagegen problemlos 20 mA, sind dann noch unter 0.5 V.

Beim ATMega16 sieht das viel besser aus, da gehen 20 mA, man muss wohl
aber auch mit 1V Verlust etwa rechnen.

von Ande Wippich (Gast)


Lesenswert?

Ah, das war der Grund warum man den Strom quasi reinfließen lassen
sollte. Ich danke Dir  - jetzt weiß ich wieder ein wenig mehr!

Ich denke ich baue die Schaltung doch gleich komplett mit FETs auf.
Dann  brauche ich mir um den Mikrocontroller keine Sorgen zu machen
(g) und ich kann die Matrix gleich zeilenweise ansteuern.

____________________
http://www.dark-sun.de

von TravelRec. (Gast)


Lesenswert?

Mach dann aber ´ne gute Spannungsstabilisierung vor die LEDs und nimm
passende Vorwiderstände, damit Du immer schön gleichmäßige Helligkeiten
bekommst, egal wie hoch die Auslastung ist. Statt der N-Kanal-Fets
kannst Du auch einen ULN2803 oder mehrere nehmen, die dann nach Masse
schalten, zu den Anoden verschaltest Du dann über o.g. Vorwiderstände
die p-Kanal Fets (bipolare pnp-Transen reichen dafür auch). Übrigens
macht es Sinn, direkt vor und nach dem Wechsel der LED-Spalten ein
kurze Dunkeltastung der Zeilen durchzuführen, damit verhindert man
Geistersegmente, die sonst schwach und immer herumglimmen. Also
Portausgabe für Zeilen, Zeitintervall verstreichen lassen, Port aus,
2-3x NOP (oder auch kurzes Delay), Spalte weiterschalten, 2-3x NOP,
nächste Portausgabe...

von Andre Wippich (Gast)


Lesenswert?

Danke für die guten Tips! So in etwa hatte ich mir das auch gedacht.

Ein Transistor zieht alle Kathoden einer Zeile auf Masse und dann kann
ich über die Spalten-FETs die einzelnen LED-Anoden ansteuern, wobei
jeweils zwischen Spalten FET und den Anoden der Widerstand hängt.
Bipolare Transistoren sind mir nich so geheuer - ich mag alles, was
(einigermaßen) digital funktioniert g

Die Vorwiderstände lege ich zunächst auf 20mA aus und erhöhe den Strom
dann später, falls die Ansteuerung zu niedrig wird.

Das mit den Dunkelpausen werde ich auch auf jeden Fall machen. Das
klingt sinnvoll. Muss auch noch nach schauen, wie schnell die FETs
überhaupt geschaltet werden dürfen. Für den Mikrocontroller hatte ich 4
MHz im Sinn, weil da noch nen Quarz übrig habe.

Als Spannungsversorgung hatte ich an einen 7805 mit jeweils 220 bis
470µF Elkos (mal sehen was hier noch so rumfliegt) davor und dahinter
gedacht. Das dürfte eigentlich ausreichen um schnell auf alle
Laständerungen zu reagieren.

von TravelRec. (Gast)


Lesenswert?

Jo, klingt gut, sach mal, wenn´s blinkert ;-)!

von André Wippich (Gast)


Angehängte Dateien:

Lesenswert?

So, kann endlich Erfolg melden :-)

Zum Blinken habe ich es schon vor einer Weile gebracht, aber jetzt
blinkt es auch so wie ich es haben möchte - sprich die Programmierung
hat auch wieder ordentlich Zeit gekostet. Und ich war zwischendurch des
Öfteren recht faul...

Ich habe mal den Schaltplan angehängt - vielleicht hilft er ja dem
einen oder anderen bei seinen Projekten weiter. Wie zu sehen ist, habe
ich für die LEDs als Vorwiderstand jeweils 100 Ohm eingesetzt, die LEDs
also nicht stark übersteuert (30mA). Das war auch gut so, da beim
Programmieren es ab und zu passiert ist, dass die Matrix
stehengeblieben ist und die LEDs dann dauerhaft durchgesteuert wurden.
Hätte ich einen hohen LED Strom genommen (100mA) wäre mir die Matrix
zig mal den Bach runtergegangen ;-) Und glaubt mir, 121 LEDs einlöten
hat schon keinen Spaß gemacht - da war ich nicht gerade scharf drauf
auch noch LEDs austauschen zu müssen...

Die LEDs sind stinknormale rote LEDs. Im Nachhinein wäre es sinnvoller
gewesen ultrahelle LEDs zu nehmen, aber solange es einigermaßen dunkel
im Raum ist (so gegen Dämmerung) kann man alles super erkennen.

Den FET-Gate-Ladestrom habe ich durch jeweils einen 250 Ohm Widerstand
begrenzt, damit der µC nicht zu hohe Ströme beim Schalten liefern muss.
Ich denke aber 100 Ohm hätten es auch getan.

Ach ja, ein wenig Kabel (als Antenne) an nen ADC-Pin eignet sich recht
gut um ein geeignetes seed für die rand()-Funktion zu erzeugen. Einfach
die ADC-Spannung umwandeln lassen und man bekommt herrlich zufälligen
Quatsch raus. Zumindest erscheint es mir zufällig genug - meine
Ansprüche sind da ausreichend klein, so dass ich da nicht noch die
statistische Gleichverteilung untersuchen muss. Ich lese beim
Einchalten der Matrix einmalig den Pin ein und übergeb den Wert dann
als seed an die Random-Funktion von WinAVR. Alle Zufallszahlen während
des Programmablaufs lasse ich mir dann mittels rand() erzeugen.

Ich hab mir jetzt die LED-Matrix wie eine Art lebendiges Bild
aufgehängt und es spielt jetzt in zufälliger Reihenfolge 24
verschiedene Visualisierungen ab (Lachendes Smiley, sich drehender
Rotor, zufälliger Würfelwurf (1-6), ...). Sieht spitze aus und hat
nicht jeder!

Danke nochmal an alle im Forum die mir bei meiner Matrix (direkt oder
indirekt) geholfen haben!

____________________
http://www.dark-sun.de

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.