Dies ist eine kostenlose Homepage erstellt mit hPage.com.

Hardware  Pulsweitenmodulation


 
Möchte man eine LED mit verschiedener Helligkeit steuern, geht das über die PWM. Auch Pulsweitenmodulation genannt.
Ich habe hier mal die Hardware des PIC18F25K22 genutzt. Und kann somit bis zu 5 LEDs über Hadware PWM steuern. 
Weil es 5 CCP Module in dem Chip gibt. Und jeder kann als PWM konfiguriert werden. Jedes CCP Modul ist auch direkt mit einem Pin vom Chip verbunden und kann somit direkt benutz werden.


Ich nutze bei dem Beispiel den Internen Oscillator mit 16MHz. Eingestellt über die CONFIG1H -> FOSC<3:0>
Und dann mit OSCCONbits.IRCF = 0b111.
Man beachte auch hierbei das die CCP Module alle von Timer 2 mit Takt versorgt werden.
Wenn man einen anderen Timer benutzen möchte muss man das im CCPTMRS0 bzw. CCPTMRS1 umstellen.
Der Timer 2 läuft dann mit FOSC/4.
Bei mir wäre das 16MHz/4 ergibt 4MHz für das CCP Modul. 
Durch PR2 lege ich in meinem Beispiel fest. Wie weit der Timer 2 zählt.
Also von 0 bis 255. Somit ergibt sich eine PWM Frequenz von 15,6kHz.
Die PWM lässt sich dann über CCPRxL und CCPxCON<5:4> verstellen. Von 0 bis 1023. Also 10bit Bandbreite.
 
Ich Versorge die Schaltung mit 5 Volt direkt aus dem PICKIT_3.
 
Es ist nur ein Beispiel um zu Zeigen wie einfach man die interne Hardware nutzen kann um LEDs zu dimmen.
Das Programm dazu : HW_PWM.X.zip
 
 
 
 
Software Pulsweitenmodulation
 
 
Es gibt noch die Möglichkeit, die ganze PWM in Software zu Steuern. Nennt sich dann Software PWM. Und ermöglicht einem jedem beliebigen Pin über PWM zu steuern. Selbst 8 Pins gleichzeitig über Soft PWM zu steuern ist kein Problem.
Man muss sich bei einer Softwareseitigen Lösung schon ein bissel mit dem Chip beschäftigen.
Weil der Chip das alles schaffen muss am Ende.
 
??? Was macht eine Soft PWM ???
 
Wir denken mal darüber nach....
 
void ISR(void){
static uint8_t soft_pwm_counter=0;
soft_pwm_counter++;
if ( soft_pwm_counter==0 )  LED_PIN=HIGH;
if ( soft_pwm_counter==compare_led )  LED_PIN=LOW;
}
 
1. Idee
Der PIC18F26K22 kann über den Internen Oscillator mit bis zu 16MHz getaktet werden.
Durch eine PLL kann der Takt noch mal 4 genommen werden. Somit sind Takte von 64MHz möglich.
Durch die interne Struktur benötigt der PIC immer 4 Takte für einen Befehl. Also macht er somit bis zu 4 Millionen Befehle in 1 Sekunde. Auch 4 MIPS genannt. Für Million Instruction per Second. Das sind dann 4000 Befehle in 1ms und 4 Befehle in 1us.
Wir rufen aber alle 39us die Interrupt Routine für die PWM auf. Und der PIC schaft in der Zwischenzeit nur 39us * 4 Befehle = 156 Befehle. Wenn man jetzt bedenkt, dass dieser Interrupt schnell mal 100 Befehle hat und somit nur noch knapp 50 Behfehle für den Rest übrig bleiben. Dann haben wir schon fast 70% CPU Last und das nur durch die Interrupt Routine. 
Der PIC hat nur 50 Befehle zwischen dem ständigen aufrufen der ISR, ob das dann für den Rest noch reicht ?
Es könnte knapp werden.
Also denken wir mal weiter.....
 
2. Idee:
Wenn der Chip jetzt mit 32MHz getaktet ist. Schaft der schon 8 Befehle in 1 us.
Und er macht dann 39us * 8 = 312 Befehle in 39us.
Jetzt würde die Soft PWM Routine mit knapp 100 Befehlen nur noch 35% CPU Last aussmachen.
Und das sieht schon viel besser aus. Es wäre noch genug Power um auch im Hauptprogramm was zu erledigen.
 
Eine Idee weiter gedacht:
Wenn der Chip jetzt mit 64MHz getaktet ist. Schaft der schon 16 Befehle in 1 us.
Und er macht dann 39us * 16 = 624 Befehle in 39us.
Jetzt würde die Soft PWM Routine mit knapp 100 Befehlen nur noch 18% CPU Last aussmachen.
Was nochmal besser aussieht, wie mit 32MHz. Und der Rest im Hauptprogramm macht der Chip dann nebenbei.
 
Ich Versorge die Schaltung mit 5 Volt direkt aus dem PICKIT_3.
 
Das ganze Projekt dazu:SOFT_PWM.X:zip
 
 
 
 
Bit Angle Modulation
 
 
Um nochmal Rechnenzeit vom Chip einzusparen kann man durch eine geschickte Programmierung das nochmal optimieren.
Nenn sich dann Binary Code Modulation oder Bit Angle Modulation.
Wenn man die Idee aus der Soft PWM mal aufgreift und wieder mit 32MHz arbeitet. Bedeutet das, dass die LED bei 25% Helligkeit den Wert (255 * 0,25 =) 64 bekommt.
Und wenn man nun die ISR aufteillt in 8 Zyklen ergeben sich folgende ISR Zeiten:
1. Aufruf nach 40us     ( 40us *     1).
2. Aufruf nach 80us     ( 40us *     2).
3. Aufruf nach 160us   ( 40us *     4).
4. Aufruf nach 320us   ( 40us *     8).
5. Aufruf nach 640us   ( 40us *   16).
6. Aufruf nach 1280us ( 40us *   32).
7. Aufruf nach 2560us ( 40us *   64).
8. Aufruf nach 5120us ( 40us * 128).
 
Somit brauch man die ISR immer nur 8 mal aufzurufen, für die Soft PWM.
Man setzt zu Anfang alle LEDs auf HIGH und ruft die PWM Zyklisch auf.
Und Zyklisch ist hiermit die Zeit für die ISR gemeint, also 40us ist ein Zyklus.
Dann 80us sind 2 Zyklen, und dann nach 4,8,16,32,64,128 Zyklen.
Man muss in der ISR den neuen Wert für die kommende ISR immer wieder neu laden.
Aber man brauch viel weniger CPU Power für diese Art der Soft PWM.
 
Und wenn die LED nur mit 25% Helligkeit leuchten soll, würde man bei dem 5. Zyklus die LED ausschalten.
Man muss nur beim letzten Aufruf der ISR, wo sie am längsten Zeit brauch, ein Flag setzten um es mit dem Hauptprogramm zu synchronisieren. Sonst flackern die LEDs.
Es wird bei diesem Beispiel die CPU Last von ehemals 40% auf knapp 10% reduziert.
 
Ein Beispielprogramm dazu: kommt noch....
Dies ist eine kostenlose Homepage erstellt mit hPage.com.