Hallo,
ich habe mich in der vergangenen Woche eine Schaltung aufgebaut wo vier
7-Segmentanzeigen mittels Multiplexing durch einen ATmega16 angesteuert
werden. Die Schaltung ist der übliche Standard, die Kathoden der
Segmente sind über einem 150 Ohm Widerstand an einen Port angeschlossen.
Ein anderer Port steuert die Transistoren welche wiederum die Anode
schalten. Das Display hat jeweils für ein Digit eine Gemeinsame Anode.
In vielen Beispielschaltungen habe ich gesehen das die Basis der
Transitoren über einen Vorwiederstand angesteuert werden, bei mir wird
dann das Display nicht hellt genug. Also steuere ich die Transitoren
ohne Vorwiederstand an - was bestimmt nicht richtig ist.
Meine eigentliche Frage, bzw. Problem, ist allerdings das je nach der
Anzahl der leuchtenden Segmente die Ziffern unterschiedlich hell
leuchten. Eine 1 (zwei angesteuerte Segmente) leuchtet heller als eine 8
(mit 7 angesteuerten Segmenten). Warum ist das so und wie kann man dies
ändern.
Vielen Dank schon mal im vorraus für einen hilfreichen Betrag.
>Eine 1 (zwei angesteuerte Segmente) leuchtet heller als eine 8>(mit 7 angesteuerten Segmenten). Warum ist das so und wie kann man dies>ändern.
Nimm ein dickeres Netzteil.
Was für Transistoren verwendest du an den Anoden? Ich hoffe doch PNP
oder?
Ansonsten mal Messen ob das Netzteil in der Spannung einbricht wenn
viele Segmente leuchten.
Rolle
Hallo,
als Transistoren verwende ich BC557B, also PNP. Ich glaube nicht, dass
es an der Stromversorgung liegt. Ich habe mittels eines 7805 (max 1 A)
12 Volt auf 5 Volt gebracht. das eigentliche Netzteil schmeisst 12V und
max. 4A.
Hi,
hast du nach dem spannungsregler einen großen elko? Auf schnelle
Lastsprünge wie diese beim Multiplexen entstehen reagieren Linearregler
ohne ausreichend dimensionierten ELko am Ausgang zu Pufferung unter
Umständen etwas träge.
Poste doch mal am besten den Schaltplan dann kann ich vielleicht mehr
dazu sagen.
Rolle
Daran hab ich auch schon gedacht, der Ablauf der Ansteuerung ist wie
folgt:
* alle Digits sind aus
* x-mal in der Sekunde wird ein Interrupt ausgelöst.
* die anzuzeigenden Segmente werden über PORT C angesteuert, bzw. nicht
angesteuert (negative Logik)
* dann wird das 1. Digit über PORT A (also der Trasistor) angesteuert
* es wird eine gewisse Zeit gewartet (nop' s) damit das digit eine zeiti
aufleuchtet
* dann wird das Digit wieder ausgeschaltet
usw. bis alle Digits durchgeschaltet sind. Die Zeit in der das jeweilige
Digit leuchtet müsste also immer gleicht sein.
>t du an den Anoden? Ich hoffe doch PNP oder?
Ich würde lieber NPN nehmen, um die Anoden anzusteuern..
Poste mal einen Schaltplan, dann kann ich dir weiterhelfen.
Aber deine Schaltungsbeschreibung ist zu dürftig..
>* alle Digits sind aus>* x-mal in der Sekunde wird ein Interrupt ausgelöst.>* die anzuzeigenden Segmente werden über PORT C angesteuert, bzw. nicht>angesteuert (negative Logik)>* dann wird das 1. Digit über PORT A (also der Trasistor) angesteuert>* es wird eine gewisse Zeit gewartet (nop' s) damit das digit eine zeiti>aufleuchtet>* dann wird das Digit wieder ausgeschaltet
Alles in EINEM interruptAUFRUF????
Das kann dann ja nicht richtig gehen!!!
Du musst mit JEDEM Interrupt nur EIN digit aufleuchten lassen!
Hier mein Schaltplan, nich besonders schön da auf die schnelle gemacht.
Die Vorwiderstände an der Basis der Transitoren verwende ich derzeit
nicht da sonst die gesamte Anzeige sehr dunkel ist.
Danke
Die Schaltung ist in Ordnung. Evtl sind die 150Ohm etwas viel.
Aber die Basiswiderstande müssen ZWINGEND rein, sonst nimmt dir das dein
PORTA übel!
Dann wirds an der Software liegen. SO wie ich im letzten Post
beschrieben habe.
Poste Sie mal bitte.
Alles in EINEM interruptAUFRUF????
Das kann dann ja nicht richtig gehen!!!
Du musst mit JEDEM Interrupt nur EIN digit aufleuchten lassen!
Frage: Warum ??
>Frage: Warum ??
Ganz einfach:
Interrupt kommt:
- Ausgabe 1.Stelle.
- mit nops warten (also paar MIKROsekunden)
- Ausgabe 2.Stelle.
...
- Ausgabe 4.Stelle.
LANGE warten, bis neuer Interrupt.
FOLGE: 4.Stelle leuchtet VIEL länger! => und erscheint viel heller!
Poste mal den Code!
- Ausgabe 4.Stelle.
LANGE warten, bis neuer Interrupt.
FOLGE: 4.Stelle leuchtet VIEL länger! => und erscheint viel heller!
Ne, nachdem die 4. stelle aufgeleucht hat geht sie ja wieder aus, bis
zum nächsten Interrupt.
Gibt mir mal die Deklaration von dig, also ist das ein
uint8_t dig[4] ??
und dann bitte die exakten Portpins von PortA,
Also:
Segment1 an PortA1
Segment2 an PortA3
..
dann änder ich dir den Code so, dass er geht..
Hallo Matthias,
dig[n] enthält die Segmente die leuchten sollen. dig[n] wird ausserhalb
der Interruptroutine definiert damit die Interroutroutine nicht zu lange
dauert.
Die Interruptroutine läuft also wie folgt durch: dig[n] an PORT C legen,
dann Digit 1 an, also Trasistor ansteuern. das ganze dann eben 4 oder 8
mal.
Danke
Über die Art wie du das machst, kann man sicher streiten, aber ich glaub
nicht das es ein Software-Problem ist. Ich würde an deiner Stelle mal
jeden Transistor einzeln ansteuern und die Uce Restspannung messen.
Leuchtet die 1 auch heller wenn sie an der letzten Stelle leuchtet?
Ja es ist völlig egal wo ich die 1 plazieren sie leuchtet immer heller,
demnach liegt es nicht an den Transistoren. Die 1 leuchtet auch dann
heller wenn ich sie permanent ansteuere, also ohne Multiplexing. Das
habe ich schon Ausprobiert.
Nein, nein, das ist ja Wahnsinn. Die Schaltzeiten der PNP sind ja viel
langsamer wie die Multiplexfrequenz, die hier Zustande kommt... Die
"Bildwiederholfrequenz" sollte bei 100-200 Hz liegen und ist ja
eigentlich unkritisch, aber bitte nicht 100kHz.
Und zwischen den Timerinterrupts sind die Anzeigen wohl aus? So hat sich
das der Herr Multiplex aber nicht gedacht.
Sven wrote:
> Die 1 leuchtet auch dann> heller wenn ich sie permanent ansteuere, also ohne Multiplexing. Das> habe ich schon Ausprobiert.
Gerade DANN liegt doch die Vermutung nahe. Mal davon abgesehen, dass du
die Transistoren überlastest (7*20mA = 140mA. 40mA über dem
Maximalstrom).
Lies dir meinen oberen Beitrag nochmal durch.
Hallo Matthias,
PORT A (Transistoransteuerung)
PA0 = Digit1
PA1 = Digit2
PA2 = Digit3
PA3 = Digit4
PORT C (Segmentansteuerung)
dp (dezimalpunkt) = PC0
Segment g = PC1
Segment f = PC2
Segment e = PC3
Segment d = PC4
Segment c = PC5
Segment b = PC6
Segment a = PC7
dig[n] enthält die Dezimalzahl für die leuchtenden Segmente, also dig[1]
enthält die Segmente die am 1. Digit leuchten sollen. dig[2] die am
zweiten usw.
constuint8_ttab={~0x01,~0x02,~0x04,~0x08};// könnte noch in den PROGMEM als Konstante rein
3
...
4
uint8_tdig[4];
5
...
6
dig[0]=0b01001111;// Anzeigedaten für Stelle0
7
dig[1]=0b01001111;
8
dig[2]=0b01001111;
9
dig[3]=0b01001111;// Anzeigedaten für Stelle3
10
...
11
ISR(TIMER2_COMP_vect)
12
{
13
//-- local var
14
staticuint8_tcoloumn;
15
//-- nächste Spalte
16
coloumn++;
17
coloumn&=0x03;
18
//-- Ausgabe aktuelle Spalte
19
PORTC=dig[coloumn];
20
PORTA=tab[coloumn];
21
}
Das geht, falls der Timer-Interrupt in gleichmäßigen Abständen auftritt.
(Man nimmt dafür aber eher den Overflow als den Compare-Int)
PS: beim Einsprung in ISR's wird automatisch ein cli durchgeführt.
Und um das Retten von Registern (sreg zB) kümmert sich der Compiler
selbst.
Über das Timing habe ich mir noch keine Gedanken gemacht, auf jeden Fall
mehr als 50, 100 oder 200 Hz. Auf jeden Fall flimmert es nicht. Aber mal
im ernst, die Transistoren müssen doch im "null komma nichts"
durchschalten. Ok die 140 mA sind zuviel (laut Datenblatt max. 100 mA),
aber wie wird es dann gemacht.
>Über das Timing habe ich mir no..
Die schaltung ist MIT basisvorwiderständen VOLLKOMMEN korrekt!!!!
Lass die So!!
Auch die 140mA passen, solange die 100mA-Angabe des Transisotr nicht
grade die ABSOLUTE MAXIMUM RATINGS sind.
Danke Matthias,
ich werde gleich morgen Deinen Code ausprobieren, heute schaff ich das
nicht mehr - bin zu müde. Aber auf jeden Fall sieht Dein Code besser aus
als meiner, ich habe nämlich die Angewohnheit meinen eigenen Code nur an
dem Tag zu verstehen wo ich ihn geschrieben habe. Ich schreibe dann
morgen obs geklappt hat.
Vielen Dank für Deine Tipps und Hilfe, das mit dem Overflow war mir
schon immer lieber, dachte aber der Comprare Match ist moderner.
Matthias L. wrote:
>>Über das Timing habe ich mir no..>> Die schaltung ist MIT basisvorwiderständen VOLLKOMMEN korrekt!!!!>> Lass die So!!>> Auch die 140mA passen, solange die 100mA-Angabe des Transisotr nicht> grade die ABSOLUTE MAXIMUM RATINGS sind.
Sorry Leute aber was macht ihr hier? Das Problem ist doch KLAR und von
mir öfters benannt hier.
http://www.nxp.com/acrobat_download/datasheets/BC556_557_4.pdf
ABSOLUTE MAXIMUM RATINGS:
COLLECTOR CURRENT (DC) 100mA
(Und das gilt, wenn du den Transistor "testweise" mal dauer-an stellst.
Im Multiplex-betrieb fließt natürlich gemittelt ein niedriger Wert. Da
sollte das (so gerade) ok sein)
Das Problem ist:
Der Drop an dem Transistor verändert sich je nachdem wieviele Segmente
leuchten, deshalb die unterschiedliche Leuchtstärke. Was ist da dran
denn nicht zu verstehen?
>Was ist da dran denn nicht zu verstehen?
Ganz einfach:
Eine Zeile drunter steht:
>>peak collector current - -200 mA
Also passt das im Multiplexbetrieb!
Ein 1k Basiswiderstand lässt etwa 4,4mA Basisstrom fließen, da wir 140mA
Kollektorstrom brauchen, muss die Stromverstärkung größer als 32 sein..
Das ist lt deinem Datenblatt, Fig3, für Kollektorströme kleiner 250mA
gegeben.
Da die Stromverstärkung (weit) größer als diese 32 ist, ist der
Transistor in der Sättigung, und da sagt das Datenblatt ca 0,94V
Sättigungsspannung..
Na und? Die Schwankt nicht so stark. Das ist verkraftbar...
Aber um sowas vorzubeugen, mein erster Einwand (01:29):
>>Ich würde lieber NPN nehmen, um die Anoden anzusteuern..
FAZIT: Softwareproblem!
Matthias L. wrote:
> FAZIT: Softwareproblem!
Du bist auch n Profi oder? Wenn er ohne Multiplex eine 1 anzeigen lässt,
ist die immernoch heller als eine 8. Hat er oben geschrieben.
Aber klaar: Softwareproblem da, wo keine Software ist?
Ihr müsst meine Beiträge KOMPLETT lesen!
Ich habe immer geschrieben, die Schaltung ist in Ordnung MIT DEN
BASISVORWIDERSTÄNDEN !!
@Sven:
Aber die Ports A und C hast du schon auf Ausgang geschalten?
Hi zusammen,
ich würde folgendes machen: Der AVR ist spezifiziert daß maximal 20mA
pro Portpin gesourced oder gesinkt werden kann. insgesamt liegt das
absolute maximum laut Datenblatt bei 200mA die durch die VCC oder die
GND Pins fließen dürfen. Erreicht hat ist das zugegebenermaßen noch
nicht, aber kontrollier mal die Versorgungsleitungen zum uC. Ich weiß
daß hört sich blöd an ist mir aber schon passiert, Leiterplatte gemacht,
ich war der Meinung ich hab an alles gedacht und nach dem Aufbau hatt
ich an den Verbindungsbahnen zum uC da ich die recht dünn ausgelegt
hatte je nach fließendem Strom einen relativ großen Spannungsabfall. Es
war glaube ich auch eine Schaltung mit 7-Segment-Anzeigen wenn ich mich
recht erinnere. Ich hatte vergessen außer dem Strom des uC den Strom der
Anzeigen (und die schlucken im verhältnis ja um einiges mehr)
einzubeziehen...
Was ich vielleicht auch machen würde, die PNPs an den Anoden würde ich
vom Strom her etwas größer wählen. Wenn der uC mal Abstürzt und das
Multiplexing einstellt fließt durch den PNP ja kein Pulsförmiger Strom
mehr sondern ein Dauerstrom. Das quittiert der dann unter Umständen mit
dem Siliziumtod...
Ich würde einen BC327 als PNP verwenden, der kann 500mA damit bist du
auf der Sicheren Seite.
@Matthias L., weshalb die Anoden mit NPN Ansteuern? Damit verschenkst du
den Vorteil einer hohen Transistorverstärkung, besonders wenn das Teil
in Kollektorschaltung betrieben wird. Um das Auszugleichen mußt du mehr
Strom in die Basis einbringen. Da die meisten Controller eh besser
sinken als sourcen können ist der PNP meiner Meinung nach besser,
Vorausgesetzt die Anzeigen werden nicht mit mehr Spannung als der uC
Betrieben. Falls das der Fall ist hilft ein "Levelshifter" mit einem NPN
der bei Ansteuerung mit positiver Logik dem PNP die Basis "runterzieht"
und ihn dadurch öffnet, in Emitterschaltung weiter.
Die Anoden jedoch nur mit einem NPN Anzusteuern ist von der
Schaltungsauslegung her etwas unprofessionell, allein schon weil man
sich damit einige Probleme einhandelt.
So jetzt warte ich auf haue :D
Rolle
>? Damit verschenkst du>den Vorteil einer hohen Transistorverstärkung, besonders wenn das Teil>in Kollektorschaltung betrieben wird. Um das Ausz
Wieso?
Die Kollektorschaltung hat folgende VOrteile (zumindest seh ich das als
VOrteil)
- Kein Basiswiderstand notwendig.
- schnelleres Umschalten, da keine Transistorsättigung
- Basisstrom nur so groß, wie für Laststrom nötig!
>Um das Auszugleichen mußt du mehr>Strom in die Basis einbringen
Nein, weniger! Und der regelt sich noch von allein!
> einer hohen Transistorverstärkung
Nein. Kollektor und Emitterschaltung haben ähnlich (hohe)
Stromverstärkungen, dieser ist in beiden Fällen ~b.
@Matthias L.,
Sorry, das kommt raus wenn man in zu vielen Threads gleichzeitig
mitliest, bitte entschuldige du hast natürlich recht ich habe da einiges
durcheinandergeworfen... furchtbarschämundrotwerd
Heute ist definitiv nicht mein tag....... :/
MfG
Rolle