www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PWM Problem Bascom


Autor: Immi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
$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 (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Immi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Paul Baumann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Immi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
$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:

Bewertung
0 lesenswert
nicht 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

Autor: Spezi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Immi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Spezi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.