A PWM library for LPC1768 that enables the sending of n number of PWM impulses through registry editing of LPC1768.
Diff: TruePWM.cpp
- Revision:
- 0:b3a0656d2b6e
- Child:
- 2:881243185b6a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TruePWM.cpp Mon Nov 30 02:41:40 2015 +0000 @@ -0,0 +1,135 @@ +#include "TruePWM.h" + + +TruePWM::TruePWM(PinName pin) { //Constructor that can target any pwm pin on MBED LPC1768 and LED1 for testing purposes + initTruePWM(); + switch ( pin ) { + case LED1: + LPC_GPIO1->FIODIR = 1 << 18; + LPC_PINCON->PINSEL3 = 0x00000020; + LPC_PINCON->PINMODE3 = 0x00000010; + break; + case p26: + LPC_PWM1->PCR |= 1 << 9; //Seting PRC register bit to 1 to enable single-egde mode + LPC_PINCON->PINSEL4 |= 1; //Enables pin as a PWM pin + LPC_PINCON->PINMODE4 |= (1<<1); //Disables pullups and pulldowns for pin + pulsewidth_us_ind (getPulsewidth(), 1); + break; + case p25: + LPC_PWM1->PCR |= 1 << 10; + LPC_PINCON->PINSEL4 |= (1<<2); + LPC_PINCON->PINMODE4 |= (1<<3); + pulsewidth_us_ind (getPulsewidth(), 2); + break; + case p24: + LPC_PWM1->PCR = 1 << 11; + LPC_PINCON->PINSEL4 |= (1<<4); + LPC_PINCON->PINMODE4 |= (1<<5); + pulsewidth_us_ind (getPulsewidth(), 3); + break; + case p23: + LPC_PWM1->PCR = 1 << 12; + LPC_PINCON->PINSEL4 |= (1<<6); + LPC_PINCON->PINMODE4 |= (1<<7); + pulsewidth_us_ind (getPulsewidth(), 4); + break; + case p22: + LPC_PWM1->PCR = 1 << 13; + LPC_PINCON->PINSEL4 |= (1<<8); + LPC_PINCON->PINMODE4 |= (1<<9); + pulsewidth_us_ind (getPulsewidth(), 5); + break; + case p21: + LPC_PWM1->PCR = 1 << 14; + LPC_PINCON->PINSEL4 |= (1<<10); + LPC_PINCON->PINMODE4 |= (1<<11); + pulsewidth_us_ind (getPulsewidth(), 6); + break; + default: + // Code + break; +} +} + + + +void TruePWM::initTruePWM() { + + LPC_SC->PCONP |= 1 << 6; //Tests if the pwm module is working + LPC_PWM1->TCR = 2; //Puts pwm module into reset mode + LPC_PWM1->IR = 0xff; //Clears interrupts + LPC_PWM1->PR = SystemCoreClock / (4 * 1000000) - 1; //Sets Prescale register valiue + LPC_PWM1->MR1 = 1000; //Sets a defoult pulsewidth if any other pin than p26 is selected +} + +void TruePWM::pulsewidth_us_ind (uint32_t ticks, char n){ //Internal function sets pulsewidth for coresponding pin + switch (n){ + case 1: //For P26 + LPC_PWM1->MR1 = ticks; + LPC_PWM1->LER = 2; + break; + case 2: //For P25 + LPC_PWM1->MR2 = ticks; + LPC_PWM1->LER |= 1 << 3; + break; + case 3: //For P24 + LPC_PWM1->MR3 = ticks; + LPC_PWM1->LER |= 1 << 4; + break; + case 4: //For P23 + LPC_PWM1->MR4 = ticks; + LPC_PWM1->LER |= 1 << 5; + break; + case 5: //For P22 + LPC_PWM1->MR5 = ticks; + LPC_PWM1->LER |= 1 << 6; + break; + case 6: //For P21 + LPC_PWM1->MR6 = ticks; + LPC_PWM1->LER |= 1 << 7; + break; + } +} + +void TruePWM::pulsewidth_us( uint32_t ticks ) { //sets pulsewidth for p26 + LPC_PWM1->MR1 = ticks; + LPC_PWM1->LER = 2; +} + +void TruePWM::period_us( uint32_t ticks ) { + LPC_PWM1->MR0 = ticks; //Fills pariod register with valiue + LPC_PWM1->LER = 1; //Enables the writen valiue +} + +void TruePWM::setDuty(float a){ //sets dity cycle + if (a<=1){ + LPC_PWM1->MR1 = LPC_PWM1->MR1*a; + LPC_PWM1->LER = 2; + }} + +uint32_t TruePWM::getPeriod() { + return LPC_PWM1->MR0; +} + +uint32_t TruePWM::getPulsewidth() { + return LPC_PWM1->MR1; +} + +void TruePWM::startPWM() { + LPC_PWM1->TCR = 0x00000009; //Enables CE and PWMEN bits +} + +void TruePWM::stopPWM() { + LPC_PWM1->MCR = 0x00000004; /*Enables PWMMR0S bit that stops + PWM output and diaables counter bit*/ +} + +void TruePWM::nImpulse(int n) { //Sends n number of impulses + if(LPC_PWM1->TCR != 0x00000009) + LPC_PWM1->TCR = 0x00000009; + float m= LPC_PWM1->MR0*n; + t0.attach_us(this,&TruePWM::stopPWM, m); +} + + +