Ich habe eine 6x6-LED-Matrix mit MOSFETs aufgebaut und möchte diese im Zeilenmultiplexverfahren von einem PIC ansteuern. Das Problem: ich sehe ein deutliches "Nachleuchten", d.h. sobald eine LED aktiv ist, leuchten auch alle übrigen LED in dieser Spalte -- sehr schwach, aber gut sichtbar. Um dem Problem auf die Spur zu kommen, habe ich eine Ansteuerung programmiert, die nur eine Spalte benutzt und bei der eigentlich alle LEDs dunkel sein sollten: 1. Anfangszustand: C0...C0 low (alle Spalten aus) B4..B7, A4..A5 high (alle Zeilen aus) 2. B4 low, B4 high (Spalte 0 kurz ein- und sofort wieder ausschalten) 3. C0 high, 100µs warten, C0 low (Zeile 0) 4. C1 high, 100µs warten, C1 low (Zeile 1) 5. C2 high, 100µs warten, C2 low (Zeile 2) 6. C3 high, 100µs warten, C3 low (Zeile 3) 7. C4 high, 100µs warten, C4 low (Zeile 4) 8. C5 high, 100µs warten, C5 low (Zeile 5) 9. goto 2 Alle LEDs der Spalte 0 leuchten schwach, sogar noch die in Zeile 5. Im Oszilloskop sehe ich, daß in Schritt 2 die Gate-Spanung von QC0 für etwa 500ns auf 0V und dann wieder auf 5V geht. JP2 ist kurzgeschlossen Wie kommt es, daß noch 500µs später die LED in Zeile 5 leuchtet? Hat jemand eine Erklärung dafür?
> 1. Anfangszustand: C0...C0 low (alle Spalten aus) > B4..B7, A4..A5 high (alle Zeilen aus) Du hast ein merkwürdiges Verständnis von Spalten und Zeilen. Du schreibst auch in der Schule vermutlich chinesisch hochkant. Manchmal 47 statt 33 Ohm, alles recht merkwürdig. Aber prinzipell ist deine Schaltung richrig, die MOSGFETs geeignet, das Programm sinnvoll. Der Fehler liegt also woanders, beispielsweise vergessen die Ports auf Ausgang zu schalten, oder doch nicht das zusammengelötet, was dein Schaltplan sagt.
MaWin schrieb: >> 1. Anfangszustand: C0...C0 low (alle Spalten aus) >> B4..B7, A4..A5 high (alle Zeilen aus) > > Du hast ein merkwürdiges Verständnis von Spalten und Zeilen. > Du schreibst auch in der Schule vermutlich chinesisch hochkant. Spalten sind (bei mir) vertikal, Zeilen horizontal. Zumindest wenn man aufrecht vor dem Monitor sitzt und nicht noch im Bett liegt. Was ist daran merkürdig? > Manchmal 47 statt 33 Ohm, alles recht merkwürdig. Die LEDs in Spalte 1 und 5 sind rot, die anderen blau bzw grün. Du hast aber recht, die Widerstände sind "empirisch ermittelt" und mit 6x47Ω würde es wohl genauso funktionieren. Hat aber mit meinem Problem nichts zu tun. > > Aber prinzipell ist deine Schaltung richrig, > die MOSGFETs geeignet, > das Programm sinnvoll. > > Der Fehler liegt also woanders, beispielsweise vergessen die > Ports auf Ausgang zu schalten, oder doch nicht das zusammengelötet, > was dein Schaltplan sagt. Die Schaltung ist komplett aufgebaut. Ich kann (mit der richtigen Multiplexansteuerung) jede LED einzeln ein- und ausschalten, das ist nicht das Problem. Kann es am ungünstigen Layout liegen? Die Leiterbahnen zu den Anoden der LEDs sind schon etwas kompliziert, siehe Bild. Bei Frequenzen im 10kHz-Bereich sollte das aber alles kein Problem sein, oder?
Ohne Dein Programm oder Deine Schaltung genau angesehen zu haben sind mir bislang mindestens 4 Problemursachen beim LED-Multiplex begegnet: 1) Lawinendurchbrüche in den LEDs. Das tritt bei relativ hoher Betriebsspannung für die Matrix auf, und läst sich durch serielle Entkoppeldioden verhindern 2) Restladungen in den Leitungen, welche erst beim nächsten MUX-Zyklus entladen werden und zu unerwünschtem Mitglimmen führen. Abhilfe durch Entladeschaltungen, Entladewiderstände, Austastlücken zwischen den Mux-Zyklen, ggf. Kondensatoren parallel zu den LEDs (kapazitive Spannungsteiler) 3) Überlappungen in den Ansteuerpulsen. Längere Austastlücken einbauen. 4) Restströme bei den Treibern. Kommt normalerweise nur vor bei extrem überdimensionierten Bauelementen oder bei hohen Temperaturen.
> Kann es am ungünstigen Layout liegen?
Nein. (zuerst habe ich die Hälfte der MOSFETs vermisst).
Eigentlich wird so ein kleiner MOSFET vom Ausgang eines uC rasant
umgeladen. Es kann also nur passieren, wenn der uC-Ausgang offen oder
sonstwie falsch angesteuert ist.
Guest schrieb: > Zumindest wenn man aufrecht vor dem Monitor sitzt und nicht noch im > Bett liegt. Hast du den Schaltplan im Liegen im Bett gezeichnet?
Tippgeber schrieb: > Ohne Dein Programm oder Deine Schaltung genau angesehen zu haben sind > mir bislang mindestens 4 Problemursachen beim LED-Multiplex begegnet: > > 1) Lawinendurchbrüche in den LEDs. Das tritt bei relativ hoher > Betriebsspannung für die Matrix auf, und läst sich durch serielle > Entkoppeldioden verhindern Die Schaltung läuft mit 5V > > 2) Restladungen in den Leitungen, welche erst beim nächsten MUX-Zyklus > entladen werden und zu unerwünschtem Mitglimmen führen. Abhilfe durch > Entladeschaltungen, Entladewiderstände, Austastlücken zwischen den > Mux-Zyklen, ggf. Kondensatoren parallel zu den LEDs (kapazitive > Spannungsteiler) Das war auch meine erste Vermutung. Ich würde ja noch verstehen, wenn die LED in Zeile 0 leicht glimmt. Dann sollten aber doch alle Ladungen abgeflossen sein. Trotzdem leuchten auch die LEDS in Zeile 2-5, und zwar genauso stark (bzw schwach) wie Zeile 0. > > 3) Überlappungen in den Ansteuerpulsen. Längere Austastlücken einbauen. Das kann ich definitv ausschließen, siehe Bild. Oben ist Spalte 0 (Gate QC0), unten Zeile 1 (Gate QR1). Zwichen Ausschalten von Spalte 0 und Einschalten von Zeile 1 liegen 100µs. > > 4) Restströme bei den Treibern. Kommt normalerweise nur vor bei extrem > überdimensionierten Bauelementen oder bei hohen Temperaturen.
ich sehe auch keine Fehler, die das Nachleuchten erklären würden. Aber vielleicht können dir folgenden Fragen bei der weiteren Analyse neue Ideen geben: 1) ist die Stärke des Nachleuchtens in jeder Column gleich stark, oder hängt es vom einzelnen Column-Transistor ab? 2) bleibt das Nachleuchten gleich hell, wenn du den Column-Transistor mit Kältespray bearbeitest? 3) siehst du über die 500µs (also über Zeile 1-5 der Matrix) schon eine Abnahme der Helligkeit? Wie siehts aus, wenn du die 100µs in Zeile 3-8 deines Pseudo-Codes durch 1ms oder 10ms ersetzt? (also: wie ist die Zeitkonstante des Nachleuchtens) 4) siehst du mit dem Oszi an den Drains der Transistoren beim Abschalten irgendwelche Überschwinger?
Nachtrag: für das obige Oszillogramm habe ich die Ansteuerung modifiziert, so daß Spalte 0 nicht nur ganz kurz, sondern 100µs lang eingeschaltet ist (damit das Spaltensignal besser sichtbar ist),
Guest schrieb: > Wie kommt es, daß noch 500µs später die LED in Zeile 5 leuchtet? > Hat jemand eine Erklärung dafür? Dein PIC hat nicht die Power das Gate ständig umzuladen. Tippgeber schrieb: > 2) Restladungen in den Leitungen, welche erst beim nächsten MUX-Zyklus > entladen werden und zu unerwünschtem Mitglimmen führen. Abhilfe durch > Entladeschaltungen, Entladewiderstände, Austastlücken zwischen den > Mux-Zyklen, ggf. Kondensatoren parallel zu den LEDs (kapazitive > Spannungsteiler) Halt nen Tastkopf hin dann weißt es. Werden sie dnan dunkel hast so ein Problem. Du misst an der falschen Stelle. Miss mal auf den getriebenen Leitungen nicht auf der Ansteuerungsseite
Achim S. schrieb: > ich sehe auch keine Fehler, die das Nachleuchten erklären würden. Aber > vielleicht können dir folgenden Fragen bei der weiteren Analyse neue > Ideen geben: > > 1) ist die Stärke des Nachleuchtens in jeder Column gleich stark, oder > hängt es vom einzelnen Column-Transistor ab? Der Effekt tritt in allen Spalten gleich stark auf. > 2) bleibt das Nachleuchten gleich hell, wenn du den Column-Transistor > mit Kältespray bearbeitest? Kältespray habe ich momentan nicht zur Hand. Werde ich aber morgen 'mal ausprobieren, falls mir nichts besseres einfällt. > 3) siehst du über die 500µs (also über Zeile 1-5 der Matrix) schon eine > Abnahme der Helligkeit? Wie siehts aus, wenn du die 100µs in Zeile 3-8 > deines Pseudo-Codes durch 1ms oder 10ms ersetzt? (also: wie ist die > Zeitkonstante des Nachleuchtens) Die Zeitkonstante ist ziemlich hoch. Wenn ich den Delay auf 500s verlängere, glimmt es immer noch gut sichtbar, erst ab ab 1.5ms hört es auf. > 4) siehst du mit dem Oszi an den Drains der Transistoren beim Abschalten > irgendwelche Überschwinger? Ja, aber nur schwach (<500mV).
Wie wärs mit schlechtem Sourcepotential, dass dir bei Last (im Schaltvorgang) davon läuft und die anderen Mosfets leicht aufzieht? ZB. durch R8
Ich denke, dass es sich um kapazitive Effekte handelt. Bedenke, dass die LEDs ebenfalls relativ große Kapazitäten sind, und dass die Gateströme nicht nur über die Sources abfließen, sondern auch in die Drains gelangen. Durch die floatenden Spaltentreibern könnten sich dadurch entsprechende Ladungsansammlungen bilden. Leider habe ich keine konkrete Lösung, sondern nur einige Vorschläge: Die Drains der Zeilentransistoren über Pullups mit Vcc verbinden und die Drains der Spaltentransistoren über Pulldowns mit GND verbinden. Dadurch sind die LEDs im Ruhezustand definiert gesperrt und ihre Kapazitäten werden klein gehalten. Die Widerstände sollten möglichst niederohmig sein (220R..1k ?). Die Austastlücken müssen groß genug sein, um vollständige Entladungen der Leitungen zu ermöglichen (Scope). Versuchweise Kondensatoren (100n) parallel zu den LEDs legen. Die Kondensatoren können kleine Ladungspulse aufnehmen und von den LEDs fernhalten. Die Ansteuergeschwindigkeit der MOSFETs durch Gatewiderstände etwas reduzieren (100R...1k ?). Die Muxfrequenz reduzieren auf zB. 113 Hz, so niedrig dass gerade noch kein Flimmern auftritt und Oberwellen der Netzfrequenz vermieden werden.
Ist mit Sicherheit ein Fehler in Deinem Programm. Bei manche PIC sind einige Pins nach dem Reset gar keine IOs, sondern analog Input, dann floaten Deine FETs. Auch solltest Du immer auf das Latchregister schreiben.
Peter Dannegger schrieb: > Ist mit Sicherheit ein Fehler in Deinem Programm. > > Bei manche PIC sind einige Pins nach dem Reset gar keine IOs, sondern > analog Input, dann floaten Deine FETs. Alle 12 Ports sind als output und digital (TRISx bzw ANSELx) konfiguriert. Andernfalls könnte ich die LEDs ja gar nicht kontrolliert ein- und ausschalten. Wie schon geschrieben, die Matrix funktioniert im Prinzip einwandfrei, bis auf das Nachleuchten. > Auch solltest Du immer auf das Latchregister schreiben. Mach ich doch.
Linüx schrieb: > Dein PIC hat nicht die Power das Gate ständig umzuladen. [...] > Du misst an der falschen Stelle. Nö. Er hat mit seiner Messung wahrscheinlich erst einmal deine Vermutung widerlegt. Wenn der PIC wirklich nicht genug Power zum Umladen der Gatekapazität hätte, wäre das im Oszillogramm deutlich durch entsprechend verschliffene Flanken erkennbar. Allerdings hat er nicht gesagt, wo genau er angetastet hat, am µC-Pin oder am Gatepin des FET. Das kann durchaus einen sehr relevanten Unterschied ausmachen.
c-hater schrieb: > ... > Wenn der PIC wirklich nicht genug Power zum Umladen der Gatekapazität > hätte, wäre das im Oszillogramm deutlich durch entsprechend > verschliffene Flanken erkennbar. > > Allerdings hat er nicht gesagt, wo genau er angetastet hat, am µC-Pin > oder am Gatepin des FET. Das kann durchaus einen sehr relevanten > Unterschied ausmachen. Die Messung habe ich direkt an den Gates gemacht. Wie MaWin schon geschrieben hat, die Ausgänge des Controllers sollten genug Strom liefern, um den FET innerhalb einer µs umzuladen. Ich denke, ich habe eine Kapazität in meiner Schaltung und sehe sie nicht. Irgendwo muß die Ladung ja herkommen, die durch LEDs fließt, und der Spaltentransistor ist definitiv gesperrt, siehe Bild.
Guest schrieb: > Ich denke, ich habe eine Kapazität in meiner Schaltung und sehe sie > nicht. Irgendwo muß die Ladung ja herkommen, die durch LEDs fließt, und > der Spaltentransistor ist definitiv gesperrt, siehe Bild. Ich glaube nicht an hinreichende Kapazitäten auf der LED-Seite der FETs. Aber ich würde mich angesichts der wunderhübsch steilen Flanken des Oszilligramms aber keineswegs über hinreichende Kapazitäten auf der Gate-Seite der FETs wundern. Interessant wäre also, mal einfach nur eine einzige LED getaktet zu betreiben, also sie blinken zu lassen, indem die zuständigen Zeilen- und Spaltentreiber gleichzeitig an und aus geschaltet werden. Damit ist erstmal aller Schmutz aus möglicherweise fehlenderhaftem Programm ausgeschlossen, denn so ein Blinkprogramm ist ja nun wirklich sehr überschaubar. Außerdem sind irgendwelche Effekte durch Zeitkonstanten beim Wechsel zwischen Zeilen/Spalten ebenfalls ausgeschlossen. Bei geringer Blinkfrequenz werden nun vermutlich die anderen LEDs dunkel bleiben. Soweit die Vorbereitungen. Jetzt wird es spannend. Nun erhöhst du die Blinkfrequenz auf das mögliche Maximum im MHz-Bereich. Vermutlich werden die anderen LEDs jetzt sehr deutlich mitleuchten. Wenn nicht: Der Fehler liegt in der Software. Wenn ja, weiter so: Jetzt oszillografierst du mal acht Sachen mit der immer gleichen Zeitauflösung, die so sein sollte, daß man gerade zwei Perioden der Waveform sieht: 1) zwischen GATE des aktiven Zeilen-FET und GND 2) zwischen GATE des aktiven Zeilen-FET und VCC 3) zwischen GATE des aktiven Spalten-FET und GND 4) zwischen GATE des aktiven Spalten-FET und VCC Das dient erstmal nur als Referenz zum vergleichenden Betrachten der eigentlich interessanten Oszillogramme, nämlich genau dieselben Messungen, aber jeweils an einem der inaktiven FETs, am besten einem dem jeweils aktiven direkt benachbarten. Es sollte mich sehr wundern, wenn da dann nicht die Ursache des Effektes deutlich zu erkennen sein sollte. Übrigens: Allzu lange solltest du die Messungen besser nicht dauern lassen, wenn du nicht scharf drauf bist, einen neuen PIC kaufen zu müssen...
c-hater schrieb: > Guest schrieb: > ... > Soweit die Vorbereitungen. Jetzt wird es spannend. Nun erhöhst du die > Blinkfrequenz auf das mögliche Maximum im MHz-Bereich. Vermutlich werden > die anderen LEDs jetzt sehr deutlich mitleuchten. Wenn nicht: Der Fehler > liegt in der Software. Wenn ja, weiter so: Mein Programm sieht nun so aus (Initialisierung weggelassen):
1 | Loop: |
2 | bsf LATC, 2 ; Zeile 0 an |
3 | bcf LATB, 4 ; Spalte 0 an |
4 | |
5 | bcf LATC, 2 ; Zeile 0 aus |
6 | bcf LATB, 4 ; Spalte 0 aus |
7 | |
8 | goto Loop |
Damit komme ich auf eine Blinkfrequenz von etwa 1,3MHz (6 Takte bei Fosc=32MHz). Die angesteuerte LED leuchtet, alle anderen sind dunkel. Das Nachleuchten tritt erst dann auf, wenn ich die anderen Zeilen anschalte.
1 | bsf LATC, 2 ; Zeile 0 an |
2 | bcf LATB, 4 ; Spalte 0 an |
3 | |
4 | bcf LATC, 2 ; Zeile 0 aus |
5 | bcf LATB, 4 ; Spalte 0 aus |
irgendwas stimmt da zwischen Kommentar und code nicht. Wenn der andere code genau so falsch ist...
MaWin schrieb: > irgendwas stimmt da zwischen Kommentar und code nicht. > > Wenn der andere code genau so falsch ist... Sorry, hätte ich besser kopiert statt abgetippt. Es sollte natürlich heißen:
1 | Loop:
|
2 | bsf LATC, 2 ; Zeile 0 an |
3 | bcf LATB, 4 ; Spalte 0 an |
4 | |
5 | bcf LATC, 2 ; Zeile 0 aus |
6 | bsf LATB, 4 ; Spalte 0 aus |
7 | goto Loop |
Nach einigem Herumprobieren habe ich einen Weg gefunden, das Nachleuchten zu unterbinden, und zwar je einen Pull-Up-Widerstand an den Drains der Zeilentransistoren. Die Matrix arbeitet jetzt perfekt, so daß ich erst einmal weitermachen kann. Trotzem wüsste ich gerne, was da eigentlich passiert...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.