Three phase bridge control

Dependents:   BLDC_control BLDC_RPM_meter

Revision:
1:ba7889accd61
Parent:
0:a129854eb4b6
--- a/ThreePhaseBridge.cpp	Tue Mar 11 15:42:38 2014 +0000
+++ b/ThreePhaseBridge.cpp	Tue Jul 08 17:37:12 2014 +0000
@@ -16,36 +16,53 @@
     lowSide[0] = &sw2;
     lowSide[1] = &sw4;
     lowSide[2] = &sw6;
-    switchesState = 63;
+    switchesState = activeState == ActiveLow ? 63 : 0;
     setSwitchesState(0);
-    state = 0; stateIndex = 5;
+    m_state = 0; stateIndex = 5;
+    period(10e-6);
+    pulsewidth(15e-6);
+}
+
+void ThreePhaseBridge::period(double seconds)
+{
+    pwmPeriod = seconds;
+    pwmPulseWidthOff = activeState == ActiveLow ? pwmPeriod * 1.1 : 0.0;
+    sw1.period(seconds);
+    sw3.period(seconds);
+    sw5.period(seconds);
 }
 
-void ThreePhaseBridge::setPwmPeriod_us(int32_t period_us)
+void ThreePhaseBridge::pulsewidth(double seconds)
 {
-    pwmPeriod_us = period_us;
-    sw1.period_us(period_us);
-    sw3.period_us(period_us);
-    sw5.period_us(period_us);
-}
-
-void ThreePhaseBridge::setPwmPulseWidth_us(int32_t pulseWidth_us)
-{
-    pwmPulseWidth_us = pulseWidth_us;
-    sw1.pulsewidth_us(pulseWidth_us);
-    sw3.pulsewidth_us(pulseWidth_us);
-    sw5.pulsewidth_us(pulseWidth_us);
+    if (activeState == ActiveHigh)
+        pwmPulseWidth = seconds;
+    else
+        pwmPulseWidth = pwmPeriod - seconds;
+    switch (m_state) {
+        case 1:
+        case 5:
+            sw1.pulsewidth(pwmPulseWidth);
+        break;
+        case 2:
+        case 3:
+            sw3.pulsewidth(pwmPulseWidth);
+        break;
+        case 4:
+        case 6:
+            sw5.pulsewidth(pwmPulseWidth);
+        break;
+    };        
 }
 void ThreePhaseBridge::setHighSideSwitchState(int8_t sw, ThreePhaseBridge::SwitchState state)
 {
-    state == on ? highSide[sw]->pulsewidth_us(activeState == activeLow ? pwmPeriod_us - pwmPulseWidth_us : pwmPeriod_us)
-                : highSide[sw]->pulsewidth_us(activeState == activeLow ? 2 * pwmPeriod_us : 0);
+    state == On ? highSide[sw]->pulsewidth(pwmPulseWidth)
+                : highSide[sw]->pulsewidth(pwmPulseWidthOff);
 }
 
 void ThreePhaseBridge::setLowSideSwitchState(int8_t sw, ThreePhaseBridge::SwitchState state)
 {
-    state == on ? *lowSide[sw] = (activeState == activeLow ? 0 : 1)
-                : *lowSide[sw] = (activeState == activeLow ? 1 : 0);
+    state == On ? *lowSide[sw] = (activeState == ActiveLow ? 0 : 1)
+                : *lowSide[sw] = (activeState == ActiveLow ? 1 : 0);
 }
 
 void ThreePhaseBridge::setSwitchesState(uint8_t newState)
@@ -58,17 +75,17 @@
     uint8_t turnOnHigh = turnOn >> 3;
     for (uint8_t i = 0; i < 3; i++) {
         if (turnOffLow & (1 << i))
-            setLowSideSwitchState(i, off);
+            setLowSideSwitchState(i, Off);
         if (turnOffHigh & (1 << i))
-            setHighSideSwitchState(i, off);
+            setHighSideSwitchState(i, Off);
     }
     for (uint8_t i = 0; i < 3; i++) {
         if (turnOnLow & (1 << i))
         {
-            setLowSideSwitchState(i, on);
+            setLowSideSwitchState(i, On);
         }
         if (turnOnHigh & (1 << i))
-            setHighSideSwitchState(i, on);        
+            setHighSideSwitchState(i, On);        
     }
     switchesState = newState;
 }
@@ -98,7 +115,7 @@
             setSwitchesState(0);
         break;
     }
-    state = newState;
+    m_state = newState;
 }
 
 void ThreePhaseBridge::spin(ThreePhaseBridge::SpinDirection dir)
@@ -106,4 +123,17 @@
     stateIndex = (6 + stateIndex + dir) % 6;
     setState(stateOrder[stateIndex]);        
 }
+
+void ThreePhaseBridge::stop()
+{
+    setState(0);
+}
+
+void ThreePhaseBridge::overflow(void (*fptr)(void))
+{
+    if (fptr) {
+        NVIC_SetVector(TPM0_IRQn, (uint32_t)fptr);
+        NVIC_EnableIRQ(TPM0_IRQn);
+    }
+}
     
\ No newline at end of file