baseline build
Dependencies: FastPWM mbed-os mbed
FullBridgeDriver.cpp@1:909f2393bc01, 2017-06-19 (annotated)
- 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?
User | Revision | Line number | New 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 |