20210420_monitor
Dependencies: mbed SB1602E TextLCD MSCFILESytem FatFileSystemCpp
main.cpp
- Committer:
- MPPT51
- Date:
- 2020-03-08
- Revision:
- 0:78ab42fa3942
- Child:
- 1:93775378e5d9
File content as of revision 0:78ab42fa3942:
//モタコンとモニタ間通信を想定したテストプログラム //モタコン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); } }