PWM Led dimmen

maikgen

Mitglied
24. März 2010
46
0
6
Sprachen
Hallo bitte schlagt mich nicht aber bis jetzt hab ich noch nix Richtiges gefunden was mir wirklich weiter hilft.
Ich versuche seit einigen Tagen eine LED zum Dimmen zu bringen das geht auch soweit ganz gut.
Nun habe ich das Problem das ich 2 Verscheidene Dimm Geschwindigkeit haben will die ersten 30 Schritte sollen je 30 Sekunde dauern und die reslichen sollen dann im 10 sekunden Takt gedimmt werden. Dann soll die LED anbleiben und nach paar Stunden soll sie wieder Runter dimmen bis zu den Letzten 30 Schritten wieder im 10 Sekunden Takt und dann im 30 Sekunden takt.

Bis jetzt hab ich eigentlich alles was ich haben wollte hinbekommen aber das ist mir zu hoch. Wäre schön wenn ihr mir helfen könnt. Soll Lichtsteuerung für ein Aquarium werden. Temp (Mit 2 DS18S20+) und Filter und Luftpumpe hab ich alles schon hinbekommen.

habe hier auch schon ein Programm aber egal wie ich es machen es wird nix



$regfile = "m32def.dat"
$crystal = 16000000

Config Portd.4 = Output

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

Dim Hochdimmen As Byte
Dim Runterdimmen As Byte
Helligkeit Alias Compare1a

Do
For Hochdimmen = 0 To 30
Helligkeit = Hochdimmen
Wait 1 'Später mal Wait 30
'Hier soll eigentlich noch komplett hochgedimmt werden auf 255
'aber nur 10 Sekunden zwischen den einzelnen schritten gesamt zeit etwa 48min
'Dann soll es eigentlich ca10h24min an bleiben '
Next Hochdimmen
'Und dann soll es wieder von 255 bis 30 im 10 Sekunden takt runterdimmen
'ab 30 Soll es dann wieder 30sekunde dauern bis es ganz aus ist dauer wieder etwa 48 min
For Runterdimmen = 0 To 30
Helligkeit = 30 - Runterdimmen
Wait 1 'Später mal Wait 30
'Und hier soll es dann wieder 12stunden dauern bis es wieder anfängt hoch zudimmen
Next Runterdimmen


Loop

End
 
Hallo,

du machst das viel zu kompliziert ;)

Also ich würde das mit ner Tabelle machen. (mal wieder) ;)

In der Tabelle steht drin auf welchen Zielwert gedimmt werden soll und in
welcher Zeit. Die Zeiten alle auf ein einheitliches Maß bringen (zB Sekunden)
Also ...

- Tabellenwert holen (zB 120sec , Endwert 40% )
- 120sec lang dimmen bis 40% erreicht sind.
- nächsten Tabellenwert holen (zB 600sec, Endwert 90%)
- 600sec lang bis zum Endwert 90% dimmen.
- ...

Für den Dimmvorgang die Schrittweite vom aktuellen Wert bis zum Zielwert
über die gewünschte Zeit berechnen lassen.

Als Taktgeber für die berechneten Dimmvorgänge wird ein Timer verwendet.
Also ich meine für die zB 600sec. Das man das PWM-Signal über nen Timer
generiert versteht sich von selbst ;) Die Dimmvorgänge würde ich abhängig
vom vorherigen Wert hoch oder runter machen. Dann braucht man nur eine
Dimmroutine.

Einmal um 00:00 würde ich das ganze gedimme mit der Uhrzeit (DCF77) auf
den Tag synchronisieren damit es einem nicht auf einmal durch nen blöden
Zufall zeitmäßig durch den Tag rennt. (nicht mehr synchron zum Tag ist).

Das ist so mein vorschlag.

Gruß
Dino
 
mh nagut dann muss ich mich damit mal beschäftigen wie das nun wieder geht. Ich bin mal gespannt ob ich das noch hinbekomme.
Aber man lernt nie aus.
 
mh nagut dann muss ich mich damit mal beschäftigen wie das nun wieder geht. Ich bin mal gespannt ob ich das noch hinbekomme.
Aber man lernt nie aus.
Es es Unklarheiten gibt dann sag bescheid. Ich kann dir das dann noch genauer
erklären wie ich mir das gedacht hab wie man es machen könnte.

Gruß
Dino
 
ja ich glaube da werde ich nochmal zurück kommen müssen ich werde da eh auf Timer 0 gehen müssen.
Erstens reicht mit ein 8 Bit Timer weil ich ja eh nur 255 schritte Dimmen möchte und zweitens hab ich für den rest schon den Timer 1 in beschlag und den brauche ich da auch.
Ich habe ja auch schon mal das LED Dimmen von einen Bekannte bekommen aber leider in C und da kenn ich mich nun mal gar net aus.
Und so versuche ich das ins Bascom zu übersetzen.

HAbe auch schon die Einstellungen für die fast PWM hinbekommen denke ich mal zumindest schimpft er nicht rum.

'PWM einstellen

'Fast PWM Mode

Tccr0.wgm00 = 1
Tccr0.wgm01 = 1
Tccr0.com01 = 1
Tccr0.cs01 = 1 '256er prescaler

Muss auf Portb.3 Raus weil das eigentlich der einzige ist den ich nutzen kann
Die Portd.4 und 5 sind von Display belegt und die kann ich auch nicht umlegen.
Sorry das ich das jetzt erst sage aber wo ich dann das Programm angeschaut habe was ich schon fertig habe wo der Rest drin ist habe ich das gesehen.

Aber das mit der Tabelle das erscheint mir etwas zu schwierig
 
Hi maikgen,

Aber das mit der Tabelle das erscheint mir etwas zu schwierig
ist eigentlich recht einfach wenn man es einmal verstanden hat.
du gibst ihm in der Tabelle die Aufgabe die er dimmen soll. ZBsp in 120sec
vom aktuellen Wert auf 30% dimmen. Die Zwischenschritte für jede Sekunde
läßt du berechnen. Wenn er aktuell zB 70% hat dann muß er von 70 auf 30
also in den 120 Sekunden um 40 ändern. Das wären dann 40 / 120 = 0,333
Also muß er weil es weniger werden soll (von 70% auf 30%) in jeder Sekunde
um 0,33% im PWM-Wert runtergehen.
Also zB ...
Aufgabe - Sekunden - Prozent (Sollwert)
1 - 120s - 40% (in 120s auf 40%)
2 - 600s - 80% (in 600s auf 80% hoch)
3 - 240s - 100% (hochdimmen in 240s)
4 - 3600s - 100% (eine Stunde so bleiben)
5 - 240s - 80% (in 240s auf 80% runter)
...
...

Und um 00:00 Uhr holst du immer die Aufgabe 1 ab. Damit ist er automatisch
synchron mit dem Tag und läuft nicht aus dem Ruder. Die Dimmschritte pro
Sekunde läßt du bei jeder Aufgabe berechnen. Und wenn du es anders haben
willst, dann muß man nur noch die Tabelle anpassen und sonst nix.
Die Tabelle kannst du aus Arrays bauen die du mit Werten füllst.
zB DIM Zeit AS INTEGER * 20 (für 20 Aufgaben) und identisch mit
DIM Prozent AS INTEGER * 20 (natürlich auch 20 Aufgaben)
Wenn die Zeit für eine Aufgabe rum ist (zB die 120sec) holst du dir die
nächste und läßt die Software auf den nächsten End-Dimmwert der Aufgabe
zulaufen. Wenn alle Aufgaben abgearbeitet sind und der Tag noch nicht zu
Ende ist, dann läßt du einfach den aktuellen Wert so beibehalten. damit
hast du auch abgehandelt wenn er zu früh fertig werden sollte.

Verstanden ? Ist doch garnicht so kompliziert :D

Schau dir mal in der BASCOM-Referenz das mit DIM und dem *20 an

Gruß
Dino
 
mh nagut das muss ich mir mla in Ruhe anschaun aber nicht heute mehr mal schaun ob ich da morgen dazu komme
 
noch was ...

Da du ja mit dem 8Bit-Timer PWM machen willst brauchst du ja Werte von
0 = 0%
...
127 = 50%
...
255 = 100%

Also könnte man in der Tabelle statt der Prozente auch gleich die PWM-Werte
nehmen auf die man dimmen will. Das spart die Umrechnung von Prozenten auf
die 8Bit-Werte ;)

Gruß
Dino
 
Hallo Maikgen!


Wenn ich mir deinen Code so ansehe frage ich mich zu allererst folgendes:

AVR = Mega32
Timer = Timer1

Der Timer1 beim Mega32 ist doch ein 16bit Timer! :eek:
Ergo.... zäht er von 0 bis 65535

In deinem Programmcode......
$regfile = "m32def.dat"
$crystal = 16000000

Config Portd.4 = Output

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

Dim Hochdimmen As Byte
Dim Runterdimmen As Byte
Helligkeit Alias Compare1a

Do
For Hochdimmen = 0 To 30
Helligkeit = Hochdimmen
Wait 1 'Später mal Wait 30
'
Next Hochdimmen

For Runterdimmen = 0 To 30
Helligkeit = 30 - Runterdimmen
Wait 1 'Später mal Wait 30
'Und hier soll es dann wieder 12stunden dauern bis es wieder anfängt hoch zudimmen
Next Runterdimmen


Loop

End

arbeitest du aber nur mit Werten von 0 bis 30! :hmmmm:
Ich kann mir gut vorstellen, dass du kaum eine Änderung feststellen wirst!

Auch in späteren Beiträgen schreibt ihr immer nur von "255".... das wäre aber bei Timer1 nicht der Fall. Der "Endwert" ist dann 65535!

Bevor du dich also mit Tabellen und ähnlichen Dingen bschäftigst, solltest du über die PWM-Werte noch einmal nachdenken.

Gruß,
Cassio
 
Hallo,

Auch in späteren Beiträgen schreibt ihr immer nur von "255".... das wäre aber bei Timer1 nicht der Fall. Der "Endwert" ist dann 65535!

Bevor du dich also mit Tabellen und ähnlichen Dingen bschäftigst, solltest du über die PWM-Werte noch einmal nachdenken.

Erstens reicht mit ein 8 Bit Timer weil ich ja eh nur 255 schritte Dimmen möchte und zweitens hab ich für den rest schon den Timer 1 in beschlag und den brauche ich da auch.
ich hab das so verstanden das er nen 8Bit-Timer (zB Timer0) für PWM
verwenden will (auch wenn es im Programm anders steht) und der Timer1
ja durch die Uhr-Routinen belegt ist (DCF77)... oder irre ich mich da ?

Da bekommt man erstens nen SecTic mit dem man Sekündlich den PWM-Wert
verändern kann und zweitens kann man die ganze Dimmung mit der Tageszeit
(also 00:00) synchronisieren. Und für die Dimmung reicht bei Licht für ein
paar Fische eigentlich 8Bit aus :D

Gruß
Dino
 
Noch mal Hallo!

Noch ein Tipp zu FOR-NEXT Schleifen...

Du musst es nicht so wie in deinem Programmcode machen:

For Runterdimmen = 0 To 30
Helligkeit = 30 - Runterdimmen

Wait 1 'Später mal Wait 30
Next Runterdimmen

Einfacher wäre es mit:
Code:
[B]
For Runterdimmen = [B]30 To 0 Step -1[/B]
Helligkeit = Runterdimmen[/B]
Wait 1                                                      'Später mal Wait 30
Next Runterdimmen


Es wäre durch die Angabe von "Step" auch folgendes Möglich:
(Nur ein BEISPIEL!)
Code:
[B]
For X = [B]0 To 65000 Step 1000[/B]
Helligkeit = X[/B]
Wait 1                                                     
Next X

bzw. :

Code:
[B]
For X = [B]0 To 65000 Step -500[/B]
Helligkeit = X[/B]
Wait 1                                                     
Next X


Soweit verstanden? ;)

Gruß,
Cassio
 
ich hab das so verstanden das er nen 8Bit-Timer (zB Timer0) für PWM
verwenden will (auch wenn es im Programm anders steht) und der Timer1
ja durch die Uhr-Routinen belegt ist (DCF77)... oder irre ich mich da ?

Hi Dino!

NEIN!
Du irrst dich nicht! :)

Wenn er DCF77 nutzen möchte, wird automatisch Timer1 verwendet und damit ist er auch belegt!

Sorry, da habe ich leider nur auf den Code im ersten Beitrag geschaut und den Hinweis mit der DCF-Uhr verpasst! :rolleyes:

Tja, so ist das mit den "Bruchstücken" aus Programmcodes manchmal.... :cool:

Gruß,
Cassio
 
Hi,

Und für die Dimmung reicht bei Licht für ein
paar Fische eigentlich 8Bit aus :D

ich hab da eine ganz simple Lösung: Mechanische Schaltuhr, 11 Std ein, 13 Std aus, ein, aus, ein, aus...:rolleyes::D


Grüsse,

Michael
 
Sorry, da habe ich leider nur auf den Code im ersten Beitrag geschaut und den Hinweis mit der DCF-Uhr verpasst! :rolleyes:

Tja, so ist das mit den "Bruchstücken" aus Programmcodes manchmal.... :cool:
ich hab das auch mehr zwischen den Zeilen herausextrahiert ;)

Gruß
Dino
 
@Cassio

ja du hast recht das stimmt nicht so wirklich mit den wert 30 das ist ein fehler von mir.
Aber mir Timer 0 ist schon richtig weil Timer 1 belegt ist, will auch später mal noch DCF77 versuchen aber das hat zeit.

die schleife sieht jetzt so aus und die geht auch soweit nur leider bleibt sie noch nicht an bzw aus dimmt immer hoch und runter ohne pause

Do
For Hochdimmen = 0 To 30
Helligkeit = Hochdimmen
Waitms 1 'ersten 30 schritte später mal 30 Sekunden
Next Runterdimmen
For Hochdimmen = 31 To 255 'nächsten schritte später mal 10 Sekunden
Waitms 5
Helligkeit = Hochdimmen
Next Hochdimmen
For Runterdimmen = 31 To 255
Helligkeit = 255 - Runterdimmen
Waitms 5 'bis helligkeit 31 später mal 10 sekunden
Next Runterdimmen
For Runterdimmen = 0 To 30
Helligkeit = 30 - Runterdimmen
Waitms 1 ' ab helligkeit 30 bis 0 später mal 30 sekunde
Next Runterdimmen
Loop
 
Hallo Maikgen!

Nun ja..... die Schleife kann ja auch nicht stehen bleiben, schießlich gibt es dafür im Programmablauf auch keine Anweisung! ;)

Ich würde nun einfach mal sagen, dass dein Denkansatz völlig falsch ist.
Sicher ist es richtig, dass du die Variablen hoch und wieder runter zählst. Dafür würde aber auch eine Variable reichen... also z.B. nur "Dimmen" und nicht "Hochdimmen" und "Runterdimmen".
Macht doch auch keinen Sinn! Letztlich übergibst du ja immer nur EINEN Wert an den PWM. ;)

Dann würde ich mir Gedanken darüber machen, was du eigentlich möchtest.
Du möchtest doch lediglich nur den PWM in bestimmten Abständen verändern.
Da die Zeitspannen aber zemlich groß sind, macht das mit einer FOR-NEXT mit WAIT Schleife keinen Sinn.
Du kannst auch in der Zeit nichts anderes machen, oder gar in den Dimmvorgang "eingreifen".

Nimm dir die Idee von Dino noch mal zu Herzen.
Wenn du die DCF77-Uhr in Betrieb nimmst (oder auch nur die Softclock) dann hast du die "SECTIC-Subroutine", die jede Sekunde ausgeführt wird.
Nutze diese "Automatik" doch einach in deinem Programm. ;)

Ach so...
Die Variablenwiederholung beim NEXT ist nicht zwingend erforderlich... nur wenn du diese verschachtelst. Es könnten sich sont auch Fehler im Programmablauf einschleichen.
BEISPIELE:
Code:
For I = 0 to 10
Toggle PortX.Y
Next


[COLOR="Blue"]For A = 0 to 10
Toggle PortX.Y[/COLOR]
   [COLOR="Red"]For B = 1 to 8
   Toggle PortX.Z
   Next B[/COLOR]
[COLOR="Blue"]Next A[/COLOR]

Im ersten Beispiel wird I von 0 bis 10 hoch gezählt. Danach ist die Schleife abgearbeitet.

Im zweiten Beispiel wird aber B zehn mal von 1 bis 8 hochgezählt.
Darum auch der Vaiablenname nach dem NEXT (Next A bzw. Next B).
Meinen Erfahrungen nach ist aber dies noch nicht einmal notwendig. Allerdings macht es den Code übersichtlicher.


Wie aber schon erwähnt....
Ich denke aber generell, dass dein Ansatz zur Lösung deiner Aufgabenstellung nicht der Richtige ist. ;)


Gruß,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)