Three phase bridge control
Dependents: BLDC_control BLDC_RPM_meter
ThreePhaseBridge.cpp
- Committer:
- acracan
- Date:
- 2014-03-11
- Revision:
- 0:a129854eb4b6
- Child:
- 1:ba7889accd61
File content as of revision 0:a129854eb4b6:
#include "ThreePhaseBridge.h" int8_t ThreePhaseBridge::stateOrder[6] = {3, 1, 5, 4, 6, 2}; ThreePhaseBridge::ThreePhaseBridge( PinName sw1PinName, PinName sw2PinName, PinName sw3PinName, PinName sw4PinName, PinName sw5PinName, PinName sw6PinName, ThreePhaseBridge::ActiveState activeState ) : sw1(sw1PinName), sw3(sw3PinName), sw5(sw5PinName), sw2(sw2PinName), sw4(sw4PinName), sw6(sw6PinName), activeState(activeState) { highSide[0] = &sw1; highSide[1] = &sw3; highSide[2] = &sw5; lowSide[0] = &sw2; lowSide[1] = &sw4; lowSide[2] = &sw6; switchesState = 63; setSwitchesState(0); state = 0; stateIndex = 5; } void ThreePhaseBridge::setPwmPeriod_us(int32_t period_us) { 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); } 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); } void ThreePhaseBridge::setLowSideSwitchState(int8_t sw, ThreePhaseBridge::SwitchState state) { state == on ? *lowSide[sw] = (activeState == activeLow ? 0 : 1) : *lowSide[sw] = (activeState == activeLow ? 1 : 0); } void ThreePhaseBridge::setSwitchesState(uint8_t newState) { uint8_t turnOff = ~(newState & switchesState) & switchesState; uint8_t turnOffLow = turnOff & 7; uint8_t turnOffHigh = turnOff >> 3; uint8_t turnOn = newState & ~switchesState; uint8_t turnOnLow = turnOn & 7; uint8_t turnOnHigh = turnOn >> 3; for (uint8_t i = 0; i < 3; i++) { if (turnOffLow & (1 << i)) setLowSideSwitchState(i, off); if (turnOffHigh & (1 << i)) setHighSideSwitchState(i, off); } for (uint8_t i = 0; i < 3; i++) { if (turnOnLow & (1 << i)) { setLowSideSwitchState(i, on); } if (turnOnHigh & (1 << i)) setHighSideSwitchState(i, on); } switchesState = newState; } void ThreePhaseBridge::setState(int8_t newState) { switch (newState) { case 1: setSwitchesState(SW1 | SW6); break; case 2: setSwitchesState(SW3 | SW2); break; case 3: setSwitchesState(SW3 | SW6); break; case 4: setSwitchesState(SW5 | SW4); break; case 5: setSwitchesState(SW1 | SW4); break; case 6: setSwitchesState(SW5 | SW2); break; default: setSwitchesState(0); break; } state = newState; } void ThreePhaseBridge::spin(ThreePhaseBridge::SpinDirection dir) { stateIndex = (6 + stateIndex + dir) % 6; setState(stateOrder[stateIndex]); }