A PWM library for LPC1768 that enables the sending of n number of PWM impulses through registry editing of LPC1768.
TruePWM.cpp@0:b3a0656d2b6e, 2015-11-30 (annotated)
- Committer:
- tPelko
- Date:
- Mon Nov 30 02:41:40 2015 +0000
- Revision:
- 0:b3a0656d2b6e
- Child:
- 2:881243185b6a
First version that works.; Needs a lot of work.
Who changed what in which revision?
User | Revision | Line number | New 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; |
tPelko | 0:b3a0656d2b6e | 130 | float m= LPC_PWM1->MR0*n; |
tPelko | 0:b3a0656d2b6e | 131 | t0.attach_us(this,&TruePWM::stopPWM, m); |
tPelko | 0:b3a0656d2b6e | 132 | } |
tPelko | 0:b3a0656d2b6e | 133 | |
tPelko | 0:b3a0656d2b6e | 134 | |
tPelko | 0:b3a0656d2b6e | 135 |