20210420_monitor
Dependencies: mbed SB1602E TextLCD MSCFILESytem FatFileSystemCpp
Diff: main.cpp
- 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