baseline build

Dependencies:   FastPWM mbed-os mbed

Committer:
jrhodes5150
Date:
Mon Jun 19 16:04:47 2017 +0000
Revision:
1:909f2393bc01
Parent:
0:8a420ac6394e
added fastPWM

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jrhodes5150 0:8a420ac6394e 1 #include "mbed.h"
jrhodes5150 0:8a420ac6394e 2
jrhodes5150 0:8a420ac6394e 3 #include "FullBridgeDriver.h"
jrhodes5150 0:8a420ac6394e 4
jrhodes5150 0:8a420ac6394e 5 FullBridgeDriver::FullBridgeDriver(void)
jrhodes5150 0:8a420ac6394e 6 {
jrhodes5150 0:8a420ac6394e 7 // turn on power to PWM
jrhodes5150 0:8a420ac6394e 8 // on by default LPC_SC->PCONP |= (1<<6);
jrhodes5150 0:8a420ac6394e 9 isEnabled = false;
jrhodes5150 0:8a420ac6394e 10
jrhodes5150 0:8a420ac6394e 11 // when the pins are used as GPIO - They should be outputs
jrhodes5150 0:8a420ac6394e 12 LPC_GPIO2->FIODIR |= (1<<4);
jrhodes5150 0:8a420ac6394e 13 LPC_GPIO2->FIODIR |= (1<<6);
jrhodes5150 0:8a420ac6394e 14
jrhodes5150 0:8a420ac6394e 15 // and they should be low
jrhodes5150 0:8a420ac6394e 16 LPC_GPIO2->FIOCLR = (1<<4);
jrhodes5150 0:8a420ac6394e 17 LPC_GPIO2->FIOCLR = (1<<6);
jrhodes5150 0:8a420ac6394e 18
jrhodes5150 0:8a420ac6394e 19 // enable PWM clock, set it to CCLK
jrhodes5150 0:8a420ac6394e 20 // set to CCLK/4 by default
jrhodes5150 0:8a420ac6394e 21 LPC_SC->PCLKSEL0 &= ~(3 << 12);
jrhodes5150 0:8a420ac6394e 22 LPC_SC->PCLKSEL0 |= (1 << 12);
jrhodes5150 0:8a420ac6394e 23
jrhodes5150 0:8a420ac6394e 24 // PWM on
jrhodes5150 0:8a420ac6394e 25 LPC_SC->PCONP |= (1 << 6);
jrhodes5150 0:8a420ac6394e 26
jrhodes5150 0:8a420ac6394e 27 // counter reset
jrhodes5150 0:8a420ac6394e 28 LPC_PWM1->TCR = 2;
jrhodes5150 0:8a420ac6394e 29
jrhodes5150 0:8a420ac6394e 30 // we don't use the prescaler
jrhodes5150 0:8a420ac6394e 31 LPC_PWM1->PR = 0;
jrhodes5150 0:8a420ac6394e 32
jrhodes5150 0:8a420ac6394e 33 // reset our counter on match of MR0
jrhodes5150 0:8a420ac6394e 34 LPC_PWM1->MCR = (1<<1);
jrhodes5150 0:8a420ac6394e 35
jrhodes5150 0:8a420ac6394e 36 // enable PWM5 and PWM6, set both as double edged
jrhodes5150 0:8a420ac6394e 37 LPC_PWM1->PCR |= 0x5050;
jrhodes5150 0:8a420ac6394e 38
jrhodes5150 0:8a420ac6394e 39 // set our starting frequency
jrhodes5150 0:8a420ac6394e 40 ChangeFrequency(DEFAULT_PWM_FREQUENCY);
jrhodes5150 0:8a420ac6394e 41 currentFrequency = DEFAULT_PWM_FREQUENCY;
jrhodes5150 0:8a420ac6394e 42
jrhodes5150 0:8a420ac6394e 43 // counter enable, PWM enable
jrhodes5150 0:8a420ac6394e 44 LPC_PWM1->TCR = (1<<0) | (1<<3);
jrhodes5150 0:8a420ac6394e 45
jrhodes5150 0:8a420ac6394e 46 }
jrhodes5150 0:8a420ac6394e 47
jrhodes5150 0:8a420ac6394e 48 double FullBridgeDriver::GetActualFrequency(void)
jrhodes5150 0:8a420ac6394e 49 {
jrhodes5150 0:8a420ac6394e 50 return (48.0 * 1000 / LPC_PWM1->MR5);
jrhodes5150 0:8a420ac6394e 51 }
jrhodes5150 0:8a420ac6394e 52
jrhodes5150 0:8a420ac6394e 53 void FullBridgeDriver::SetState(double kHzFrequency)
jrhodes5150 0:8a420ac6394e 54 {
jrhodes5150 0:8a420ac6394e 55 // update our frequency if requested
jrhodes5150 0:8a420ac6394e 56 if( kHzFrequency != currentFrequency )
jrhodes5150 0:8a420ac6394e 57 {
jrhodes5150 0:8a420ac6394e 58 // Set the frequency
jrhodes5150 0:8a420ac6394e 59 ChangeFrequency(kHzFrequency);
jrhodes5150 0:8a420ac6394e 60 currentFrequency = kHzFrequency;
jrhodes5150 0:8a420ac6394e 61 }
jrhodes5150 0:8a420ac6394e 62 }
jrhodes5150 0:8a420ac6394e 63
jrhodes5150 0:8a420ac6394e 64 void FullBridgeDriver::Enable(bool enabled)
jrhodes5150 0:8a420ac6394e 65 {
jrhodes5150 0:8a420ac6394e 66 // never mind if we're already in the correct state
jrhodes5150 0:8a420ac6394e 67 if (enabled == isEnabled)
jrhodes5150 0:8a420ac6394e 68 return;
jrhodes5150 0:8a420ac6394e 69 isEnabled = enabled;
jrhodes5150 0:8a420ac6394e 70
jrhodes5150 0:8a420ac6394e 71 // this clears the bit fields for pin selection, which sets them as GPIO
jrhodes5150 0:8a420ac6394e 72 LPC_PINCON->PINSEL4 &=~(3<<6);
jrhodes5150 0:8a420ac6394e 73 LPC_PINCON->PINSEL4 &=~(3<<10);
jrhodes5150 0:8a420ac6394e 74
jrhodes5150 0:8a420ac6394e 75 // GPIO is what we want if we are disabling
jrhodes5150 0:8a420ac6394e 76 if (!enabled)
jrhodes5150 0:8a420ac6394e 77 return;
jrhodes5150 0:8a420ac6394e 78
jrhodes5150 0:8a420ac6394e 79 // else set the bit fields to indicate that our output pins are PWM outputs
jrhodes5150 0:8a420ac6394e 80 LPC_PINCON->PINSEL4 |= (1<<6);
jrhodes5150 0:8a420ac6394e 81 LPC_PINCON->PINSEL4 |= (1<<10);
jrhodes5150 0:8a420ac6394e 82
jrhodes5150 0:8a420ac6394e 83 }
jrhodes5150 0:8a420ac6394e 84
jrhodes5150 0:8a420ac6394e 85 void FullBridgeDriver::ChangeFrequency(double kHzFrequency)
jrhodes5150 0:8a420ac6394e 86 {
jrhodes5150 0:8a420ac6394e 87 // calculate the timer period... we want the closest even number
jrhodes5150 0:8a420ac6394e 88 // so that we can get a 50% duty cycle
jrhodes5150 0:8a420ac6394e 89 double fTicks = 96000.0 / kHzFrequency;
jrhodes5150 0:8a420ac6394e 90 double fDoubleTicks = fTicks / 2;
jrhodes5150 0:8a420ac6394e 91 int doubleTicks = (int)(fDoubleTicks + 0.5);
jrhodes5150 0:8a420ac6394e 92
jrhodes5150 0:8a420ac6394e 93 // things are set up like this:
jrhodes5150 0:8a420ac6394e 94 // PWM period: LPC_PWM1->MR0
jrhodes5150 0:8a420ac6394e 95 // pwm2:
jrhodes5150 0:8a420ac6394e 96 // start counter: LPC_PWM1->MR3
jrhodes5150 0:8a420ac6394e 97 // stop counter: LPC_PWM1->MR4
jrhodes5150 0:8a420ac6394e 98 // pwm1:
jrhodes5150 0:8a420ac6394e 99 // start counter: LPC_PWM1->MR5
jrhodes5150 0:8a420ac6394e 100 // stop counter: LPC_PWM1->MR6
jrhodes5150 0:8a420ac6394e 101 LPC_PWM1->MR0 = doubleTicks * 2;
jrhodes5150 0:8a420ac6394e 102 LPC_PWM1->MR3 = 5; // set the pwm4 output high at this count
jrhodes5150 0:8a420ac6394e 103 LPC_PWM1->MR4 = doubleTicks - 6; // set the pwm4 output low at this count
jrhodes5150 0:8a420ac6394e 104 LPC_PWM1->MR5 = doubleTicks; // Set PWM6 output high at this count
jrhodes5150 0:8a420ac6394e 105 LPC_PWM1->MR6 = doubleTicks * 2; // Set PWM6 output low at this count
jrhodes5150 0:8a420ac6394e 106
jrhodes5150 0:8a420ac6394e 107 // enable PWM4 and PWM6, set both as double edge
jrhodes5150 0:8a420ac6394e 108 LPC_PWM1->PCR |= 0x5050;
jrhodes5150 0:8a420ac6394e 109
jrhodes5150 0:8a420ac6394e 110 // this latches the values we set above into the shadow registers
jrhodes5150 0:8a420ac6394e 111 LPC_PWM1->LER |= 0x79;
jrhodes5150 0:8a420ac6394e 112
jrhodes5150 0:8a420ac6394e 113
jrhodes5150 0:8a420ac6394e 114 }
jrhodes5150 0:8a420ac6394e 115