Guten Abend, Hab eine Frage, wie kann man ein PWM-Signal in C programmieren ? Ich kann es nur mit for-Schleifen. Nachteil dabei ist das sich die Periodendauer ändert. Sie sollte konstant bleiben, und nur die Einschaltzeit bzw. die Ausschaltzeit sollte sich ändern. Habe gelesen im net das es mit Timern besser geht, habe abee keinen Plan wie. Bin für jeden Tipp dankbar, Gruß Reinhard
Ich habe gesucht, finde aber nichts... Echt ne Frechheit was paar Leute hier machen auf diesem Forum, ich zum Beispiel brauche echt Hilfe, mich interessiert das. "Mebo" ist vielleicht einer der alles checkt und die fragenden immer so behandelt. Ich möchte dich gerne sehen wenn du mal was nicht weist...
Reinhard Sedlacek schrieb: > Ich kann es nur mit for-Schleifen. ??? Hmmh... Für eine Soft-PWM braucht man einen Zähler und eine Variable, in der der PWM-Wert drinsteht. volatile unsigned char nPwmCt, nPwmVar; void SoftPwm (void) { if (!nPwmVar) Ausgang = 0; else { if (nPwmVar >= nPwmCt) Ausgang = 1; else Ausgang = 0; } nPwmCt++; _delay(xxx); //Optionale Einstellung der Frequenz } Das in der Hauptprogrammschleife ausgeführt, ergibt, je nachdem was noch alles gemacht wird, einen mehr oder weniger großen Jitter. Zum Dimmen einer LED ist das völlig egal. Auch die Frequenz spielt keine große Rolle, sofern sie so hoch ist, daß die LED nicht flackert. Die Frequenz ist aber weitestgehend stabil. In einem Timer-Interrupt wird dieser Jitter deutlich kleiner. Dazu packt man einfach obige Funktion in die Timer-ISR. Ohne das Delay. Das hat da nichts zu suchen. Und je nach Konfiguration des Timers, wird die ISR entsprechend häufig aufgerufen. Damit wird die Frequenz eingestellt. Alles völlig unabhängig vom verwendeten Controller. Für eine Jitter-freie PWM braucht man allerdings die Hardware-Variante mit einem Timer. Jedoch entzieht es sich meiner Kenntnis ob der > 8051 AN2131... das kann. Die alten Atmegas können das teilweise, die neueren mit allen Timern. Das ist vom Controller und seinen Möglichkeiten sowie den spezifischen Registereinstellungen abhängig. mfg.
Wolfgang Steinecker schrieb: > Ich habe gesucht, finde aber nichts... So dämlich kann man sich doch kaum anstellen. Hat keine 5 Minuten gedauert: http://www.100y.com.tw/pdf_file/AN2131.pdf Anhang C.2 beschreibt die Timer. Interrupts werden in dem Doc auch beschrieben. Beispiele finden sich auch (hat nochmal 5 Minuten gedauert):
1 | ;Timer setup for PWM |
2 | CODE: |
3 | PWMPIN EQU P1.0 ; PWM output pin |
4 | PWM_SETUP: |
5 | MOV TMOD,#00H ; Timer0 in Mode 0 |
6 | MOV R7, #160 ; Set pulse width control |
7 | SETB EA ; Enable Interrupts |
8 | SETB ET0 ; Enable Timer 0 Interrupt |
9 | SETB TR0 ; Start Timer |
10 | RET |
11 | |
12 | ;Interrupt Service Routine |
13 | CODE: |
14 | TIMER_0_INTERRUPT: |
15 | JB F0, HIGH_DONE ; If F0 flag is set then we just finished |
16 | ; the high section of the |
17 | LOW_DONE: ; cycle so Jump to HIGH_DONE |
18 | SETB F0 ; Make F0=1 to indicate start of high section |
19 | SETB PWMPIN ; Make PWM output pin High |
20 | MOV TH0, R7 ; Load high byte of timer with R7 |
21 | ; (pulse width control value) |
22 | CLR TF0 ; Clear the Timer 0 interrupt flag |
23 | RETI ; Return from Interrupt to where |
24 | ; the program came from |
25 | HIGH_DONE: |
26 | CLR F0 ; Make F0=0 to indicate start of low section |
27 | CLR PWMPIN ; Make PWM output pin low |
28 | MOV A, #0FFH ; Move FFH (255) to A |
29 | CLR C ; Clear C (the carry bit) so it does |
30 | ; not affect the subtraction |
31 | SUBB A, R7 ; Subtract R7 from A. A = 255 - R7. |
32 | MOV TH0, A ; so the value loaded into TH0 + R7 = 255 |
33 | CLR TF0 ; Clear the Timer 0 interrupt flag |
34 | RETI ; Return from Interrupt to where |
35 | ; the program came from |
Auf der selben Seite gibts auch C-Code, den darfst Du jetzt aber selber suchen.
Wolfgang Steinecker schrieb: > Echt ne Frechheit was paar Leute hier machen auf diesem Forum Ja. Wie wär's, wenn du dich erstmal für einen Namen entscheiden würdest?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.