Three phase bridge control

Dependents:   BLDC_control BLDC_RPM_meter

Committer:
acracan
Date:
Tue Jul 08 17:37:12 2014 +0000
Revision:
1:ba7889accd61
Parent:
0:a129854eb4b6
Update.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
acracan 0:a129854eb4b6 1 #include "ThreePhaseBridge.h"
acracan 0:a129854eb4b6 2
acracan 0:a129854eb4b6 3 int8_t ThreePhaseBridge::stateOrder[6] = {3, 1, 5, 4, 6, 2};
acracan 0:a129854eb4b6 4
acracan 0:a129854eb4b6 5 ThreePhaseBridge::ThreePhaseBridge(
acracan 0:a129854eb4b6 6 PinName sw1PinName, PinName sw2PinName, PinName sw3PinName,
acracan 0:a129854eb4b6 7 PinName sw4PinName, PinName sw5PinName, PinName sw6PinName,
acracan 0:a129854eb4b6 8 ThreePhaseBridge::ActiveState activeState
acracan 0:a129854eb4b6 9 ) : sw1(sw1PinName), sw3(sw3PinName), sw5(sw5PinName),
acracan 0:a129854eb4b6 10 sw2(sw2PinName), sw4(sw4PinName), sw6(sw6PinName),
acracan 0:a129854eb4b6 11 activeState(activeState)
acracan 0:a129854eb4b6 12 {
acracan 0:a129854eb4b6 13 highSide[0] = &sw1;
acracan 0:a129854eb4b6 14 highSide[1] = &sw3;
acracan 0:a129854eb4b6 15 highSide[2] = &sw5;
acracan 0:a129854eb4b6 16 lowSide[0] = &sw2;
acracan 0:a129854eb4b6 17 lowSide[1] = &sw4;
acracan 0:a129854eb4b6 18 lowSide[2] = &sw6;
acracan 1:ba7889accd61 19 switchesState = activeState == ActiveLow ? 63 : 0;
acracan 0:a129854eb4b6 20 setSwitchesState(0);
acracan 1:ba7889accd61 21 m_state = 0; stateIndex = 5;
acracan 1:ba7889accd61 22 period(10e-6);
acracan 1:ba7889accd61 23 pulsewidth(15e-6);
acracan 1:ba7889accd61 24 }
acracan 1:ba7889accd61 25
acracan 1:ba7889accd61 26 void ThreePhaseBridge::period(double seconds)
acracan 1:ba7889accd61 27 {
acracan 1:ba7889accd61 28 pwmPeriod = seconds;
acracan 1:ba7889accd61 29 pwmPulseWidthOff = activeState == ActiveLow ? pwmPeriod * 1.1 : 0.0;
acracan 1:ba7889accd61 30 sw1.period(seconds);
acracan 1:ba7889accd61 31 sw3.period(seconds);
acracan 1:ba7889accd61 32 sw5.period(seconds);
acracan 0:a129854eb4b6 33 }
acracan 0:a129854eb4b6 34
acracan 1:ba7889accd61 35 void ThreePhaseBridge::pulsewidth(double seconds)
acracan 0:a129854eb4b6 36 {
acracan 1:ba7889accd61 37 if (activeState == ActiveHigh)
acracan 1:ba7889accd61 38 pwmPulseWidth = seconds;
acracan 1:ba7889accd61 39 else
acracan 1:ba7889accd61 40 pwmPulseWidth = pwmPeriod - seconds;
acracan 1:ba7889accd61 41 switch (m_state) {
acracan 1:ba7889accd61 42 case 1:
acracan 1:ba7889accd61 43 case 5:
acracan 1:ba7889accd61 44 sw1.pulsewidth(pwmPulseWidth);
acracan 1:ba7889accd61 45 break;
acracan 1:ba7889accd61 46 case 2:
acracan 1:ba7889accd61 47 case 3:
acracan 1:ba7889accd61 48 sw3.pulsewidth(pwmPulseWidth);
acracan 1:ba7889accd61 49 break;
acracan 1:ba7889accd61 50 case 4:
acracan 1:ba7889accd61 51 case 6:
acracan 1:ba7889accd61 52 sw5.pulsewidth(pwmPulseWidth);
acracan 1:ba7889accd61 53 break;
acracan 1:ba7889accd61 54 };
acracan 0:a129854eb4b6 55 }
acracan 0:a129854eb4b6 56 void ThreePhaseBridge::setHighSideSwitchState(int8_t sw, ThreePhaseBridge::SwitchState state)
acracan 0:a129854eb4b6 57 {
acracan 1:ba7889accd61 58 state == On ? highSide[sw]->pulsewidth(pwmPulseWidth)
acracan 1:ba7889accd61 59 : highSide[sw]->pulsewidth(pwmPulseWidthOff);
acracan 0:a129854eb4b6 60 }
acracan 0:a129854eb4b6 61
acracan 0:a129854eb4b6 62 void ThreePhaseBridge::setLowSideSwitchState(int8_t sw, ThreePhaseBridge::SwitchState state)
acracan 0:a129854eb4b6 63 {
acracan 1:ba7889accd61 64 state == On ? *lowSide[sw] = (activeState == ActiveLow ? 0 : 1)
acracan 1:ba7889accd61 65 : *lowSide[sw] = (activeState == ActiveLow ? 1 : 0);
acracan 0:a129854eb4b6 66 }
acracan 0:a129854eb4b6 67
acracan 0:a129854eb4b6 68 void ThreePhaseBridge::setSwitchesState(uint8_t newState)
acracan 0:a129854eb4b6 69 {
acracan 0:a129854eb4b6 70 uint8_t turnOff = ~(newState & switchesState) & switchesState;
acracan 0:a129854eb4b6 71 uint8_t turnOffLow = turnOff & 7;
acracan 0:a129854eb4b6 72 uint8_t turnOffHigh = turnOff >> 3;
acracan 0:a129854eb4b6 73 uint8_t turnOn = newState & ~switchesState;
acracan 0:a129854eb4b6 74 uint8_t turnOnLow = turnOn & 7;
acracan 0:a129854eb4b6 75 uint8_t turnOnHigh = turnOn >> 3;
acracan 0:a129854eb4b6 76 for (uint8_t i = 0; i < 3; i++) {
acracan 0:a129854eb4b6 77 if (turnOffLow & (1 << i))
acracan 1:ba7889accd61 78 setLowSideSwitchState(i, Off);
acracan 0:a129854eb4b6 79 if (turnOffHigh & (1 << i))
acracan 1:ba7889accd61 80 setHighSideSwitchState(i, Off);
acracan 0:a129854eb4b6 81 }
acracan 0:a129854eb4b6 82 for (uint8_t i = 0; i < 3; i++) {
acracan 0:a129854eb4b6 83 if (turnOnLow & (1 << i))
acracan 0:a129854eb4b6 84 {
acracan 1:ba7889accd61 85 setLowSideSwitchState(i, On);
acracan 0:a129854eb4b6 86 }
acracan 0:a129854eb4b6 87 if (turnOnHigh & (1 << i))
acracan 1:ba7889accd61 88 setHighSideSwitchState(i, On);
acracan 0:a129854eb4b6 89 }
acracan 0:a129854eb4b6 90 switchesState = newState;
acracan 0:a129854eb4b6 91 }
acracan 0:a129854eb4b6 92
acracan 0:a129854eb4b6 93 void ThreePhaseBridge::setState(int8_t newState)
acracan 0:a129854eb4b6 94 {
acracan 0:a129854eb4b6 95 switch (newState) {
acracan 0:a129854eb4b6 96 case 1:
acracan 0:a129854eb4b6 97 setSwitchesState(SW1 | SW6);
acracan 0:a129854eb4b6 98 break;
acracan 0:a129854eb4b6 99 case 2:
acracan 0:a129854eb4b6 100 setSwitchesState(SW3 | SW2);
acracan 0:a129854eb4b6 101 break;
acracan 0:a129854eb4b6 102 case 3:
acracan 0:a129854eb4b6 103 setSwitchesState(SW3 | SW6);
acracan 0:a129854eb4b6 104 break;
acracan 0:a129854eb4b6 105 case 4:
acracan 0:a129854eb4b6 106 setSwitchesState(SW5 | SW4);
acracan 0:a129854eb4b6 107 break;
acracan 0:a129854eb4b6 108 case 5:
acracan 0:a129854eb4b6 109 setSwitchesState(SW1 | SW4);
acracan 0:a129854eb4b6 110 break;
acracan 0:a129854eb4b6 111 case 6:
acracan 0:a129854eb4b6 112 setSwitchesState(SW5 | SW2);
acracan 0:a129854eb4b6 113 break;
acracan 0:a129854eb4b6 114 default:
acracan 0:a129854eb4b6 115 setSwitchesState(0);
acracan 0:a129854eb4b6 116 break;
acracan 0:a129854eb4b6 117 }
acracan 1:ba7889accd61 118 m_state = newState;
acracan 0:a129854eb4b6 119 }
acracan 0:a129854eb4b6 120
acracan 0:a129854eb4b6 121 void ThreePhaseBridge::spin(ThreePhaseBridge::SpinDirection dir)
acracan 0:a129854eb4b6 122 {
acracan 0:a129854eb4b6 123 stateIndex = (6 + stateIndex + dir) % 6;
acracan 0:a129854eb4b6 124 setState(stateOrder[stateIndex]);
acracan 0:a129854eb4b6 125 }
acracan 1:ba7889accd61 126
acracan 1:ba7889accd61 127 void ThreePhaseBridge::stop()
acracan 1:ba7889accd61 128 {
acracan 1:ba7889accd61 129 setState(0);
acracan 1:ba7889accd61 130 }
acracan 1:ba7889accd61 131
acracan 1:ba7889accd61 132 void ThreePhaseBridge::overflow(void (*fptr)(void))
acracan 1:ba7889accd61 133 {
acracan 1:ba7889accd61 134 if (fptr) {
acracan 1:ba7889accd61 135 NVIC_SetVector(TPM0_IRQn, (uint32_t)fptr);
acracan 1:ba7889accd61 136 NVIC_EnableIRQ(TPM0_IRQn);
acracan 1:ba7889accd61 137 }
acracan 1:ba7889accd61 138 }
acracan 0:a129854eb4b6 139