Three phase bridge control
Dependents: BLDC_control BLDC_RPM_meter
ThreePhaseBridge.cpp@1:ba7889accd61, 2014-07-08 (annotated)
- Committer:
- acracan
- Date:
- Tue Jul 08 17:37:12 2014 +0000
- Revision:
- 1:ba7889accd61
- Parent:
- 0:a129854eb4b6
Update.
Who changed what in which revision?
User | Revision | Line number | New 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 |