PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : **3 Kanal PWM mit PIC´s**



bexter
05.01.2009, 02:06
Folgendes Problem:
Ich möchte eine 3 Kanal PWM mit einem Pic mit 4Mhz für eine RGB Led Beleuchtung realisieren.
Mein Lösungsansatz wäre folgender:
Timer0 wird mit 1Mhz getaktet.
Alle 3 Led einschalten!
1.000.000/256= 3609,25 x in der Sekunde wird ein Interrupt ausgelöst.
dabei wird eine Variable "x" um 1 erhöht. Immer wenn ein Wert zwischen 0-256 gleich "x" ist wird die entsprechende Led abgeschaltet, den Rest der 256 Zyklen.
Wenn die Variable "x" 256 erreicht, werden alle Leds wieder eingeschaltet.
Nun komm ich aber bei 256 Stufen(8Bit) Auflösung aber auf eine
PWM Frequenz = 1000000/256/256= 15,26 HZ

Das ist zu niedrig oder? Lässt sich das mit 2 Timern besser lösen? 8-[

LG Alex B.

PICture
05.01.2009, 02:51
Hallo bexter!

Du kannst die Frequenz der PWM erhöhen entweder durch Vekleinern der Preskalersteilung oder Erhöhung der Oszillatorfrequenz. Die erste Lösung muss aber berücksichtigen die Ausführungszeit der ISR, so das vor nächstem Interrupt sie vollständig bearbeitet wird. Es können auch beide Möglichkeiten gleichzeitig angewendet werden. Ich glaube nicht, dass es sich mit mehr Timer besser lösen lässt.

MfG

bexter
05.01.2009, 03:02
Danke für die schnelle Antwort!
Ich werde warscheinlich den 16f628 einsetzen, der hat einen Timer den man auf einen festgesezten Wert Programmieren kann, bei dem er überläuft. Das wäre optimal, da ich so nicht 256 Zählzyklen warten muss, bis ein Interupt ausgelöst wird.
Das mit der Zeit zwischen den Interupts ist richtig,... er soll aber nebenbei ja auch noch was anderes rechnen ausserhalb! :-k
Wenn ich ihn alle 100 Zyklen auslösen lasse heisst das, das ich maximal 100 Befehle innerhalb der Interuptroutine haben darf?
Würde ich dann bei z.B. 50 Befehlen auf 50% Prozessorauslastung kommen? das wäre nämlich noch O.k. um was anderes zu rechen nebenbei!
LG Alex

PICture
05.01.2009, 03:20
So weit ich weiß, jeden Timer könnte man vorm Starten mit biliebigem Wert laden. Aber einfacher und vor allem schneller geht es mit dem Prescaler, da das Laden und Starten dauert. Am schnellsten geht es, wenn der Timer ununterbrochen läuft.

Ja, deine Überlegungen sind richtig. Man kann davon ausgehen, dass die ISR und das Program abwechseld laufen und die Aufgaben entsprechend verteilen.

Übrigens, jetzt beim 256:1 Prescaler, wartest du auf nächsten Interrupt 256 x 256 = 65536 Takten. :)

MfG

ossy
07.01.2009, 15:01
Hallo Bexter,

schau mal dieses Programm.

https://www.roboternetz.de/phpBB2/viewtopic.php?t=42595


Vielleicht hilfts weiter.

Gruß Wolfgang

bexter
07.01.2009, 16:02
Hey das ist echt ein gelungenes Proggy!
Danke für den Tip,... werde tatsächlich damit meine Zeiten berechen, aber proggen werd ichs dann lieber selber. wer weiss ob das effizienter code is der da ausgespuckt wird, und ich bin nunmal ein kontrollfreak :-P
Also Danke für die Tips!
Wenn das Projekt fertig ist stell ichs vielleicht hier rein auf Roboternetz!
Insgesamt werden 6 RGB Rebel Luxeon dabei verbaut 8-[