Motacon_20200317
Dependents: HelloWorld_MotorKaisei
Diff: BLDCmotorDriver.cpp
- Revision:
- 3:a4b4a8e3f2a0
- Parent:
- 1:786897114846
- Child:
- 5:cf8183ae80ef
--- a/BLDCmotorDriver.cpp Sun May 24 06:46:25 2015 +0000 +++ b/BLDCmotorDriver.cpp Mon Jun 01 13:47:23 2015 +0000 @@ -1,14 +1,18 @@ #include "BLDCmotorDriver.h" BLDCmotorDriver::BLDCmotorDriver(PinName pGH_A, PinName pGH_B, PinName pGH_C, PinName pGL_A, PinName pGL_B, PinName pGL_C, - PinName pH1, PinName pH2, PinName pH3, PinName pfault) : + PinName pH1, PinName pH2, PinName pH3, PinName pFault) : GH_A(pGH_A), GH_B(pGH_B), GH_C(pGH_C), GL_A(pGL_A), GL_B(pGL_B), GL_C(pGL_C), - H1(pH1), H2(pH2), H3(pH3), fault(pfault) { + H1(pH1), H2(pH2), H3(pH3), Fault(LED1){ + sampleTime = 1e-3; switchingPeriod = 1.0 / 20e3; dutyCycle = tempDutyCycle = 0; GH_A.period(switchingPeriod); // applies to all PwmOut instances rl.setLimits(0.1, -0.1, 0, sampleTime); // initial 10 second ramp + //H1.mode(PullNone); + //H2.mode(PullNone); + //H3.mode(PullNone); H1.rise(this, &BLDCmotorDriver::commutation); H2.rise(this, &BLDCmotorDriver::commutation); H3.rise(this, &BLDCmotorDriver::commutation); @@ -29,59 +33,74 @@ switchingPeriod = 1.0 / switchingFrequency; rl.setLimits(rampUpSlope, rampDownSlope, 0, sampleTime); } -int BLDCmotorDriver::getSector() { // hall 120° - - if(H1.read()== 1 && H2.read()== 0 && H3.read()== 0) - currentSector = 1; - else if(H1.read()== 1 && H2.read()== 1 && H3.read()== 0) - currentSector = 2; - else if(H1.read()== 0 && H2.read()== 1 && H3.read()== 0) - currentSector = 3; - else if(H1.read()== 0 && H2.read()== 1 && H3.read()== 1) - currentSector = 4; - else if(H1.read()== 0 && H2.read()== 0 && H3.read()== 1) - currentSector = 5; - else if(H1.read()== 1 && H2.read()== 0 && H3.read()== 1) - currentSector = 6; - else { - currentSector = 0; - fault = 1; - } - - return currentSector; -} +int BLDCmotorDriver::getSector(){ // hall 120° + + h1 = H1.read(); + h2 = H2.read(); + h3 = H3.read(); + + + if(h1 == 0 && h2 == 0 && h3 == 1){ + _currentSector = 0; + } + else if(h1 == 0 && h2 == 1 && h3 == 1){ + _currentSector = 1; + } + else if(h1 == 0 && h2 == 1 && h3 == 0){ + _currentSector = 2; + } + else if(h1 == 1 && h2 == 1 && h3 == 0){ + _currentSector = 3; + } + else if(h1 == 1 && h2 == 0 && h3 == 0){ + _currentSector = 4; + } + else if(h1 == 1 && h2 == 0 && h3 == 1){ + _currentSector = 5; + } + previousSector = _currentSector - 1; + difference = _currentSector - previousSector; + if (difference == 1){ + currentSector = _currentSector; + Fault = 0; + } + else Fault = 1; +return currentSector; +} -void BLDCmotorDriver::commutation() { - getSector(); +void BLDCmotorDriver::commutation() { + dutyCycle = rl.out(tempDutyCycle); + currentSector = getSector(); if (dutyCycle > 0) { - if (currentSector > 6) currentSector = 1; // when will this condition happen? - // currentSector++; - switch(currentSector) { - case 1: //100 + currentSector++; + if(currentSector > 5)currentSector = 0; + switch(currentSector) { + + case 0: //001 GH_A = dutyCycle; GL_A = 0; GH_B = 0; GL_B = 0; GH_C = 0; + GL_C = 1; + break; + case 1: + GH_A = 0; + GL_A = 0; + GH_B = dutyCycle; + GL_B = 0; + GH_C = 0; GL_C = 1; break; - case 2: //110 - GH_A = dutyCycle; - GL_A = 0; - GH_B = 0; - GL_B = 1; + case 2: + GH_A = 0; + GL_A = 1; + GH_B = dutyCycle; + GL_B = 0; GH_C = 0; GL_C = 0; break; - case 3: //010 - GH_A = 0; - GL_A = 0; - GH_B = 0; - GL_B = 1; - GH_C = dutyCycle; - GL_C = 0; - break; - case 4: //011 + case 3: GH_A = 0; GL_A = 1; GH_B = 0; @@ -89,97 +108,94 @@ GH_C = dutyCycle; GL_C = 0; break; - case 5: //001 - GH_A = 0; - GL_A = 1; - GH_B = dutyCycle; - GL_B = 0; - GH_C = 0; - GL_C = 0; - break; - case 6: //101 - GH_A = 0; - GL_A = 0; - GH_B = dutyCycle; - GL_B = 0; - GH_C = 0; - GL_C = 1; - break; - } - } else if (dutyCycle < 0) { // - // if (currentSector < 1) currentSector = 6; // not necessary - // currentSector--; - switch(currentSector) { - case 1: //100 - GH_A = dutyCycle; - GL_A = 0; - GH_B = 0; - GL_B = 0; - GH_C = 0; - GL_C = 1; - break; - case 2: //110 - GH_A = dutyCycle; - GL_A = 0; - GH_B = 0; - GL_B = 1; - GH_C = 0; - GL_C = 0; - break; - case 3: //010 + case 4: GH_A = 0; GL_A = 0; GH_B = 0; GL_B = 1; GH_C = dutyCycle; GL_C = 0; + break; + case 5: + GH_A = dutyCycle; + GL_A = 0; + GH_B = 0; + GL_B = 1; + GH_C = 0; + GL_C = 0; break; - case 4: //011 + } + } else if (dutyCycle < 0) { + currentSector--; + if(currentSector < 0)currentSector = 5; + switch(currentSector) { + case 0: + GH_A = -dutyCycle; + GL_A = 0; + GH_B = 0; + GL_B = 1; + GH_C = 0; + GL_C = 0; + break; + case 1: + GH_A = -dutyCycle; + GL_A = 0; + GH_B = 0; + GL_B = 0; + GH_C = 0; + GL_C = 1; + break; + case 2: + GH_A = 0; + GL_A = 0; + GH_B = -dutyCycle; + GL_B = 0; + GH_C = 0; + GL_C = 1; + break; + case 3: + GH_A = 0; + GL_A = 1; + GH_B = -dutyCycle; + GL_B = 0; + GH_C = 0; + GL_C = 0; + break; + case 4: GH_A = 0; GL_A = 1; GH_B = 0; GL_B = 0; - GH_C = dutyCycle; + GH_C = -dutyCycle; GL_C = 0; break; - case 5: //001 - GH_A = 0; - GL_A = 1; - GH_B = dutyCycle; - GL_B = 0; - GH_C = 0; - GL_C = 0; - break; - case 6: //101 + case 5: GH_A = 0; GL_A = 0; - GH_B = dutyCycle; - GL_B = 0; - GH_C = 0; - GL_C = 1; - break; - } - } else { - coast(); + GH_B = 0; + GL_B = 1; + GH_C = -dutyCycle; + GL_C = 0; + break; + } + }else { + coast(); } } - void BLDCmotorDriver::setDutyCycle(float dc) { if (dc >= -1 && dc <= 1) { - ticker.attach(this, &BLDCmotorDriver::adjustDutyCycle, sampleTime); + ticker.attach(this, &BLDCmotorDriver::commutation, sampleTime); tempDutyCycle = dc; } else { coast(); } } - -void BLDCmotorDriver::adjustDutyCycle() { +/*void BLDCmotorDriver::adjustDutyCycle() { dutyCycle = rl.out(tempDutyCycle); float diff = tempDutyCycle - dutyCycle; if (diff < 0.01 || diff > -0.01) ticker.detach(); -} - +}*/ void BLDCmotorDriver::coast() { GH_A = 0; GL_A = 0;