for CAN test for MonitoringSystem

Dependencies:   mbed SB1602E MSCFILESytem FatFileSystemCpp

Dependents:   Monitor2020_ver5

Revision:
0:78ab42fa3942
Child:
1:93775378e5d9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sun Mar 08 07:30:33 2020 +0000
@@ -0,0 +1,124 @@
+//モタコンとモニタ間通信を想定したテストプログラム      //モタコンID: 0x10 MPPTID: 0x20 BMSID: 0x30 とする //モニタIDは 0x10 0x20 0x30を通信相手に合わせて変更する 
+//Ver.1 2019/12/20 Kikkawa
+#include "mbed.h"
+#define time1 0.5
+ 
+Ticker ticker;  //タイマ割り込み設定
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+CAN canSlave(p9, p10);  //slave //CANはマスターとスレーブという関係ではないが動作を分かりやすくするためSlaveとする
+CAN canMaster(p30, p29); //master   //CANはマスターとスレーブという関係ではないが動作を分かりやすくするためmasterとする
+
+float Vmotor = 0.0;       //モタコンから送られてきた電圧データを入れる変数
+float Cmotor = 0.0;       //モタコンから送られてきた電流データを入れる変数
+float speed = 0.0;        //モタコンから送られてきた速度データを入れる変数
+float dutylatio = 0;    //モタコンから送られてきたアクセル開度データを入れる変数
+float dutylatio_ = 0;
+float Vsolar = 0.0;       //MPPTから送られてきた電圧データを入れる変数
+float Csolar = 0.0;       //MPPTから送られてきた電流データを入れる変数
+float Vbatt = 0.0;       //BMSから送られてきた電圧データを入れる変数
+float Cbatt = 0.0;       //BMSから送られてきた電流データを入れる変数
+
+bool CANrecieveOK = 0;  //CAN受信完了時,セットする(mainでのprintfのため)
+
+CANMessage msgMaster;         //CAN受信用
+unsigned int  canMasterID = 0x10;   //canMasterの初期IDを0x10に設定        //通信相手によって変更する必要あり モタコンID: 0x10 MPPTID: 0x20 BMSID: 0x30
+unsigned int  canSlaveID = 0x10;   //canMasterの初期IDを0x10に設定         //通信相手によって変更する必要あり モタコンID: 0x10 MPPTID: 0x20 BMSID: 0x30
+char CAN_ID = 0;    //0で0x10, 1で0x20, 2で0x30
+bool canReading = 0;
+
+void Handler_canMasterSend() {//canSlaveに送信要求を送る関数
+    if( !canReading ){  //canReadingが0のとき(受信待ちをしていないとき)
+        switch( CAN_ID ){
+            case 0:
+                msgMaster.id = 0x10;     //モタコンを選択
+                printf("CAN Request to PCU\n\r");
+                break;
+            case 1:
+                msgMaster.id = 0x20;     //MPPTを選択
+                printf("CAN Request to MPPT\n\r");
+                break;
+            case 2:
+                msgMaster.id = 0x30;     //BMSを選択
+                printf("CAN Request to BMS\n\r");
+                break;
+        }
+        msgMaster.data[0] = 255;    //適当に255としておく  
+//        canMaster.reset();
+        if(canMaster.write(msgMaster)){    //送信
+            canReading = 1;
+            CAN_ID++;
+            if( CAN_ID >= 3 ){  //3台での通信の場合,CAN_IDが3を超えたらカウンタをリセットする
+                CAN_ID = 0; 
+            }
+            led1 = !led1;
+        }
+    }
+    else if( canReading ){   //canReadingが1のとき(受信待ちをしているのに送信要求をした場合)
+        switch( CAN_ID ){
+            case 0:     //0x30と通信できなかったときここの処理
+                printf("BMS Error\n\n\r");
+                break;
+            case 1:     //0x10が通信できなかったときここの処理
+                printf("PCU Error\n\n\r");  //PCU = モータコントローラ
+                break;
+            case 2:     //0x20が通信できなかったときここの処理
+                printf("MPPT Error 0x20\n\n\r");
+                break;
+        }
+        canReading = 0;
+    }   
+}
+void Handler_canMasterRecieve(){
+    if( canMaster.read( msgMaster ) ){   //msgに送られたデータが入る    //IDがcanMasterIDと一致していればデータ処理する   
+        if( msgMaster.id == 0x10 ){
+            Vmotor = ( (float)( (msgMaster.data[0]*100) + msgMaster.data[1] ) ) / 10;     //「1543」を154.3[V]にするため,÷10する
+            Cmotor = ( (float)( (msgMaster.data[2]*100) + msgMaster.data[3] ) ) / 100;      //「554」を5.54[A]にするため,÷100する
+            speed = ( (float)( (msgMaster.data[4]*100) + msgMaster.data[5] ) ) / 10;      //「856」を85.6[km/h]にするため,÷10する
+            dutylatio = msgMaster.data[6];                            //アクセル開度は0~100表示のため,そのまま
+            dutylatio_ = msgMaster.data[7];                            //アクセル開度は0~100表示のため,そのまま
+        }
+        else if( msgMaster.id == 0x20 ){
+            Vsolar = ( (float)( (msgMaster.data[0]*100) + msgMaster.data[1] ) ) / 10;     //「1543」を154.3[V]にするため,÷10する
+            Csolar = ( (float)( (msgMaster.data[2]*100) + msgMaster.data[3] ) ) / 100;      //「554」を5.54[A]にするため,÷100する
+        }
+        else if( msgMaster.id == 0x30 ){
+            Vbatt = ( (float)( (msgMaster.data[0]*100) + msgMaster.data[1] ) ) / 10;     //「1543」を154.3[V]にするため,÷10する
+            Cbatt = ( (float)( (msgMaster.data[2]*100) + msgMaster.data[3] ) ) / 100;      //「554」を5.54[A]にするため,÷100する
+        }
+        led2 = !led2;
+        CANrecieveOK = 1;
+        canReading = 0; //受信完了したため,受信待ち状態を解除し,データ送信を行える状態にする
+    }
+}
+void Handler_canMasterError(){
+    printf("CAN BUS Error\n\r");
+}
+int main() {
+    printf("main()\n\r");
+    ticker.attach(&Handler_canMasterSend, time1);    //#defineで「time1」の値を指定  //「time1」秒ごとに設定した関数に飛ぶ
+    canMaster.attach(&Handler_canMasterRecieve, CAN::RxIrq);   //CAN受信割り込みの設定
+    canMaster.attach(&Handler_canMasterError, CAN::BeIrq );   //バスエラー時の割り込み設定
+    
+    while(1) {
+        if( CANrecieveOK ) {
+            CANrecieveOK = 0;     
+/*            printf("Data in msgMaster.data[0] : %d\n\r", msgMaster.data[0]);    //CANで送られてきたデータをそのまま表示
+            printf("Data in msgMaster.data[1] : %d\n\r", msgMaster.data[1]);    //上に同じ
+            printf("Data in msgMaster.data[2] : %d\n\r", msgMaster.data[2]);    //上に同じ
+            printf("Data in msgMaster.data[3] : %d\n\r", msgMaster.data[3]);    //上に同じ
+            printf("Data in msgMaster.data[4] : %d\n\r", msgMaster.data[4]);    //上に同じ
+            printf("Data in msgMaster.data[5] : %d\n\r", msgMaster.data[5]);    //上に同じ
+            printf("Data in msgMaster.data[6] : %d\n\r", msgMaster.data[6]);    //上に同じ
+*/          printf("Vmotor : %f\n\r", Vmotor);  //送られてきたデータから算出した電圧値を表示
+            printf("Cmotor : %f\n\r", Cmotor);  //送られてきたデータから算出した電流値を表示
+            printf("speed : %f\n\r", speed);    //送られてきたデータから算出した時速を表示
+            printf("dutylatio : %f\n\r", dutylatio);//送られてきたデータから算出したアクセル開度を表示
+            printf("dutylatio : %f\n\r", dutylatio_);//送られてきたデータから算出したアクセル開度を表示
+            printf("Vsolar : %f\n\r", Vsolar);  //送られてきたデータから算出した電圧値を表示
+            printf("Csolar : %f\n\r", Csolar);  //送られてきたデータから算出した電流値を表示
+            printf("\n\r");
+        } 
+        wait(0.1);
+    }
+}
\ No newline at end of file