Forum: Mikrocontroller und Digitale Elektronik PWM Problem Bascom


von Immi (Gast)


Lesenswert?

Hallo Leute,

ich habe heute mal etwas mit PWM und SMD Led Streifen experimetiert.

Habe auch schon ein kleines Programm für meine Zwecke geschrieben (Auto 
Innenbeluchtung (LED) langsam andimmen).
Meine Türkontakte schlaten gegen Masse. Also hab ich die Schaltung so 
angedacht, das sie mit den internen Pullups läuft.
1
$regfile = "m8def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 16000000
6
7
Dim A As Integer
8
9
Config Pinb.0 = Input
10
Portb.0 = 1
11
Config Pinb.1 = Output
12
13
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
14
15
16
Do
17
Waitms 100
18
If Pinb.0 = 0 Then                                          'Taster 1 wird geschlossen
19
   Waitms 10
20
      If Pinb.0 = 0 Then
21
         If A < 255 Then
22
         A = A + 4                                          'LED um 4 Stufe heller dimmen
23
         End If
24
      End If
25
End If
26
27
If Pinb.0 = 1 Then                                          'Taster 1 wird geöffnet
28
   Waitms 10
29
  If Pinb.0 = 1 Then
30
     If A > 0 Then
31
        A = A - 4                                           'LED um 4 Stufe dunkler dimmen
32
     End If
33
  End If
34
35
End If
36
37
Compare1a = A
38
39
Loop
40
41
End

Mein Problem ist jetzt folgendes. Wenn ich den Taster drücke (Tür wird 
geöffnet), dimmt das Licht langsam an. Soweit so gut. Wenn ich den 
Taster in der An-dimmphase loslasse (also Tür geschlossen) dimmt es 
wieder langsam aus. So soll es ja auch sein. Wenn ich den Taster aber 
jetzt zu lange gedrückt halte, bis die 255 erreicht sind, geht das Licht 
schlagartig aus. Lass ich den Taster nach dem schlagartigen ausgehen 
los, gehen die LEDs sofort auf die volle Helligkeit und dimmen dann 
langsam aus. Ich muss also den Zustand der 255 irgendwie halten, bis der 
Taster wieder losgelassen wird. Aber wie stelle ich das an, ich dachte 
es gehr mit dem Until Befehl, aber dabei kommen immer nur 
Fehlermeldungen. Auch der Befehl While brachte nicht das gefünschte 
Ergebnis.

Was habe ich falsch gemacht bzw vergessen?

Danke für eure Hilfe

von Karl H. (kbuchegg)


Lesenswert?

Auch wenn A ein 16 Bit Integer ist, Für Compare1a ist nur 1 Byte 
relevant, da du ja eine 8 Bit PWM hast.

Welche Werte nimmt denn A an.
A beginnt bei 0

0, 4, 8, 12, 16, ... 200, 204, 208, ..... 240, 244, 248, 252, 256

Opps. 256 ist aber größer als 255. 252 war es noch nicht. Aber 252 + 4 
liegt über dem erlaubten Bereich.

von Immi (Gast)


Lesenswert?

Hallo
Danke erstmal für deine Antwort,
der Gedanke mit den 256 statt 255 kam mir auch schon. also du meinst 
wenn ich statt der 4 den Dimmfaktor 1 nehme geht es ohne dieses 
schlagartige abschalten bei 255?

von Paul Baumann (Gast)


Lesenswert?

Ja, wenn Du immer um 1 erhöhst, bleibt er dann bei 255 stehen.
OT: Immi, bist Du eventuell aus der Ecke Westthüringen?

MfG Paul

von Karl H. (kbuchegg)


Lesenswert?

Immi schrieb:
> Hallo
> Danke erstmal für deine Antwort,
> der Gedanke mit den 256 statt 255 kam mir auch schon. also du meinst
> wenn ich statt der 4 den Dimmfaktor 1 nehme geht es ohne dieses
> schlagartige abschalten bei 255?

Entweder das. Oder aber du gestaltest die Abfrage so, dass auch bei 
einer Erhöhung um 4 nichts passieren kann.

Wann kann man nicht mehr erhöhen?
Na offenbar dann, wenn der aktuelle Wert größer dem Maximalwert weniger 
der Stufenbreite ist.

Du kannst es aber auch so machen

      A = A + 4
      if A > 255 Then
        A = 255

d.h. du versuchst zunächst zu erhöhen. Stellst du hinten nach fest, dass 
du über dem Maximum bist, dann limitierst du aufs Maximum.

Aber Achtung! Damit bist du aus der 4-er Sequenz draussen. d.h. beim 
Runterzählen kommst du damit nicht mehr automatisch bei 0 raus.
Dort muss man dann etwas ähnliches machen. Nur mit 0.

Aber ganz ehrlich: Da man den Unterschied einer LED mit PWM STufe 252 
nicht von einer mit PWM STufe 255 unterscheiden kann, würde ich es 
einfach so machen.

          if A > 256 - 4
             A = A + 4                                          'LED um 
4

A wird nur dann erhöht, wenn das Ergebnis nicht über 255 kommen würde.

von Immi (Gast)


Lesenswert?

Hallo

Ich habe jetzt das Programm nach den Vorschlägen angepasst, es 
funktioniert auch wunderbar. Danke schonmal dafür.

Hier ist der fertige Code, nur für die die es interessiert.
1
$regfile = "m8def.dat"                                      'Mega8
2
$framesize = 32                                             '
3
$swstack = 32                                               '
4
$hwstack = 32                                               '
5
$crystal = 16000000                                         '16Mhz
6
7
Dim A As Integer                                            'Integer = 16 Bit = 2^16 = 65536 Zustände
8
Config Pinb.0 = Input                                       'Türkontaktschalter an PINB.0
9
Portb.0 = 1                                                 'Internen Pullup aktivieren
10
Config Pinb.1 = Output                                      'PWM Ausgang definieren
11
12
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Prescale = 1
13
' PWM = (8 oder9) oder 10 --> 10 Bit = 2^10 = 1024 Schritte
14
15
Do
16
Waitms 20
17
18
If Pinb.0 = 0 Then                                          'Türkontaktschalter, gegen Masse schaltend, wird geschlossen
19
   Waitms 10
20
      If Pinb.0 = 0 Then
21
         If A < 1023 Then
22
         A = A + 5                                          'LED um 5 Stufen heller dimmen
23
         End If
24
      End If
25
End If
26
27
If A > 1023 Then
28
A = 1023
29
End If
30
31
32
33
If Pinb.0 = 1 Then                                          'Türkontaktschalter, gegen Masse schaltend, wird geöffnet
34
   Waitms 10
35
      If Pinb.0 = 1 Then
36
         If A > 0 Then
37
         A = A - 1                                          'LED um 1 Stufe dunkler dimmen, dauert ca 25 sek bis LED aus, dient auch als Ausschaltverzögerung
38
         End If
39
      End If
40
End If
41
42
If A < 0 Then
43
A = 0
44
End If
45
46
47
Compare1a = A                                               'PWM an Pin15 (Portb.1), A= Tastverhältnis (Verhältnis zwischen ein und ausschalten)
48
49
Loop
50
51
End

Ich habe jetzt aber eher ein elektrisches Problem.
Ich betreibe die LED Leisten über einen BUZ11 Transistor.

Datenblatt:
http://www.datasheetcatalog.org/datasheet/fairchild/BUZ11.pdf

Ich habe den Anschluss Gate an Dauermasse angeschlossen, den Ausgang 
Drain habe ich über einen 1k Widerstand an den µC gehängt und der 
Anschluss Source hängt am Minus des LED Streifen (Plus an Dauerplus).

Wenn ich jetzt noch eine LED Leiste parallel schalte, dann wird die 
erste Leiste ein Stückchen dunkler. Noch extremer ist es, wenn ich eine 
einfache LED parallel zu einem LED Streifen hänge, diese glimmt bei dem 
Wert von 1023 nur. Mir ist klar, das sich bei einer Parallelschaltung 
der Strom aufteilt. Ist das jetzt nur so, weil die ganze Schaltung an 
einem PC Netzteil hängt (kommt später im Auto zum Einsatz)?

Was kann ich dagegen tun? Ich hatte die Idee, das ich die LEDs über eine 
KSQ laufen lasse, aber das funktioniert nicht. Ich habe es mit einer 
20mA KSQ ausprobiert, aber die LED die ich dran hatte, bleibt auf der 
vollen Helligkeit.

@Paul: Nein ich bin nicht aus Westthüringen, bin aus Sachsen.

Danke schonmal für eure Hilfe.

von Paul Baumann (Gast)


Lesenswert?

Der Anschluß des BUZ11 kommt mir seltsam vor...;-)

Wie sehen die LED-Leisten aus? (wieviele LED, wie beschaltet, mehrere
Gruppen LED mit Vorwiderständen parallel, alle in Reihe...?)

Ich frage deshalb: Nur wenn man weiß, wie der (industriell 
hergestellte?)
LED-Streifen aussieht, kann man eine anständige Antwort geben.

OT: Mein Ex-Kollege hieß so wie Du, deshalb fragte ich, woher Du kommst.

MfG Paul

von Spezi (Gast)


Lesenswert?

Immi schrieb:
> Ich habe den Anschluss Gate an Dauermasse angeschlossen, den Ausgang
> Drain habe ich über einen 1k Widerstand an den µC gehängt und der
> Anschluss Source hängt am Minus des LED Streifen (Plus an Dauerplus).

Paul Baumann schrieb:
> Der Anschluß des BUZ11 kommt mir seltsam vor...;-)

In der Tat: Source gehört an Masse und Gate an den Controller. Der 
Gate-Widerstand darf auch kleiner sein, gerade bei höheren Frequenzen 
(um die 100-220 Ohm). Würde ich mal austesten ...

von Hannes L. (hannes)


Lesenswert?

Der AVR macht aber auch den BUZ11 nicht richtig auf, der BUZ11 braucht 
da etwas mehr Ugs. Nimm lieber einen Logiclevel-FET, der mit TTL-Pegel 
voll öffnet.

...

von Immi (Gast)


Lesenswert?

Danke für eure schnellen Antworten. Ich habe das mit den Anschlüssen 
damals bloß ausprobiert und mit der Konfiguration hat es eben geklappt. 
Ich werde das mal tauschen und testen. Das es auch diese LL-FETs gibt, 
habe ich leider erst nach der letzten Bestellung gemerkt. Ich habe mir 
heute bei Conrad mal einen IRLZ34N besorgt, die sind wohl die billigsten 
auf dem Gebiet. Allerdings machen sie mir einige Probleme. Das Dimmen 
funktioniert, auch die Heilligkeit beim parallelschalten von mehreren 
Streifen bleibt gleich. Allerdings scheint es ein Problem zu geben. Wenn 
ich das Programm auf 1023 hochlaufen lassen, dimmt es nicht mehr auf 
null runter. Die Leisten werden etwas dunkler, bleiben aber an. Wie 
schließe ich den IRLZ34N an? Doch eigentlich genauso wie den BUZ11, 
oder. Im Datenblatt ist leider nicht ersichtlich welche Anschlüsse 
Drain, Gate und Source sind.
Woran könnte das eigenartige Verhalten liegen?

Die Leisten sind von ebay aus China. Es sind pro Leiste 60 SMS LEDs, die 
in Dreiergruppen in Reihe geschaltet sind und die Dreiergruppen hängen 
dann parallel. Jede Dreiergruppe hat einen Vorwiderstand. Die Farbe ist 
weiß, falls das für euch irgendwie wichtig ist im Bezeug auf die 
Stromaufnahme der einzelnen SMD-LED.

von Spezi (Gast)


Lesenswert?

Hallo,

ich habe im Datenblatt von IR auf dem vorletzten Blatt die 
Anschlussbelegung vom IRLZ34 gefunden (bei der Gehäuse-Zeichnung). Sie 
ist identisch mit der vom BUZ11.

Hat der IRLZ einen Gate-Widerstand?

Hast du die Möglichkeit, mit einem Scope die PWM vor und nach dem FET 
anzusehen? (Nur um Hardware-Probleme deines Phänomens auszuschliessen)?

> Es sind pro Leiste 60 SMS LEDs
                        ^^
Coole LEDs; jetzt können die schon SMS ...  ;-D

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.