Motacon_20200317

Dependents:   HelloWorld_MotorKaisei

Files at this revision

API Documentation at this revision

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;