Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
10 years, 10 months ago.
PWM set up
Hi forum. Hope you are all well.
include the mbed library with this snippet
/* an attempt at PWM without using the mbed registers */ #define PINSEL4 (*(volatile unsigned char *)(0x4002C010)) #define PCONP (*(volatile unsigned char *)(0x400FC0C4)) #define PCLKSEL0 (*(volatile unsigned char *)(0x400FC1A8)) #define PINSEL0 (*(volatile unsigned char *)(0x4002C000)) #define PINMODE4 (*(volatile unsigned char *)(0x4002C050)) #define PWM1MR0 (*(volatile unsigned char *)(0x40018018)) #define PWM1MCR (*(volatile unsigned char *)(0x40018014)) #define PWM1TCR (*(volatile unsigned char *)(0x40018004)) #define PWM1MR5 (*(volatile unsigned char *)(0x40018044)) #define PWM1PCR (*(volatile unsigned char *)(0x4001804C)) int main(){ while(1){ PCONP |= 1 << 6; // power up PWM , powered up on reset, not requ PCLKSEL0 |= 1 << 12; // setting up the clock for pwm, clock = microcontroller clock i.e the prescaler value is 1. PINSEL4 |= 1 << 6; // p2.4 as PWM1 output PINMODE4 |= 1 << 9; // enable neither pull-up nor pull-down PWM1MR0 = 16; // PWM freq = PWM clock/16 PWM1MCR |= 1 << 1; // reset timer on Match0 PWM1MR5 = 8; // PWM duty cycle = 0.5 /* 8 is stored into MR5. therefore now one cycle of PWM waveform consists of 16PWM clock cycles and for 8 of them the PWM output will be high and for remaining 8 cycles it will be low. therefore the effective signal produced is a waveform of frequency (PWM clock/6) with a duty cycle of 0.5 */ PWM1TCR |= (1 << 0) | (1 << 3); // enable timer/counter /* select control mode for each channel(except channel ) and enable the PWM output */ PWM1PCR |= 1 << 4; //configure channel 4 as double edge , refer to table 451 pg 519 //settiing bits 2-6 to 0 enables single edge PWM1PCR |= 1 << 12; //enable PWM for channel 4 output PWM1PCR |= 1 << 13; // eanble PWM for channel 5 output , no need to configure channel 5 default is to 0 single side rise } }
I'm trying to get PWM working on any pin 2.4 I've managed to get the pin to light up, but i can't get voltage to vary when i change the value in PWM1MR5. Could someone please point me in the right direction to fix this. Many thanks.
2 Answers
10 years, 10 months ago.
I assume the LPC1768?
First of all, why make your own register definitions? LPC_PWM1->PCR is for the PCR register for example. What you miss for sure is the LER register, you need to write correct bits to cause the match registers to update.