20200821_motacon_ver4

Files at this revision

API Documentation at this revision

Comitter:
MPPT51
Date:
Wed Sep 02 05:04:31 2020 +0000
Parent:
6:51643d078474
Commit message:
20200902_kikkawa

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	Fri Aug 21 08:29:01 2020 +0000
+++ b/BLDCmotorDriver.cpp	Wed Sep 02 05:04:31 2020 +0000
@@ -15,8 +15,8 @@
     H1.fall(this, &BLDCmotorDriver::commutation);
     H2.fall(this, &BLDCmotorDriver::commutation);
     H3.fall(this, &BLDCmotorDriver::commutation);
+    ticker.attach(this, &BLDCmotorDriver::commutation, sampleTime);
 } 
-
 int BLDCmotorDriver::getSector(){           //ホールセンサ信号読み取り モータ回転角検出
     h1 = H1.read();  
     h2 = H2.read();
@@ -32,47 +32,39 @@
     return currentSector;                
 }  
 void BLDCmotorDriver::H1rise()  {   //H1 (U相ホールセンサ)
-    /*回転数計測処理開始*/
-/*  計測方法1 */  
-/* 
-    HScnt++;
-    t.stop();
-    rpm_a = t.read_us();
-    rpm_b = rpm_b - HS_usec;
-    rpm_b = rpm_b + rpm_a;
-    HS_usec = rpm_b / 20;
-    t.reset();
-    t.start();
-*/
-/*  計測方法2 */    //こちらの方が安定している。
-///*
+    //回転数計測
     HS_check = 0;   //ホールセンサ割込みが起きていることを表すため0を代入
     HS_cnt++;
     t.stop();
-    if( t.read_ms() >= 100 ){
-        HS_usec = t.read_us() / HS_cnt;
+    if( t.read_ms() >= 50 ){   //Xms間に何回ホールセンサ(H1)が立ち上がったか確認し、立上りから次の立上りまでの1回あたりの時間を調べる。時間が長いと(200msとか)dutyを急激に変化させたとき、duty制限が追いつかずモータがガタつく(速度で制限を決めているため)。
+        HS_usec = t.read_us() / HS_cnt;     //反対に時間が短いと速度計測の精度が落ちる //ちょうどいい時間を探すorプログラム改良が必要
         HS_cnt = 0;
         t.reset();
     }
     t.start();
-//*/
-    /*回転数計測処理終了*/
-    commutation();     //駆動信号出力処理に飛ぶ
+    //駆動信号出力処理
+    commutation();
 }    
 void BLDCmotorDriver::commutation()  {
-    if( t.read_ms() >= 120 && HS_check ){   //ホールセンサ(U相立上り)割り込みが一定時間発生していない(モータが回転していない場合)の処理
-        HS_usec = 1e9;  //速度表示を0にするためHS_usecを非常に大きい値にする
+    //ホールセンサ間の時間計測の一部
+    if( t.read_ms() >= 300 && HS_check ){   //ホールセンサ(U相立上り)割り込みが一定時間発生していない(モータが回転していない場合)の処理
+        HS_usec = 1e9;                      //速度表示を0にするためHS_usecを非常に大きい値にする
     }
-    HS_check = 1;   //ホールセンサ割込み関数で0に戻される。割込みが起きない場合(1のまま一定時間過ぎると)HS_usecに1e9代入する処理に繋がる。
+    HS_check = 1;                           //ホールセンサ割込み関数で0に戻される。割込みが起きない場合(1のまま一定時間過ぎると)HS_usecに1e9代入する処理に繋がる。
     
+    //モータ回転数と車両時速の計算
+    rpm = (float)(3750 / (HS_usec * 0.001));         //マイクロ秒をミリ秒に直して逆数を3750に掛ける  //BLDCmotorDriver.cpp(.h)で使っている変数をmainで使う場合は「M.」を付ける。「M.」なのはmainの上の方でそう設定してるから。usecはmicro second:マイクロ秒
+    speed = rpm * 0.10518;                  //3750とか0.010518は、excelで計算している。ファイル名「」
+    //加速の制限
+    dc_limit1 = (0.0063*speed*speed + 0.8107*speed + 20.24) / 100;       //加速側制限.elsxの式 //制御確認用モータ用の加速調整(電源電圧13Vにする)   //そのまま車載モータにも使えるかも実際に確認する必要あり。70km/hでduty制限なくなる(dc_limit>=100)
+    if( tempDutyCycle > dc_limit1 ){ tempDutyCycle = dc_limit1; }        //加速制限の式で求めた制限値を超えている場合、その値を代入する
+    //モード駆動信号出力
     dutyCycle = tempDutyCycle;
     currentSector = getSector();
     if (dutyCycle > 0) {
-        if( !direction ){
+        if( accel ){
             currentSector++;
-            if(currentSector > 5){
-                currentSector = 0;
-            }
+            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;
@@ -94,12 +86,13 @@
                     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 ( !accel ) {    //アクセルOFFのとき
+            GL_C = 0; GL_B = 0; GL_A = 0; GH_C = 0; GH_B = 0; GH_A = 0;  //何もしない           
         }
     }
+    /*
     else if( dutyCycle < 0 ){
-        if( direction ){ /*逆転*/
+        if( direction ){ //逆転
             currentSector--;
             if(currentSector < 0){ 
                 currentSector = 5;
@@ -129,8 +122,9 @@
             GL_C = -dutyCycle; GL_B = -dutyCycle; GL_A = -dutyCycle; GH_C = 0; GH_B = 0; GH_A = 0;  //回生動作する            
         }
     } 
-    else {
-        coast();
+    */
+    else if( dutyCycle < 0 ){
+        GL_C = -dutyCycle; GL_B = -dutyCycle; GL_A = -dutyCycle; GH_C = 0; GH_B = 0; GH_A = 0;  //回生動作する
     }
 }
 void BLDCmotorDriver::setDutyCycle(float dc) {
@@ -148,7 +142,6 @@
         direction = 1;
     }
 }
-
 void BLDCmotorDriver::coast() {
     GH_A = 0; GL_A = 0; GH_B = 0; GL_B = 0; GH_C = 0; GL_C = 0;
     dutyCycle = tempDutyCycle = 0;
--- a/BLDCmotorDriver.h	Fri Aug 21 08:29:01 2020 +0000
+++ b/BLDCmotorDriver.h	Wed Sep 02 05:04:31 2020 +0000
@@ -12,8 +12,12 @@
         void ispis();
         short HS_cnt;   //short(min:-32768 max: 32767)で充分   //intとかshortのサイズについて:https://os.mbed.com/users/mbed714/notebook/integer-types-int-long-and-long-long/
         bool HS_check;  //0か1にしかならなkためboolで宣言
-        int HS_usec;
+        double HS_usec;
+        float rpm;  //モータ回転数
+        float speed;   //速度
+        float dc_limit1;
         int rpm_a, rpm_b;  //ホールセンサカウンタ(速度計測用)
+        bool accel; //アクセルONOFFの判定
         
     private:
         PwmOut GL_A, GL_B, GL_C;       //←ハイサイド・ローサイドの変更