Forum: Mikrocontroller und Digitale Elektronik Pulsweitenmodulation mit Timern?


von Reinhard Sedlacek (Gast)


Lesenswert?

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

von Reinhard Sedlacek (Gast)


Lesenswert?

Oh Sorry, das ist ein Wald-und -Wiesen µC :) 8051 AN2131...

Gruß

von Mebo (Gast)


Lesenswert?

<--|
   |
   |--- !!!

von Mebo (Gast)


Lesenswert?

http://hugeurl.geeks.org/?ZTM0Nzg5Yjc4NjRlOTVmMDcwNjFmYjZjNjcyYzk3N2EmMTQmVm0wd2QyUXlVWGxWV0d4V1YwZDRXRmxVU205V01WbDNXa2M1VjFac2JETlhhMk0xWVd4S2MxZHFRbFZXYkhCUVZqQmFZV015U2tWVWJHaG9UVlZ3VlZadGNFZFpWMDE1VTJ0V1ZXSkhhRzlVVjNOM1pVWmFjVkZ0UmxSTmF6RTFWVEowVjFaWFNraGhSemxWVm0xb1JGWldXbUZrUjFaSFYyMTRVMkpIZHpGV2EyUXdZekpHYzFOdVVtaFNlbXhXVm1wT1QwMHhjRlpYYlVaclVqQTFSMXBGV2xOVWJGcFZWbXR3VjJKVVJYZFpWRVpyVTBaT2NscEhjRlJTVlhCWlZrWldZV1F4VGtkVmJGWlRZbFZhY1ZadGRHRk5SbFowWlVaT1ZXSlZXVEpWYkZKSFZqRmFSbUl6WkZkaGExcG9WakJhVDJOdFNrZFRiV3hUVFcxb1dsWXhaRFJpTWtsM1RVaG9XR0pIVWxsWmJGWmhZMnhXYzFWclpGaGlSM1F6VjJ0U1UxWnJNWEpqUld4aFUwaENTRlpxU2tabFZsWlpXa1p3VjFKV2NIbFdWRUpoVkRKT2MyTkZhR3BTYkVwVVZteG9RMWRzV25KWGJHUm9UVlpXTlZaWE5VOWhiRXAwVld4c1dtSkdXbWhaTVZwelkyeGtkRkp0ZUZkaVZrbzFWbXBKTVdFeFdYZE5WVlpUWVRGd1YxbHJXa3RTUmxweFVWaG9hMVpzV2pGV01uaGhZVWRGZUdOR2JGaGhNVnBvVmtSS1QyUkdUbkphUmxKcFZqTm9XVlpYY0U5aU1XUkhWMjVTVGxOSFVuTlZha0p6VGtaVmVXUkhkR2hXYXpWSFZqSjRVMWR0U2toaFJsSlhUVlp3V0ZreFdrdGpiVkpIVld4a2FWSnRPVE5XTW5oWFlqSkZlRmRZWkU1V1ZscFVXVlJHZDFkR2JISmFSemxxWWtad2VGVXlkR0ZpUmxwelYyeHdXR0V4Y0hKWlZXUkdaVWRPUjJGR2FHbFNia0p2Vm10U1MxUXlVa2RUYmtwaFVtMW9jRlpxVG05V1ZscEhXVE5vYVUxc1NucFdNalZUVkd4a1NGVnNXbFZXTTFKNlZHeGFWMlJIVWtoa1JtUk9ZVE5DTlZaSGVHRmpNV1IwVTJ0b2FGSnNTbGhVVlZwM1ZrWmFjVkp1WkZOTlZrcDVWR3hhVDJGWFJYZGpSV3hYWWxoQ1RGUnJXbEpsUm1SellVWlNhVkp1UW5oV1YzaHJWVEZzVjFWc1dsaGlWVnBQVkZaYWQyVkdWWGxrUkVKV1RVUkdlVlJzVm5kV01ERnhVbXRvVjFaRldreFdNVnBIWTIxS1IxcEdaRTVOUlhCS1ZtMTBVMU14VlhoWFdHaGhVMFphVmxscldrdGpSbHB4VTIwNWJHSkhVbGxhVldNMVlWVXhjbUpFVWxkTmFsWlVWa2Q0YTFOR1ZuTlhiRlpYWWtoQ1dWWkhkR0ZoTWs1elYyNVNhMUp0VW5CV2JHaERUbXhhVlZOVVJsVk5WbkF3VlcwMVMxUXhXbk5UYlVaVlZteHdNMXBYZUhKbFYxWkpXa1pPVGxacmNEVldSM2hoVkRKR1YxTnVVbEJXUlRWWVdWUkdkMkZHYkhGVGExcHNWbXR3ZVZkcldtOWhWMFkyVm01b1YxWkZTblpWVkVaelZqRldjMWRzYUdsaVZrcDVWMWQwWVdReVZrZFdibEpyVWtWS1YxUlhkSGRUVmxwWVkwVk9XR0pHY0ZoWk1GSlBWMjFGZVZWclpHRldWMUpRVlRCVk5WWXlSa2hoUlRWWFltdEtNbFp0ZUc5a01VbDVVbGhvWVZKWFVsZFpiWFIzWVVaV2RFMVhPV3BTYkhCNFZrY3dOVll4V25OalJXaFlWa1UxZGxsV1ZYaFhSbFp6WVVaa1RsWXlhREpXTVZwaFV6RktjMVJ1VWxCV2JGcFlWRlJHUzA1c1draGtSMFpYWWxaYVdWWlhkRzloTVVwMFZXczVWMkZyV2t4Vk1uaHJWakZhZEZKdGNFNVdNVWwzVmxSS01HRXhaRWhUYkdob1VtMW9ZVmxVUm5kTk1WbDNWMjVLYkZKdFVubGFSV1IzWVZaYWNtTkZiRmRpUjFFd1ZrUktSMVl4VW5KWGJGSm9UVEZLV1ZaR1l6RmlNV1JIWWtaV1UyRXpRbk5WYlRGVFpXeHNWbGRzVG1oV2EzQXhWVmQ0YzFkR1duUlZWRUpXWld0YWNsVnFSbGRqTVhCSFlVZG9UazFWY0ZkV2JHTjRUa2RSZVZaclpGZFhSM2h5Vld0V1MxZEdVbGRYYm1Sc1ZtMTBNMVl5Tld0WFJrbDNWbXBTV2sxR1NsQldNbmhoVjBaV2NscEhSbGROTW1oSlYxUkplRk14U1hoalJXaHBVbTFTVkZadE1UQk9WbHB4VTJwU1YwMVhlRmhXVm1odldWWktXRlZzWkZwaVdGSXpXVlZhVjJSSFZrWmtSM0JUWWtoQ05GWnJZM2RPVjBWNVUydG9WbUp1UWxsWlZFWkxWa1paZVdWSFJtdFNiRnA2V1ZWYWExUnRSbk5YYkZaWFlUSlJNRlpFUms5VFJrcHlXa1pLYVZKdVFuZFdha0poVXpBMWMxZHJaRlpoTWxKWFZGWmFkMDFHVm5Sa1J6bFdVbXh3TUZaWE5VTldiVVp5VjJ0NFZrMXVhSEpXYWtaaFpFWktjMWRyTlZkaVdHTjRWbXhrTkdJeVRYaFhiazVZWVRGd1ZWbHJaRzlYUm14WVkzcEdhMkpIZUZkV01qRkhZV3hhY21OSWNGaGhNWEIyVm1wS1MyTnNUbkppUm1SWFlsWkZkMVl4V21GWGJWWkhWRzVLV0dKRk5WaFZiRnBXVGxFOVBRPT0=

2te Link!

von Wolfgang Steinecker (Gast)


Lesenswert?

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...

von Thomas E. (thomase)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.