20200821_motacon_ver4

Dependencies:   mbed FatFileSystemCpp INA226_abc BLDCmotorDriver_20200902_1

Files at this revision

API Documentation at this revision

Comitter:
MPPT51
Date:
Wed Sep 02 05:05:55 2020 +0000
Parent:
1:47c28ece54ea
Commit message:
20200902_kikkawa_2

Changed in this revision

BLDCmotorDriver.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/BLDCmotorDriver.lib	Fri Aug 21 08:30:26 2020 +0000
+++ b/BLDCmotorDriver.lib	Wed Sep 02 05:05:55 2020 +0000
@@ -1,1 +1,1 @@
-https://os.mbed.com/users/MPPT51/code/BLDCmotorDriver_20200821_motacon_ver4/#51643d078474
+https://os.mbed.com/users/MPPT51/code/BLDCmotorDriver_20200902_1/#7365c75b2af1
--- a/main.cpp	Fri Aug 21 08:30:26 2020 +0000
+++ b/main.cpp	Wed Sep 02 05:05:55 2020 +0000
@@ -1,40 +1,30 @@
-//20200803 Kikkawa モタコン基板(緑色ver.1)での動作確認済み
+//20200825 Kikkawa モタコン基板(緑色ver.1)での動作確認済み
 //BLDC, INA226, CAN
-
 #include "mbed.h"
 #include "BLDCmotorDriver.h"
 #include "INA226.hpp"
-  
-/*定数の設定*/
-#define Vin1_LENGTH 20   //要素数(個数指定用の定数)
-#define Cin1_LENGTH 20   //要素数(個数指定用の定数)
-#define canSlaveID 0x10     //CAN通信IDを0x10に設定
-
-CAN canSlave(p30, p29);
-Timer timer;        //回転数計算用タイマ設定
-Ticker ticker1;     //割り込み設定用
-Ticker ticker2;     //割り込み設定用
-
-Serial pc(USBTX, USBRX);
+//#include "EthernetPowerControl.h"   //消費電力削減
+/*基本ポート設定*/
+Serial pc(USBTX, USBRX); // USBシリアルポートのインスタンス
 BLDCmotorDriver M(p26, p24, p22, p25, p23, p21, p9, p8, p7, LED1);
-AnalogIn Pot(p20);
-DigitalIn direction(p16);
-DigitalIn accel(p15);
-
 DigitalOut led2(LED2);  //CAN_check
 DigitalOut led3(LED3);  //direction_check
 DigitalOut led4(LED4);  //accel_check
-
-double rpm = 0.0, speed = 0.0;   //モータ回転数、速度
-float dc = 0.0, dc_limit = 0.0;
-int sector = 0;
+DigitalIn accel(p15);    
+DigitalIn direction(p16);
+DigitalOut P17(p17);    //see http://mbed.org/users/chris/notebook/Getting-best-ADC-performance/
+DigitalOut P18(p18);    //also setting unused analog input pins to digital outputs reduces A/D noise a bit
+DigitalOut P19(p19);
+AnalogIn Pot(p20);
 
-bool flagPrintf = 0;    //main関数でのprintf処理のため
+/*モータ駆動関係*/
+float dc = 0.0;
 
+/*CAN関係*/
+CAN CAN1(p30, p29); //CANのピンの設定
 int forSend = 0;        //データ送信時に一時的に使用する変数
-bool CANsendOK = 0;  //CAN受信完了時,セットする(mainでのprintfのため)
-CANMessage msgSlave;    //CAN送信用
-void Handler_canSlaveSend();
+CANMessage msgCAN;    //CAN送信用
+void CAN1_send();
 
 /*INA226関係*/    //GNDGND(G-G):0x80, Vs+Vs+(1-1):0x8A, SDASDA(D-D):0x94, SCLSCL(C-C):0x9E, GNDVs+(G-1):0x82
 I2C i2c(p28,p27);
@@ -43,77 +33,70 @@
 INA226 VCmonitor(i2c); 
 unsigned short val;
 double V,C;
-int count = 1;      //INA226動作確認用カウンタ
-float data_Vin1[Vin1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0};        //一時的データ格納配列
-float data_Cin1[Cin1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0};        //一時的データ格納配列
-void get_VCipm(void);   //IPMの電圧電流計測関数
+
+//printf用
+char cnt_printf = 0;
 
-void Handler_canSlaveSend() {
+void CAN1_send() { //CANでデータ送信する関数。  //CAN1.attach(&Handler_canSlaveRecieve, CAN::RxIrq); <== この文はCAN受信割り込みの設定。使いたい時に使えるようにここに書いておく。使うときはmain関数で1回実行する。
+    msgCAN.id = 0x10; //送信するCANデータのIDを決める
+    msgCAN.len = 7;   //CAN送信側で送るデータのバイト数
+    
     forSend = (int)(V/100);
-    msgSlave.data[0] = forSend / 100;    //forSend / 100 = 15あまり43 となり,答えの方がデータ格納される
-    msgSlave.data[1] = forSend % 100;    //forSend / 100 = 15あまり43 となり,あまりの方がデータ格納される
+    msgCAN.data[0] = forSend / 100;    //forSend / 100 = 15あまり43 となり,答えの方がデータ格納される
+    msgCAN.data[1] = forSend % 100;    //forSend / 100 = 15あまり43 となり,あまりの方がデータ格納される
     
     forSend = (int)(C/10);  //mAで取得した値を10で割り、char2分割で送り切れるようにする。(例: 測定電流が199.99Aのとき,C=199900.00となるため,forSend=19990となり,199と90で分割することで送信できる)
-    msgSlave.data[2] = forSend / 100;   //forSend / 100 = 5あまり54 となり,答えの方がデータ格納される
-    msgSlave.data[3] = forSend % 100;   //forSend % 100 = 5あまり54 となり,あまりの方がデータ格納される
+    msgCAN.data[2] = forSend / 100;   //forSend / 100 = 5あまり54 となり,答えの方がデータ格納される
+    msgCAN.data[3] = forSend % 100;   //forSend % 100 = 5あまり54 となり,あまりの方がデータ格納される
     
-    forSend = (int)(speed*10);  //speed * 10 = 856.5だが,intにするため,856が代入される 
-    msgSlave.data[4] = forSend / 100;   //forSend / 100 = 8あまり56 となり,8がデータ格納される
-    msgSlave.data[5] = forSend % 100;   //forSend % 100 = 8あまり56 となり,56がデータ格納される
+    forSend = (int)(M.speed*10);  //speed * 10 = 856.5だが,intにするため,856が代入される 
+    msgCAN.data[4] = forSend / 100;   //forSend / 100 = 8あまり56 となり,8がデータ格納される
+    msgCAN.data[5] = forSend % 100;   //forSend % 100 = 8あまり56 となり,56がデータ格納される
     
-    forSend = (int)(dc*100);  //dc * 100 = 95
-    msgSlave.data[6] = forSend;   //charの最大値である255以下になるため,そのままデータ格納される
+    forSend = (int)(M.getDutyCycle()*100);  //0~1を0~100にする
+    msgCAN.data[6] = forSend;   //charの最大値である255以下になるため,そのままデータ格納される
     
-    if(canSlave.write(msgSlave)){   //格納したデータを送信する
-        CANsendOK = 1;
+    if(CAN1.write(msgCAN)){   //格納したデータを送信する
     }
 }
-/*
-void Handler_canSlaveRecieve(){ //canMasterから送信要求が来たとき,データ送信するための関数
-    if( canSlave.read( msgSlave ) ){ //msgに送られたデータが入る   
-        led2 = !led2;
-        if( msgSlave.id == canSlaveID ){ //IDがcanSlaveIDであれば処理する   
-            Handler_canSlaveSend(); //送信処理を開始する
-        }
-    }
-}
-*/
-void INA226_init(){ //INA226初期設定を行う関数
-    printf("\n\r");
-    printf("VCmonitor INA226 TEST Program. (BUILD:[" __DATE__ "/" __TIME__ "])\n\r");
+
+void INA226_init(){ //INA226の初期設定を行う関数
+    pc.printf("\n\r");
+    pc.printf("VCmonitor INA226 TEST Program. (BUILD:[" __DATE__ "/" __TIME__ "])\n\r");
     if(!VCmonitor.isExist()){ pc.printf("VCmonitor NOT FOUND "); }
     val = 0;
     if(VCmonitor.rawRead(0x00,&val) != 0){ pc.printf("VCmonitor READ ERROR "); }    //configResisterの値を読み取れるか確認(通信できてるか確認)
     VCmonitor.setConfigResister();  //configurationResisterの設定
-    printf("VCmonitor Reg 0x00 : 0x%04x\n\r",val);  //configResisterの値表示
-    printf("\n\r");
+    pc.printf("VCmonitor Reg 0x00 : 0x%04x\n\r",val);  //configResisterの値表示
+    pc.printf("\n\r");
     VCmonitor.setCurrentCalibration();  //calibrationResisterの設定
 }    
 
 int main() {
-    /*ポート初期設定*/
+    //PHY_PowerDown();    //Ethernet停止 消費電力削減
+    pc.baud(115200);    //pcとのシリアル通信速度指定。なるべく早くしないとpc.printfの処理時間が長くなってしまうかも
+    //ポート初期設定
     direction.mode(PullUp);                //進行方向スイッチ入力ピンをプルアップに設定
     accel.mode(PullUp);                //アクセルスイッチ入力ピンをプルアップに設定
-    
-    /*INA226初期設定*/
+    //INA226初期設定
     INA226_init();  //INA226の初期設定する関数に飛ぶ
-    
-    /*CAN初期設定*/
-//    canSlave.attach(&Handler_canSlaveRecieve, CAN::RxIrq);   //CAN受信割り込みの設定
-    msgSlave.id = canSlaveID; //CAN送信側(slave)のIDを決定
-    msgSlave.len = 7;   //CAN送信側で送るデータのバイト数
        
     while(true) {  
-        dc = ( Pot.read()-0.5 )*2;  //可変抵抗の値からduty比を設定
-//        dc_limit = -0.0147 * speed * speed + 2.6842 * speed + 29.885;    //加速側制限.elsxの式
-//        dc = dc * dc_limit;
-        
+        //ゲート信号デューティ比に使用する値をAD変換により取得
+        dc = ( Pot.read()*8 - 0.3 );  //可変抵抗の値からduty比を設定 Pot.read()を8倍することで可変抵抗をたくさん回さなくても値が上昇する -0.3して回生の処理をしやすくなるようにしておく(dcが0未満の時回生にするなど)
+        if( dc >= 1 ){ dc = 1; }
+        M.setDutyCycle(dc);     //duty比の設定
+               
+        //IPMの入力電圧、入力電流の測定
         VCmonitor.getVoltage(&V);   //IPM電圧(mV)測定
+        V = V * 14.825; //計算の仕方は「ソーラーカー電装品図(パワポ資料)」に書いてある 270kと20kで分圧したとき14.825をかける
+        V = V * 0.996; //テスタ実測結果を反映して値を調整する
         VCmonitor.getCurrent(&C);   //IPM電流(mA)測定
         
-        if( !accel.read() ){
+        //アクセルがONかOFFか判定する
+        if( !accel.read() ){    //accel.read()が0(スイッチがOFF)の時の処理
             led4 = 0;
-            M.setDutyCycle(0);     //duty比の設定 duty比を0にする
+            M.accel = 0;
         }
         if( accel.read() ){
             if( !direction.read() ){    //directionスイッチが0のとき
@@ -123,14 +106,15 @@
                 led3 = 1;
             }
             led4 = 1;
-            M.setDutyCycle(dc);     //duty比の設定
-            sector = M.getSector();
-            //get_VCipm();    //Vin1とCin1を取得する
-            //pc.printf("HS_cnt: %d HS_usec %d\n", M.HS_cnt, M.HS_usec);  //デバッグ用            
+            M.accel = 1;
         }
-        rpm = 3750 / (M.HS_usec * 0.001);   //ミリ秒に直して逆数を3750に掛けるああ  //BLDCmotorDriver.cpp(.h)で使っている変数をmainで使う場合は「M.」を付ける。「M」なのはmainの上の方でそう設定してるから。usecはmicro second:マイクロ秒
-        speed = rpm * 0.10518;                  //3750とか0.010518は、excelで計算している。ファイル名「」
-        pc.printf("Duty: %.2f, Sector: %d, %.1f km/h, rpm: %1.2f, V: %.0f, C: %.0f\n\r",dc, sector, speed, rpm, V, C);
-        Handler_canSlaveSend(); //送信処理を開始する
+        //シリアル通信でpc(teratermなど)に表示
+        ++cnt_printf;
+        if( cnt_printf >= 50 ){
+            pc.printf("Duty: %.2f, Sector: %d, %.1f km/h, rpm: %1.2f, V: %.0f, C: %.0f, limit1: %.3f, HS_cnt: %d HS_usec %.2f\n\r", M.getDutyCycle(), M.getSector(), M.speed, M.rpm, V, C, M.dc_limit1, M.HS_cnt, M.HS_usec);
+            cnt_printf = 0;
+        }
+        //CANデータ送信する
+        CAN1_send(); //送信処理する関数に飛ぶ
     }
 }
\ No newline at end of file