Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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;