Nun ja, PWM ist im Prinzip auch nichts anderes als sehr schnelles aus- und einschalten.
Google mal nach "Software-PWM", da dürfte sich schon was finden lassen...
Viele Grüße
Hi Leute!!
ich habe im Moment ein Schulprojekt zum Thema Beleuchtungstechnik.. Wir sollen aus Sperrholz ne kleine Bühne bauen (Also ne Modellbühne).. Dann sollen wir auf dieser Bühne verschiedene Beleuchtungseffekte vorstellen..
Da ich mit meiner Gruppe was besseres machen will, als die andern![]()
habe ich mich entschieden die LED's über einen AtMega 8 anzusteuern..
Da ich in Bascom kein Genie bin und mich erlichgesagt mit dem Programm nur ein ganz kleines bisschen beschäftigt habe, bräuchte ich ein paar Tipps..
So LED Blinken oder so macht ich einfach per I/O Output und dem waitms signal.. das sollte für das projekt reichen..
Nun will ich aber auch LED's dimmen.. Also dass die LED vom ausgeschateten Zustand bis zur voll Power langsamm heller werden soll..
Leider habe ich keine Ahnung, wie das geht.. Ich habe gehört, dass es i-wie mit Timern und PWM gemacht wird.. Aber ich habe das nicht wirklich verstanden..
Kann mir einer dazu nen Tipp geben??
Weil einfach nur an/aus über nen schalter ist mir zu langweilig.. Das machen die anderen Gruppen ja auch ^^
Mfg Yannik
Nun ja, PWM ist im Prinzip auch nichts anderes als sehr schnelles aus- und einschalten.
Google mal nach "Software-PWM", da dürfte sich schon was finden lassen...
Viele Grüße
Vielen Dank!!
Also so müsste der Code jetzt richtig sein oder??
Code:$regfile = "m8def.dat" $crystal = 4000000 Config Portb.1 = Output Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1 Do Pwm1a = 205 End
Jetzt habe ich aber noch ein paar Fragen dazu, auf die ich bis jetzt keine Antwort geunden habe..
1. Wenn ich das jetzt so eingebe, wird die LED ja einmal hell und dann direkt wieder dunkel.. Wie kann ich machen, dass sie nur hell wird und dann hell bleibt??
2. Wie kann ich die Geschwindigkeit einstellen??
3. Wie kann ich einen PWM-Wert vorgeben, der gehalten werden soll?? Also ich will nicht, dass es hoch bzw. runter geregelt wird, sondern, dass z.B. die LED nur 50% leuchtet.. Was muss ich dann da machen??
Mfg Yannik
Hi,
das was jetzt in deinem Code steht, ist die Hardware-PWM der ATMegas. Die läuft völlig autonom vom eigentlichen Prozessor, der so alle Zeit der Welt hat, andere Dinge zu erledigen. Die Hardware-PWM ist so sehr schnell und sehr genau, allerdings kann das Signal nur an bestimmten Pins ausgegeben werden.
Wieviele LEDs sollen denn angesteuert werden?
Vorteil der Software-PWM: es können viele LEDs individuell gesteuert werden (auch an frei wählbaren Pins)
Das hat aber dann den Nachteil, dass der Controller mit dem Steuern der LEDs beschäftigt ist, und nicht mehr viel Zeit für andere Dinge hat.
Das Prinzip dieser Methode ist so einfach wie genial: ein Timer wird so eingestellt, dass er bei Überlauf in eine Interrupt-Routine verzweigt. Dort wird eine Variable bei jedem Durchlauf um 1 erhöht. Ist jetzt der Helligkeitswert der LED (die Vorgabe also) größer als diese Zählvariable, wird der Pin, an dem die LED hängt, auf log. 1 gestellt, ansonsten auf log. 0. Erreicht die Zählvariable den maximal möglichen Helligkeitswert, wird sie wieder auf 0 zurückgesetzt.
Ich hoffe, das war jetzt einigemaßen verständlich
Die LED leuchtet also immer nur so hell, wie das der Helligkeitswert angibt. Soll die LED dann langsam heller bzw. dunker werden, kannst du das einfach per Änderung der Helligkeitswerte im Hauptprogramm erreichen.
Viele Grüße
Sorry, aber ich versteh nur BahnhofZitat von ikarus_177
8-
Also nicht so viele!! Das soll nur nen ganz eifaches Projekt werden.. Also ich denke, es wird immer nur eine Aktion gleichzeitig sein.. Also erst heller werden, dann binken.. oder sowas in der art..Zitat von ikarus_177
Könntest du das mit dem Software-PWM nochmal genauer erklären.. Ich hab das nicht so wirklich verstanden.. Am besten mit BeispielCode..
Oder nen Link, wos erklärt ist, wär auch gut xD
Hi,
gut
Hier ein Beispielcode, den ich mal für thunder87 für sein Lauflichtprojekt geschrieben habe - ich denke, er hat nichts dagegen, wenn ich den Code hier reinstelle, ist ja schließlich nichts geheimes dran.
Dieser Code kann also die Helligkeiten von 9LEDs in 256 Stufen regeln (es wären sicherlich auch noch mehr LEDs möglich).Code:$regfile = "m32def.dat" $crystal = 16000000 $hwstack = 64 $swstack = 64 $framesize = 128 '$sim Config Adc = Single , Prescaler = Auto Start Adc Config Timer0 = Timer , Prescale = 1 On Timer0 Isr Enable Timer0 Enable Interrupts Config Portc = Output Dim I As Byte Dim J As Byte Dim K As Word Dim W As Word Dim T As Byte Dim Wert(9) As Byte Start Timer0 Portc = 255 Do Wert(1) = Xx ... Wert(9) = Yy Loop Isr: Incr T If T >= 31 Then T = 0 If T < Wert(1) Then Portc.0 = 0 If T >= Wert(1) Then Portc.0 = 1 If T < Wert(2) Then Portc.1 = 0 If T >= Wert(2) Then Portc.1 = 1 If T < Wert(3) Then Portc.2 = 0 If T >= Wert(3) Then Portc.2 = 1 If T < Wert(4) Then Portc.3 = 0 If T >= Wert(4) Then Portc.3 = 1 If T < Wert(5) Then Portc.4 = 0 If T >= Wert(5) Then Portc.4 = 1 If T < Wert(6) Then Portc.5 = 0 If T >= Wert(6) Then Portc.5 = 1 If T < Wert(7) Then Portc.6 = 0 If T >= Wert(7) Then Portc.6 = 1 If T < Wert(8) Then Portc.7 = 0 If T >= Wert(8) Then Portc.7 = 1 If T < Wert(9) Then Portd.7 = 0 If T >= Wert(9) Then Portd.7 = 1 Return
Viele Grüße
Hi,
wow, vielen Dank!
Aber gib es da nichts einfacheres??? Ich blick da nämlich nicht durch.. Wie gesagt.. Ich hatte mich nur einmal ganz kurz mit Microcontrollern beschäftigt...
EDIT : Könntest du den Code so zurechtstutzen, dass nur noch eine LED von 0% auf 100% gedimmt wird?? Dann könnte ich das glaub ich besser verstehen.. Wäre dir auf jeden Fall sehr dankbar!!
Hi,
eigentlich ist es überhaupt nicht kompliziert
Ich versuchs einfach nochmal: ein Timer wird so eingestellt, dass er in bestimmten Zeitabständen in ein Unterprogramm reinspringt, wo dann die LEDs angesteuert werden. Die Initialisierung des Timers ist die Geschichte mitHier sagen wir ihm also, er soll nach einer gewissen Zeit (die hier eher nebensächlich ist, zumindest fürs Verständnis) zu der Stelle springen, die da heißt: IsrCode:Config Timer0 = Timer , Prescale = 1 On Timer0 Isr Enable Timer0
Das ist eher im unteren Codeabschnitt.
Sagen wir, der Prozessor springt jetzt Hausnummer 1000Mal pro Sekunde in dieses Unterprogramm, also mit 1kHz. Bei jedem Durchlauf der Routine wird die Variable "T" um 1 erhöht. Da thunder87 256 Stufen zu viel waren, hab ich es hier auf 31 Stufen beschränkt. Erreicht die Variable also den Wert 31, wird sie wieder auf 0 zurückgesetzt und weiter fröhlich erhöht.
Eine LED kann also maximal 31 "Zeiteinheiten" eingeschaltet sein. In meinem Beispiel geben die Wert(x)-Zahlen an, wie lange die LED AUSgeschaltet ist, man könnte es aber genausogut umgekehrt machen. Angenommen, der Wert, den wir haben wollen, ist 15, also ca. die Hälfte der Zeit. Jetzt kommt der Prozessor in die Unterroutine, die Zählvariable ist 0. Dankist die LED nun so lange ausgeschaltet, bis T den Wert von Wert(1) erreicht hat, in unserem Fall eben 15. Die restliche Zeit, also von 15-31, ist die LED nun eingeschaltet, danach wird die Variable wieder auf 0 gesetzt und das Spiel beginnt von neuem.Code:If T < Wert(1) Then Portc.0 = 0
Da diese Routine nun sehr oft in der Sekunde ausgeführt wird, merken wir das ständige Blinken der LED nicht - für das menschliche Auge erscheint die Helligkeit "gedimmt".
Viele Grüße
Ahh.. Okay, ich glaube ich verstehs langsam.. Aber eine Sache ist mir noch unklar..
Wo steht das in dem Code?? Bin ich blind oder was??Da thunder87 256 Stufen zu viel waren, hab ich es hier auf 31 Stufen beschränkt.
Warum entspricht die 1 da jetzt dem Wert 15?? Was wäre dann Wert(2)?? 30??bis T den Wert von Wert(1) erreicht hat, in unserem Fall eben 15.
Hi,
das steht da:Wenn T also den Wert 31 erreicht, wird es auf 0 zurückgesetzt.Code:If T >= 31 Then T = 0
Bei Wert(x) handelt es sich um ein Array, im Prinzip 9 zusammenhängende Variablen (da wir ja 9 LEDs haben). Auf die einzelnen Variablen kann durch einen sog. Index zugegriffen werden, der geht bei uns von 1-9. Wert(1) ist also eine eingenständige Variable (genauso wie Wert(8) oder Wert(6)) der einfach der gewünschte Helligkeitswert zugewiesen wird.
Viele Grüße
Lesezeichen