baseline build

Dependencies:   FastPWM mbed-os mbed

Revision:
0:8a420ac6394e
diff -r 000000000000 -r 8a420ac6394e FullBridgeDriver.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/FullBridgeDriver.cpp	Mon Jun 19 15:55:51 2017 +0000
@@ -0,0 +1,115 @@
+#include "mbed.h"
+
+#include "FullBridgeDriver.h"
+
+FullBridgeDriver::FullBridgeDriver(void)
+{
+    // turn on power to PWM
+    // on by default LPC_SC->PCONP |= (1<<6);
+    isEnabled = false;
+    
+    // when the pins are used as GPIO - They should be outputs
+    LPC_GPIO2->FIODIR |= (1<<4);
+    LPC_GPIO2->FIODIR |= (1<<6);
+    
+    // and they should be low
+    LPC_GPIO2->FIOCLR = (1<<4);
+    LPC_GPIO2->FIOCLR = (1<<6);
+    
+    // enable PWM clock, set it to CCLK
+    // set to CCLK/4 by default
+    LPC_SC->PCLKSEL0 &= ~(3 << 12);
+    LPC_SC->PCLKSEL0 |= (1 << 12);
+    
+    // PWM on
+    LPC_SC->PCONP |= (1 << 6);
+    
+    // counter reset
+    LPC_PWM1->TCR = 2;
+    
+    // we don't use the prescaler
+    LPC_PWM1->PR = 0;
+    
+    // reset our counter on match of MR0
+    LPC_PWM1->MCR = (1<<1);
+    
+    // enable PWM5 and PWM6, set both as double edged
+    LPC_PWM1->PCR |= 0x5050;
+    
+    // set our starting frequency
+    ChangeFrequency(DEFAULT_PWM_FREQUENCY);
+    currentFrequency = DEFAULT_PWM_FREQUENCY;
+    
+    // counter enable, PWM enable
+    LPC_PWM1->TCR = (1<<0) | (1<<3);
+    
+}
+
+double FullBridgeDriver::GetActualFrequency(void)
+{
+    return (48.0 * 1000 / LPC_PWM1->MR5);
+}
+
+void FullBridgeDriver::SetState(double kHzFrequency)
+{
+    // update our frequency if requested
+    if( kHzFrequency != currentFrequency )
+    {
+        // Set the frequency
+        ChangeFrequency(kHzFrequency);
+        currentFrequency = kHzFrequency;
+    }
+}
+
+void FullBridgeDriver::Enable(bool enabled)
+{
+    // never mind if we're already in the correct state
+    if (enabled == isEnabled)
+        return;
+    isEnabled = enabled;
+        
+    // this clears the bit fields for pin selection, which sets them as GPIO
+    LPC_PINCON->PINSEL4 &=~(3<<6);            
+    LPC_PINCON->PINSEL4 &=~(3<<10);           
+    
+    // GPIO is what we want if we are disabling
+    if (!enabled)
+        return;
+    
+    // else set the bit fields to indicate that our output pins are PWM outputs
+    LPC_PINCON->PINSEL4 |= (1<<6);            
+    LPC_PINCON->PINSEL4 |= (1<<10);           
+    
+}
+
+void FullBridgeDriver::ChangeFrequency(double kHzFrequency)
+{
+    // calculate the timer period... we want the closest even number
+    // so that we can get a 50% duty cycle
+    double fTicks = 96000.0 / kHzFrequency;
+    double fDoubleTicks = fTicks / 2;
+    int doubleTicks = (int)(fDoubleTicks + 0.5);
+
+    // things are set up like this:
+    // PWM period: LPC_PWM1->MR0
+    // pwm2:
+    //     start counter: LPC_PWM1->MR3
+    //     stop counter: LPC_PWM1->MR4
+    // pwm1:
+    //     start counter: LPC_PWM1->MR5
+    //     stop counter: LPC_PWM1->MR6
+    LPC_PWM1->MR0 = doubleTicks * 2;
+    LPC_PWM1->MR3 = 5;      // set the pwm4 output high at this count
+    LPC_PWM1->MR4 = doubleTicks - 6;      // set the pwm4 output low at this count
+    LPC_PWM1->MR5 = doubleTicks;      // Set PWM6 output high at this count
+    LPC_PWM1->MR6 = doubleTicks * 2;      // Set PWM6 output low at this count
+
+    // enable PWM4 and PWM6, set both as double edge
+    LPC_PWM1->PCR |= 0x5050;
+
+    // this latches the values we set above into the shadow registers
+    LPC_PWM1->LER |= 0x79;
+      
+
+}
+