20200821_motacon_ver4
Revision 7:7365c75b2af1, committed 2020-09-02
- 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; //←ハイサイド・ローサイドの変更