Motacon_20200317
Dependents: HelloWorld_MotorKaisei
Revision 7:fb9e3b508237, committed 2020-03-17
- Comitter:
- MPPT51
- Date:
- Tue Mar 17 05:11:00 2020 +0000
- Parent:
- 6:959e725b6be9
- Commit message:
- motorcon
Changed in this revision
BLDCmotorDriver.cpp | Show annotated file Show diff for this revision Revisions of this file |
BLDCmotorDriver.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/BLDCmotorDriver.cpp Sat Mar 14 00:56:54 2020 +0000 +++ b/BLDCmotorDriver.cpp Tue Mar 17 05:11:00 2020 +0000 @@ -6,20 +6,17 @@ H1(pH1), H2(pH2), H3(pH3), Fault(LED1){ sampleTime = 1e-3; - switchingPeriod = 1.0 / 20e3; + switchingPeriod = 1.0 / 20e3; //PWMの周波数を20kHzにしている dutyCycle = tempDutyCycle = 0; GL_A.period(switchingPeriod); // applies to all PwmOut instances - rl.setLimits(0.1, -5, 0, sampleTime); // initial 10 second ramp - //H1.mode(PullNone); - //H2.mode(PullNone); - //H3.mode(PullNone); + rl.setLimits(0.5, -0.5, 0, sampleTime); // initial 10 second ramp 大きい値ほど素早く切り替わる H1.rise(this, &BLDCmotorDriver::commutation); H2.rise(this, &BLDCmotorDriver::commutation); H3.rise(this, &BLDCmotorDriver::commutation); H1.fall(this, &BLDCmotorDriver::commutation); H2.fall(this, &BLDCmotorDriver::commutation); H3.fall(this, &BLDCmotorDriver::commutation); -} +} /* void BLDCmotorDriver::configure(float sampleTime, float switchingFrequency, float rampUpSlope, float rampDownSlope) { if (sampleTime < 1e-6) sampleTime = 1e-3; @@ -32,7 +29,7 @@ this->sampleTime = sampleTime; switchingPeriod = 1.0 / switchingFrequency; rl.setLimits(rampUpSlope, rampDownSlope, 0, sampleTime); -} +} */ int BLDCmotorDriver::getSector(){ // hall 120° h1 = H1.read(); h2 = H2.read(); @@ -71,167 +68,67 @@ dutyCycle = rl.out(tempDutyCycle); currentSector = getSector(); if (dutyCycle > 0) { - currentSector++; - if(currentSector > 5){ - currentSector = 0; + if( !direction ){ + currentSector++; + if(currentSector > 5){ + currentSector = 0; + } + switch(currentSector) { /*正転*/ + case 0: //001 + GL_C = 0; GL_B = 0; GL_A = dutyCycle; GH_C = 0; GH_B = 1; GH_A = 0; + break; + case 1: + GL_C = dutyCycle; GL_B = 0; GL_A = 0; GH_C = 0; GH_B = 1; GH_A = 0; + break; + case 2: + GL_C = dutyCycle; GL_B = 0; GL_A = 0; GH_C = 0; GH_B = 0; GH_A = 1; + break; + case 3: + GL_C = 0; GL_B = dutyCycle; GL_A = 0; GH_C = 0; GH_B = 0; GH_A = 1; + break; + case 4: + GL_C = 0; GL_B = dutyCycle; GL_A = 0; GH_C = 1; GH_B = 0; GH_A = 0; + break; + case 5: + GL_C = 0; GL_B = 0; GL_A = dutyCycle; GH_C = 1; GH_B = 0; GH_A = 0; + break; + } } - switch(currentSector) { - case 0: //001 - GL_C = 0; - GL_B = 0; - GL_A = dutyCycle; - GH_C = 0; - GH_B = 1; - GH_A = 0; - break; - case 1: - GL_C = dutyCycle; - GL_B = 0; - GL_A = 0; - GH_C = 0; - GH_B = 1; - GH_A = 0; - break; - case 2: - GL_C = dutyCycle; - GL_B = 0; - GL_A = 0; - GH_C = 0; - GH_B = 0; - GH_A = 1; - break; - case 3: - GL_C = 0; - GL_B = dutyCycle; - GL_A = 0; - GH_C = 0; - GH_B = 0; - GH_A = 1; - break; - case 4: - GL_C = 0; - GL_B = dutyCycle; - GL_A = 0; - GH_C = 1; - GH_B = 0; - GH_A = 0; - break; - case 5: - GL_C = 0; - GL_B = 0; - GL_A = dutyCycle; - GH_C = 1; - GH_B = 0; - GH_A = 0; - break; + else if ( direction ) { //dutyがマイナスかつ進行方向が後退になっている場合 + GL_C = dutyCycle; GL_B = dutyCycle; GL_A = dutyCycle; GH_C = 0; GH_B = 0; GH_A = 0; //回生動作する } } - else if (dutyCycle < 0) { - currentSector--; - if(currentSector < 0){ - currentSector = 5; + else if( dutyCycle < 0 ){ + if( direction ){ /*逆転*/ + currentSector--; + if(currentSector < 0){ + currentSector = 5; + } + switch(currentSector) { + case 0: + GL_C = 0; GL_B = 0; GL_A = -dutyCycle; GH_C = 1; GH_B = 0; GH_A = 0; + break; + case 1: + GL_C = 0; GL_B = 0; GL_A = -dutyCycle; GH_C = 0; GH_B = 1; GH_A = 0; + break; + case 2: + GL_C = -dutyCycle; GL_B = 0; GL_A = 0; GH_C = 0; GH_B = 1; GH_A = 0; + break; + case 3: + GL_C = -dutyCycle; GL_B = 0; GL_A = 0; GH_C = 0; GH_B = 0; GH_A = 1; + break; + case 4: + GL_C = 0; GL_B = -dutyCycle; GL_A = 0; GH_C = 0; GH_B = 0; GH_A = 1; + break; + case 5: + GL_C = 0; GL_B = -dutyCycle; GL_A = 0; GH_C = 1; GH_B = 0; GH_A = 0; + break; + } } - switch(currentSector) { - case 0: - GL_C = -dutyCycle; - GL_B = -dutyCycle; - GL_A = -dutyCycle; - GH_C = 0; - GH_B = 0; - GH_A = 0; - break; - case 1: - GL_C = -dutyCycle; - GL_B = -dutyCycle; - GL_A = -dutyCycle; - GH_C = 0; - GH_B = 0; - GH_A = 0; - break; - case 2: - GL_C = -dutyCycle; - GL_B = -dutyCycle; - GL_A = -dutyCycle; - GH_C = 0; - GH_B = 0; - GH_A = 0; - break; - case 3: - GL_C = -dutyCycle; - GL_B = -dutyCycle; - GL_A = -dutyCycle; - GH_C = 0; - GH_B = 0; - GH_A = 0; - break; - case 4: - GL_C = -dutyCycle; - GL_B = -dutyCycle; - GL_A = -dutyCycle; - GH_C = 0; - GH_B = 0; - GH_A = 0; - break; - case 5: - GL_C = -dutyCycle; - GL_B = -dutyCycle; - GL_A = -dutyCycle; - GH_C = 0; - GH_B = 0; - GH_A = 0; - break; - /* - case 0: - GL_C = 0; - GL_B = 0; - GL_A = 1; - GH_C = -dutyCycle; - GH_B = 0; - GH_A = 0; - break; - case 1: - GL_C = 0; - GL_B = 0; - GL_A = 1; - GH_C = 0; - GH_B = -dutyCycle; - GH_A = 0; - break; - case 2: - GL_C = 1; - GL_B = 0; - GL_A = 0; - GH_C = 0; - GH_B = -dutyCycle; - GH_A = 0; - break; - case 3: - GL_C = 1; - GL_B = 0; - GL_A = 0; - GH_C = 0; - GH_B = 0; - GH_A = -dutyCycle; - break; - case 4: - GL_C = 0; - GL_B = 1; - GL_A = 0; - GH_C = 0; - GH_B = 0; - GH_A = -dutyCycle; - break; - case 5: - GL_C = 0; - GL_B = 1; - GL_A = 0; - GH_C = -dutyCycle; - GH_B = 0; - GH_A = 0; - break; - */ - } - } + else if ( !direction ) { //dutyがマイナスかつ進行方向が後退になっている場合 + GL_C = -dutyCycle; GL_B = -dutyCycle; GL_A = -dutyCycle; GH_C = 0; GH_B = 0; GH_A = 0; //回生動作する + } + } else { coast(); } @@ -244,6 +141,18 @@ coast(); } } +void BLDCmotorDriver::setDirection(float DS) { + if (!DS) { + direction = 0; + } else { + direction = 1; + } + if( !direction ){ +// GH_A=0; + }else { +// GH_A=1; + } +} /*void BLDCmotorDriver::adjustDutyCycle() { dutyCycle = rl.out(tempDutyCycle); float diff = tempDutyCycle - dutyCycle;
--- a/BLDCmotorDriver.h Sat Mar 14 00:56:54 2020 +0000 +++ b/BLDCmotorDriver.h Tue Mar 17 05:11:00 2020 +0000 @@ -6,6 +6,7 @@ BLDCmotorDriver(PinName GH_A, PinName GL_A, PinName GH_B, PinName GL_B, PinName GH_C, PinName GL_C, PinName h1, PinName h2, PinName h3, PinName Fault); void configure(float sampleTime, float switchingFrequency, float rampUpSlope, float rampDownSlope); void setDutyCycle(float dutyCycle); + void setDirection(float direction); //方向決定スイッチ void coast(); float getDutyCycle(); int getSector(); @@ -20,6 +21,7 @@ RateLimiter rl; Ticker ticker; float switchingPeriod, dutyCycle, tempDutyCycle, sampleTime; + int direction; void commutation(); int currentSector, _currentSector, previousSector, difference; DigitalOut Fault;