A PWM library for LPC1768 that enables the sending of n number of PWM impulses through registry editing of LPC1768.

TruePWM.cpp

Committer:
mcmrk
Date:
2016-10-27
Revision:
2:881243185b6a
Parent:
0:b3a0656d2b6e

File content as of revision 2:881243185b6a:

#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;
    LPC_PWM1->MCR &= ~0x4;             //resets PWMR0S bit to its original state (0) so nImpulse can be called again without problems
    float m= LPC_PWM1->MR0*n;
    t0.attach_us(this,&TruePWM::stopPWM, m);
}