www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik PWM Problem Bascom

Autor: Immi (Gast)
Datum:

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.
$regfile = "m8def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000

Dim A As Integer

Config Pinb.0 = Input
Portb.0 = 1
Config Pinb.1 = Output

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1


Do
Waitms 100
If Pinb.0 = 0 Then                                          'Taster 1 wird geschlossen
   Waitms 10
      If Pinb.0 = 0 Then
         If A < 255 Then
         A = A + 4                                          'LED um 4 Stufe heller dimmen
         End If
      End If
End If

If Pinb.0 = 1 Then                                          'Taster 1 wird geöffnet
   Waitms 10
  If Pinb.0 = 1 Then
     If A > 0 Then
        A = A - 4                                           'LED um 4 Stufe dunkler dimmen
     End If
  End If

End If

Compare1a = A

Loop

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
Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

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.
Autor: Immi (Gast)
Datum:

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?
Autor: Paul Baumann (Gast)
Datum:

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
Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

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.
Autor: Immi (Gast)
Datum:

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.
$regfile = "m8def.dat"                                      'Mega8
$framesize = 32                                             '
$swstack = 32                                               '
$hwstack = 32                                               '
$crystal = 16000000                                         '16Mhz

Dim A As Integer                                            'Integer = 16 Bit = 2^16 = 65536 Zustände
Config Pinb.0 = Input                                       'Türkontaktschalter an PINB.0
Portb.0 = 1                                                 'Internen Pullup aktivieren
Config Pinb.1 = Output                                      'PWM Ausgang definieren

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Prescale = 1
' PWM = (8 oder9) oder 10 --> 10 Bit = 2^10 = 1024 Schritte

Do
Waitms 20

If Pinb.0 = 0 Then                                          'Türkontaktschalter, gegen Masse schaltend, wird geschlossen
   Waitms 10
      If Pinb.0 = 0 Then
         If A < 1023 Then
         A = A + 5                                          'LED um 5 Stufen heller dimmen
         End If
      End If
End If

If A > 1023 Then
A = 1023
End If



If Pinb.0 = 1 Then                                          'Türkontaktschalter, gegen Masse schaltend, wird geöffnet
   Waitms 10
      If Pinb.0 = 1 Then
         If A > 0 Then
         A = A - 1                                          'LED um 1 Stufe dunkler dimmen, dauert ca 25 sek bis LED aus, dient auch als Ausschaltverzögerung
         End If
      End If
End If

If A < 0 Then
A = 0
End If


Compare1a = A                                               'PWM an Pin15 (Portb.1), A= Tastverhältnis (Verhältnis zwischen ein und ausschalten)

Loop

End

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

Datenblatt:
http://www.datasheetcatalog.org/datasheet/fairchil...

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.
Autor: Paul Baumann (Gast)
Datum:

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
Autor: Spezi (Gast)
Datum:

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 ...
Autor: Hannes Lux (hannes)
Datum:

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.

...
Autor: Immi (Gast)
Datum:

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.
Autor: Spezi (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net