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

Committer:
mcmrk
Date:
Thu Oct 27 08:00:58 2016 +0000
Revision:
2:881243185b6a
Parent:
0:b3a0656d2b6e
updated nImpulse function. sets PWMMR0S bit to its original state

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tPelko 0:b3a0656d2b6e 1 #include "TruePWM.h"
tPelko 0:b3a0656d2b6e 2
tPelko 0:b3a0656d2b6e 3
tPelko 0:b3a0656d2b6e 4 TruePWM::TruePWM(PinName pin) { //Constructor that can target any pwm pin on MBED LPC1768 and LED1 for testing purposes
tPelko 0:b3a0656d2b6e 5 initTruePWM();
tPelko 0:b3a0656d2b6e 6 switch ( pin ) {
tPelko 0:b3a0656d2b6e 7 case LED1:
tPelko 0:b3a0656d2b6e 8 LPC_GPIO1->FIODIR = 1 << 18;
tPelko 0:b3a0656d2b6e 9 LPC_PINCON->PINSEL3 = 0x00000020;
tPelko 0:b3a0656d2b6e 10 LPC_PINCON->PINMODE3 = 0x00000010;
tPelko 0:b3a0656d2b6e 11 break;
tPelko 0:b3a0656d2b6e 12 case p26:
tPelko 0:b3a0656d2b6e 13 LPC_PWM1->PCR |= 1 << 9; //Seting PRC register bit to 1 to enable single-egde mode
tPelko 0:b3a0656d2b6e 14 LPC_PINCON->PINSEL4 |= 1; //Enables pin as a PWM pin
tPelko 0:b3a0656d2b6e 15 LPC_PINCON->PINMODE4 |= (1<<1); //Disables pullups and pulldowns for pin
tPelko 0:b3a0656d2b6e 16 pulsewidth_us_ind (getPulsewidth(), 1);
tPelko 0:b3a0656d2b6e 17 break;
tPelko 0:b3a0656d2b6e 18 case p25:
tPelko 0:b3a0656d2b6e 19 LPC_PWM1->PCR |= 1 << 10;
tPelko 0:b3a0656d2b6e 20 LPC_PINCON->PINSEL4 |= (1<<2);
tPelko 0:b3a0656d2b6e 21 LPC_PINCON->PINMODE4 |= (1<<3);
tPelko 0:b3a0656d2b6e 22 pulsewidth_us_ind (getPulsewidth(), 2);
tPelko 0:b3a0656d2b6e 23 break;
tPelko 0:b3a0656d2b6e 24 case p24:
tPelko 0:b3a0656d2b6e 25 LPC_PWM1->PCR = 1 << 11;
tPelko 0:b3a0656d2b6e 26 LPC_PINCON->PINSEL4 |= (1<<4);
tPelko 0:b3a0656d2b6e 27 LPC_PINCON->PINMODE4 |= (1<<5);
tPelko 0:b3a0656d2b6e 28 pulsewidth_us_ind (getPulsewidth(), 3);
tPelko 0:b3a0656d2b6e 29 break;
tPelko 0:b3a0656d2b6e 30 case p23:
tPelko 0:b3a0656d2b6e 31 LPC_PWM1->PCR = 1 << 12;
tPelko 0:b3a0656d2b6e 32 LPC_PINCON->PINSEL4 |= (1<<6);
tPelko 0:b3a0656d2b6e 33 LPC_PINCON->PINMODE4 |= (1<<7);
tPelko 0:b3a0656d2b6e 34 pulsewidth_us_ind (getPulsewidth(), 4);
tPelko 0:b3a0656d2b6e 35 break;
tPelko 0:b3a0656d2b6e 36 case p22:
tPelko 0:b3a0656d2b6e 37 LPC_PWM1->PCR = 1 << 13;
tPelko 0:b3a0656d2b6e 38 LPC_PINCON->PINSEL4 |= (1<<8);
tPelko 0:b3a0656d2b6e 39 LPC_PINCON->PINMODE4 |= (1<<9);
tPelko 0:b3a0656d2b6e 40 pulsewidth_us_ind (getPulsewidth(), 5);
tPelko 0:b3a0656d2b6e 41 break;
tPelko 0:b3a0656d2b6e 42 case p21:
tPelko 0:b3a0656d2b6e 43 LPC_PWM1->PCR = 1 << 14;
tPelko 0:b3a0656d2b6e 44 LPC_PINCON->PINSEL4 |= (1<<10);
tPelko 0:b3a0656d2b6e 45 LPC_PINCON->PINMODE4 |= (1<<11);
tPelko 0:b3a0656d2b6e 46 pulsewidth_us_ind (getPulsewidth(), 6);
tPelko 0:b3a0656d2b6e 47 break;
tPelko 0:b3a0656d2b6e 48 default:
tPelko 0:b3a0656d2b6e 49 // Code
tPelko 0:b3a0656d2b6e 50 break;
tPelko 0:b3a0656d2b6e 51 }
tPelko 0:b3a0656d2b6e 52 }
tPelko 0:b3a0656d2b6e 53
tPelko 0:b3a0656d2b6e 54
tPelko 0:b3a0656d2b6e 55
tPelko 0:b3a0656d2b6e 56 void TruePWM::initTruePWM() {
tPelko 0:b3a0656d2b6e 57
tPelko 0:b3a0656d2b6e 58 LPC_SC->PCONP |= 1 << 6; //Tests if the pwm module is working
tPelko 0:b3a0656d2b6e 59 LPC_PWM1->TCR = 2; //Puts pwm module into reset mode
tPelko 0:b3a0656d2b6e 60 LPC_PWM1->IR = 0xff; //Clears interrupts
tPelko 0:b3a0656d2b6e 61 LPC_PWM1->PR = SystemCoreClock / (4 * 1000000) - 1; //Sets Prescale register valiue
tPelko 0:b3a0656d2b6e 62 LPC_PWM1->MR1 = 1000; //Sets a defoult pulsewidth if any other pin than p26 is selected
tPelko 0:b3a0656d2b6e 63 }
tPelko 0:b3a0656d2b6e 64
tPelko 0:b3a0656d2b6e 65 void TruePWM::pulsewidth_us_ind (uint32_t ticks, char n){ //Internal function sets pulsewidth for coresponding pin
tPelko 0:b3a0656d2b6e 66 switch (n){
tPelko 0:b3a0656d2b6e 67 case 1: //For P26
tPelko 0:b3a0656d2b6e 68 LPC_PWM1->MR1 = ticks;
tPelko 0:b3a0656d2b6e 69 LPC_PWM1->LER = 2;
tPelko 0:b3a0656d2b6e 70 break;
tPelko 0:b3a0656d2b6e 71 case 2: //For P25
tPelko 0:b3a0656d2b6e 72 LPC_PWM1->MR2 = ticks;
tPelko 0:b3a0656d2b6e 73 LPC_PWM1->LER |= 1 << 3;
tPelko 0:b3a0656d2b6e 74 break;
tPelko 0:b3a0656d2b6e 75 case 3: //For P24
tPelko 0:b3a0656d2b6e 76 LPC_PWM1->MR3 = ticks;
tPelko 0:b3a0656d2b6e 77 LPC_PWM1->LER |= 1 << 4;
tPelko 0:b3a0656d2b6e 78 break;
tPelko 0:b3a0656d2b6e 79 case 4: //For P23
tPelko 0:b3a0656d2b6e 80 LPC_PWM1->MR4 = ticks;
tPelko 0:b3a0656d2b6e 81 LPC_PWM1->LER |= 1 << 5;
tPelko 0:b3a0656d2b6e 82 break;
tPelko 0:b3a0656d2b6e 83 case 5: //For P22
tPelko 0:b3a0656d2b6e 84 LPC_PWM1->MR5 = ticks;
tPelko 0:b3a0656d2b6e 85 LPC_PWM1->LER |= 1 << 6;
tPelko 0:b3a0656d2b6e 86 break;
tPelko 0:b3a0656d2b6e 87 case 6: //For P21
tPelko 0:b3a0656d2b6e 88 LPC_PWM1->MR6 = ticks;
tPelko 0:b3a0656d2b6e 89 LPC_PWM1->LER |= 1 << 7;
tPelko 0:b3a0656d2b6e 90 break;
tPelko 0:b3a0656d2b6e 91 }
tPelko 0:b3a0656d2b6e 92 }
tPelko 0:b3a0656d2b6e 93
tPelko 0:b3a0656d2b6e 94 void TruePWM::pulsewidth_us( uint32_t ticks ) { //sets pulsewidth for p26
tPelko 0:b3a0656d2b6e 95 LPC_PWM1->MR1 = ticks;
tPelko 0:b3a0656d2b6e 96 LPC_PWM1->LER = 2;
tPelko 0:b3a0656d2b6e 97 }
tPelko 0:b3a0656d2b6e 98
tPelko 0:b3a0656d2b6e 99 void TruePWM::period_us( uint32_t ticks ) {
tPelko 0:b3a0656d2b6e 100 LPC_PWM1->MR0 = ticks; //Fills pariod register with valiue
tPelko 0:b3a0656d2b6e 101 LPC_PWM1->LER = 1; //Enables the writen valiue
tPelko 0:b3a0656d2b6e 102 }
tPelko 0:b3a0656d2b6e 103
tPelko 0:b3a0656d2b6e 104 void TruePWM::setDuty(float a){ //sets dity cycle
tPelko 0:b3a0656d2b6e 105 if (a<=1){
tPelko 0:b3a0656d2b6e 106 LPC_PWM1->MR1 = LPC_PWM1->MR1*a;
tPelko 0:b3a0656d2b6e 107 LPC_PWM1->LER = 2;
tPelko 0:b3a0656d2b6e 108 }}
tPelko 0:b3a0656d2b6e 109
tPelko 0:b3a0656d2b6e 110 uint32_t TruePWM::getPeriod() {
tPelko 0:b3a0656d2b6e 111 return LPC_PWM1->MR0;
tPelko 0:b3a0656d2b6e 112 }
tPelko 0:b3a0656d2b6e 113
tPelko 0:b3a0656d2b6e 114 uint32_t TruePWM::getPulsewidth() {
tPelko 0:b3a0656d2b6e 115 return LPC_PWM1->MR1;
tPelko 0:b3a0656d2b6e 116 }
tPelko 0:b3a0656d2b6e 117
tPelko 0:b3a0656d2b6e 118 void TruePWM::startPWM() {
tPelko 0:b3a0656d2b6e 119 LPC_PWM1->TCR = 0x00000009; //Enables CE and PWMEN bits
tPelko 0:b3a0656d2b6e 120 }
tPelko 0:b3a0656d2b6e 121
tPelko 0:b3a0656d2b6e 122 void TruePWM::stopPWM() {
tPelko 0:b3a0656d2b6e 123 LPC_PWM1->MCR = 0x00000004; /*Enables PWMMR0S bit that stops
tPelko 0:b3a0656d2b6e 124 PWM output and diaables counter bit*/
tPelko 0:b3a0656d2b6e 125 }
tPelko 0:b3a0656d2b6e 126
tPelko 0:b3a0656d2b6e 127 void TruePWM::nImpulse(int n) { //Sends n number of impulses
tPelko 0:b3a0656d2b6e 128 if(LPC_PWM1->TCR != 0x00000009)
tPelko 0:b3a0656d2b6e 129 LPC_PWM1->TCR = 0x00000009;
mcmrk 2:881243185b6a 130 LPC_PWM1->MCR &= ~0x4; //resets PWMR0S bit to its original state (0) so nImpulse can be called again without problems
tPelko 0:b3a0656d2b6e 131 float m= LPC_PWM1->MR0*n;
tPelko 0:b3a0656d2b6e 132 t0.attach_us(this,&TruePWM::stopPWM, m);
tPelko 0:b3a0656d2b6e 133 }
tPelko 0:b3a0656d2b6e 134
tPelko 0:b3a0656d2b6e 135
tPelko 0:b3a0656d2b6e 136