Forum: Mikrocontroller und Digitale Elektronik PWM auf einem LPC2101


von Eduard S. (rfk)


Lesenswert?

Hallo allerseits. Leider habe ich auf meinem LPC2101 ein Problem beim 
Betrieb des P0.8 (MAT2.1) im PWM Modus (ohne Interrupts). Folgenden Code 
habe ich bisher:
1
// Configure P0.8
2
PINSEL0 &= ~(3<<16);
3
PINSEL0 |= 2<<16;
4
5
T2TCR = 1<<1;    // Reset TC and PC, disable timer
6
T2PR = 5;    // Prescaling
7
T2MCR = 1<<10;    // Reset on MR3 match
8
PWM0CON = 1<<3;    // Use single edged PWM for MR3
9
T2EMR = 1<<1 | 3<<6;  // Enable MAT2.1 and set toggle mode
10
11
// Setup PWM parameters
12
unsigned short cycles = 49152;
13
T2MR3 = cycles;    // Period duration
14
T2MR1 = cycles/4;  // Pulse width
15
T2TCR = 1<<0;    // Enable counter

Die Werte für Prescaling und die 'cycles' Variable werden normalerweise 
ausgerechnet, die obigen Werte sind nur Beispiele für F=200Hz 
(PCLK=58,982,400Hz). Mein Problem ist, dass der Puls für 5ms konstant 
HIGH und anschließend für 5ms konstant LOW ist (dann wieder 5ms HIGH 
usw.). MR1 wird scheinbar ignoriert. Hat jemand eine Idee, warum das so 
ist?

Danke!

von Omega G. (omega) Benutzerseite


Lesenswert?

Wenn ich mich recht erinnere, ist da der Fehler:
1
T2EMR = 1<<1 | 3<<6;  // Enable MAT2.1 and set toggle mode
Das muss lauten:
1
T2EMR = 1<<1 | 1<<7;  // Enable MAT2.1 and set toggle mode

von Eduard S. (rfk)


Lesenswert?

Danke für deine Antwort, funktioniert aber so leider auch nicht. In dem 
Fall bleibt das Signal konstant HIGH.

von Eduard S. (rfk)


Lesenswert?

Das Problem hat sich erledigt. Das Setzen von T2EMR war falsch, außerdem 
muss im PWMCON Register nicht das Bit der Periodendauer (MR3), sondern 
der Pulsbreite (MR1) gesetzt werden.
1
// Configure P0.8
2
PINSEL0 &= ~(3<<16);
3
PINSEL0 |= 2<<16;
4
5
T2TCR = 1<<1;    // Reset TC and PC, disable timer
6
T2PR = 5;    // Prescaling
7
T2MCR = 1<<10;    // Reset on MR3 match
8
PWM0CON = 1<<1;    // Use single edged PWM for MR1
9
10
// Setup PWM parameters
11
unsigned short cycles = 49152;
12
T2MR3 = cycles;    // Period duration
13
T2MR1 = cycles/4;  // Pulse width
14
T2TCR = 1<<0;    // Enable counter

Danke trotzdem an alle.

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.