20200823_Motacon2020_ver5_kikkawa

Dependencies:   mbed FatFileSystemCpp INA226_abc BLDCmotorDriver_20200821_motacon_ver4

Committer:
MPPT51
Date:
Fri Aug 21 08:30:26 2020 +0000
Revision:
1:47c28ece54ea
Parent:
0:3e0c71851fee
20200821_motacon_ver4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MPPT51 1:47c28ece54ea 1 //20200803 Kikkawa モタコン基板(緑色ver.1)での動作確認済み
MPPT51 1:47c28ece54ea 2 //BLDC, INA226, CAN
MPPT51 1:47c28ece54ea 3
MPPT51 0:3e0c71851fee 4 #include "mbed.h"
MPPT51 1:47c28ece54ea 5 #include "BLDCmotorDriver.h"
MPPT51 1:47c28ece54ea 6 #include "INA226.hpp"
MPPT51 1:47c28ece54ea 7
MPPT51 0:3e0c71851fee 8 /*定数の設定*/
MPPT51 0:3e0c71851fee 9 #define Vin1_LENGTH 20 //要素数(個数指定用の定数)
MPPT51 0:3e0c71851fee 10 #define Cin1_LENGTH 20 //要素数(個数指定用の定数)
MPPT51 1:47c28ece54ea 11 #define canSlaveID 0x10 //CAN通信IDを0x10に設定
MPPT51 0:3e0c71851fee 12
MPPT51 1:47c28ece54ea 13 CAN canSlave(p30, p29);
MPPT51 0:3e0c71851fee 14 Timer timer; //回転数計算用タイマ設定
MPPT51 1:47c28ece54ea 15 Ticker ticker1; //割り込み設定用
MPPT51 1:47c28ece54ea 16 Ticker ticker2; //割り込み設定用
MPPT51 1:47c28ece54ea 17
MPPT51 1:47c28ece54ea 18 Serial pc(USBTX, USBRX);
MPPT51 1:47c28ece54ea 19 BLDCmotorDriver M(p26, p24, p22, p25, p23, p21, p9, p8, p7, LED1);
MPPT51 0:3e0c71851fee 20 AnalogIn Pot(p20);
MPPT51 1:47c28ece54ea 21 DigitalIn direction(p16);
MPPT51 1:47c28ece54ea 22 DigitalIn accel(p15);
MPPT51 1:47c28ece54ea 23
MPPT51 1:47c28ece54ea 24 DigitalOut led2(LED2); //CAN_check
MPPT51 1:47c28ece54ea 25 DigitalOut led3(LED3); //direction_check
MPPT51 1:47c28ece54ea 26 DigitalOut led4(LED4); //accel_check
MPPT51 0:3e0c71851fee 27
MPPT51 1:47c28ece54ea 28 double rpm = 0.0, speed = 0.0; //モータ回転数、速度
MPPT51 1:47c28ece54ea 29 float dc = 0.0, dc_limit = 0.0;
MPPT51 1:47c28ece54ea 30 int sector = 0;
MPPT51 1:47c28ece54ea 31
MPPT51 1:47c28ece54ea 32 bool flagPrintf = 0; //main関数でのprintf処理のため
MPPT51 1:47c28ece54ea 33
MPPT51 0:3e0c71851fee 34 int forSend = 0; //データ送信時に一時的に使用する変数
MPPT51 0:3e0c71851fee 35 bool CANsendOK = 0; //CAN受信完了時,セットする(mainでのprintfのため)
MPPT51 0:3e0c71851fee 36 CANMessage msgSlave; //CAN送信用
MPPT51 0:3e0c71851fee 37 void Handler_canSlaveSend();
MPPT51 0:3e0c71851fee 38
MPPT51 1:47c28ece54ea 39 /*INA226関係*/ //GNDGND(G-G):0x80, Vs+Vs+(1-1):0x8A, SDASDA(D-D):0x94, SCLSCL(C-C):0x9E, GNDVs+(G-1):0x82
MPPT51 0:3e0c71851fee 40 I2C i2c(p28,p27);
MPPT51 0:3e0c71851fee 41 void initINA226(); //INA226の初期設定を行う関数
MPPT51 1:47c28ece54ea 42 void INA226_init(); //INA226の初期設定用関数
MPPT51 1:47c28ece54ea 43 INA226 VCmonitor(i2c);
MPPT51 0:3e0c71851fee 44 unsigned short val;
MPPT51 1:47c28ece54ea 45 double V,C;
MPPT51 0:3e0c71851fee 46 int count = 1; //INA226動作確認用カウンタ
MPPT51 0:3e0c71851fee 47 float data_Vin1[Vin1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列
MPPT51 0:3e0c71851fee 48 float data_Cin1[Cin1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列
MPPT51 1:47c28ece54ea 49 void get_VCipm(void); //IPMの電圧電流計測関数
MPPT51 0:3e0c71851fee 50
MPPT51 1:47c28ece54ea 51 void Handler_canSlaveSend() {
MPPT51 0:3e0c71851fee 52 forSend = (int)(V/100);
MPPT51 0:3e0c71851fee 53 msgSlave.data[0] = forSend / 100; //forSend / 100 = 15あまり43 となり,答えの方がデータ格納される
MPPT51 0:3e0c71851fee 54 msgSlave.data[1] = forSend % 100; //forSend / 100 = 15あまり43 となり,あまりの方がデータ格納される
MPPT51 0:3e0c71851fee 55
MPPT51 0:3e0c71851fee 56 forSend = (int)(C/10); //mAで取得した値を10で割り、char2分割で送り切れるようにする。(例: 測定電流が199.99Aのとき,C=199900.00となるため,forSend=19990となり,199と90で分割することで送信できる)
MPPT51 0:3e0c71851fee 57 msgSlave.data[2] = forSend / 100; //forSend / 100 = 5あまり54 となり,答えの方がデータ格納される
MPPT51 0:3e0c71851fee 58 msgSlave.data[3] = forSend % 100; //forSend % 100 = 5あまり54 となり,あまりの方がデータ格納される
MPPT51 0:3e0c71851fee 59
MPPT51 0:3e0c71851fee 60 forSend = (int)(speed*10); //speed * 10 = 856.5だが,intにするため,856が代入される
MPPT51 0:3e0c71851fee 61 msgSlave.data[4] = forSend / 100; //forSend / 100 = 8あまり56 となり,8がデータ格納される
MPPT51 0:3e0c71851fee 62 msgSlave.data[5] = forSend % 100; //forSend % 100 = 8あまり56 となり,56がデータ格納される
MPPT51 0:3e0c71851fee 63
MPPT51 0:3e0c71851fee 64 forSend = (int)(dc*100); //dc * 100 = 95
MPPT51 0:3e0c71851fee 65 msgSlave.data[6] = forSend; //charの最大値である255以下になるため,そのままデータ格納される
MPPT51 0:3e0c71851fee 66
MPPT51 0:3e0c71851fee 67 if(canSlave.write(msgSlave)){ //格納したデータを送信する
MPPT51 0:3e0c71851fee 68 CANsendOK = 1;
MPPT51 0:3e0c71851fee 69 }
MPPT51 0:3e0c71851fee 70 }
MPPT51 1:47c28ece54ea 71 /*
MPPT51 1:47c28ece54ea 72 void Handler_canSlaveRecieve(){ //canMasterから送信要求が来たとき,データ送信するための関数
MPPT51 0:3e0c71851fee 73 if( canSlave.read( msgSlave ) ){ //msgに送られたデータが入る
MPPT51 0:3e0c71851fee 74 led2 = !led2;
MPPT51 0:3e0c71851fee 75 if( msgSlave.id == canSlaveID ){ //IDがcanSlaveIDであれば処理する
MPPT51 1:47c28ece54ea 76 Handler_canSlaveSend(); //送信処理を開始する
MPPT51 0:3e0c71851fee 77 }
MPPT51 0:3e0c71851fee 78 }
MPPT51 0:3e0c71851fee 79 }
MPPT51 1:47c28ece54ea 80 */
MPPT51 1:47c28ece54ea 81 void INA226_init(){ //INA226初期設定を行う関数
MPPT51 1:47c28ece54ea 82 printf("\n\r");
MPPT51 1:47c28ece54ea 83 printf("VCmonitor INA226 TEST Program. (BUILD:[" __DATE__ "/" __TIME__ "])\n\r");
MPPT51 1:47c28ece54ea 84 if(!VCmonitor.isExist()){ pc.printf("VCmonitor NOT FOUND "); }
MPPT51 1:47c28ece54ea 85 val = 0;
MPPT51 1:47c28ece54ea 86 if(VCmonitor.rawRead(0x00,&val) != 0){ pc.printf("VCmonitor READ ERROR "); } //configResisterの値を読み取れるか確認(通信できてるか確認)
MPPT51 1:47c28ece54ea 87 VCmonitor.setConfigResister(); //configurationResisterの設定
MPPT51 1:47c28ece54ea 88 printf("VCmonitor Reg 0x00 : 0x%04x\n\r",val); //configResisterの値表示
MPPT51 1:47c28ece54ea 89 printf("\n\r");
MPPT51 1:47c28ece54ea 90 VCmonitor.setCurrentCalibration(); //calibrationResisterの設定
MPPT51 1:47c28ece54ea 91 }
MPPT51 0:3e0c71851fee 92
MPPT51 1:47c28ece54ea 93 int main() {
MPPT51 1:47c28ece54ea 94 /*ポート初期設定*/
MPPT51 1:47c28ece54ea 95 direction.mode(PullUp); //進行方向スイッチ入力ピンをプルアップに設定
MPPT51 1:47c28ece54ea 96 accel.mode(PullUp); //アクセルスイッチ入力ピンをプルアップに設定
MPPT51 1:47c28ece54ea 97
MPPT51 1:47c28ece54ea 98 /*INA226初期設定*/
MPPT51 1:47c28ece54ea 99 INA226_init(); //INA226の初期設定する関数に飛ぶ
MPPT51 1:47c28ece54ea 100
MPPT51 1:47c28ece54ea 101 /*CAN初期設定*/
MPPT51 1:47c28ece54ea 102 // canSlave.attach(&Handler_canSlaveRecieve, CAN::RxIrq); //CAN受信割り込みの設定
MPPT51 0:3e0c71851fee 103 msgSlave.id = canSlaveID; //CAN送信側(slave)のIDを決定
MPPT51 0:3e0c71851fee 104 msgSlave.len = 7; //CAN送信側で送るデータのバイト数
MPPT51 1:47c28ece54ea 105
MPPT51 1:47c28ece54ea 106 while(true) {
MPPT51 1:47c28ece54ea 107 dc = ( Pot.read()-0.5 )*2; //可変抵抗の値からduty比を設定
MPPT51 1:47c28ece54ea 108 // dc_limit = -0.0147 * speed * speed + 2.6842 * speed + 29.885; //加速側制限.elsxの式
MPPT51 1:47c28ece54ea 109 // dc = dc * dc_limit;
MPPT51 1:47c28ece54ea 110
MPPT51 1:47c28ece54ea 111 VCmonitor.getVoltage(&V); //IPM電圧(mV)測定
MPPT51 1:47c28ece54ea 112 VCmonitor.getCurrent(&C); //IPM電流(mA)測定
MPPT51 1:47c28ece54ea 113
MPPT51 1:47c28ece54ea 114 if( !accel.read() ){
MPPT51 1:47c28ece54ea 115 led4 = 0;
MPPT51 1:47c28ece54ea 116 M.setDutyCycle(0); //duty比の設定 duty比を0にする
MPPT51 0:3e0c71851fee 117 }
MPPT51 1:47c28ece54ea 118 if( accel.read() ){
MPPT51 1:47c28ece54ea 119 if( !direction.read() ){ //directionスイッチが0のとき
MPPT51 1:47c28ece54ea 120 led3 = 0; //処理
MPPT51 1:47c28ece54ea 121 }
MPPT51 1:47c28ece54ea 122 else if( direction.read() ){ //directionスイッチが1のとき
MPPT51 1:47c28ece54ea 123 led3 = 1;
MPPT51 1:47c28ece54ea 124 }
MPPT51 1:47c28ece54ea 125 led4 = 1;
MPPT51 1:47c28ece54ea 126 M.setDutyCycle(dc); //duty比の設定
MPPT51 1:47c28ece54ea 127 sector = M.getSector();
MPPT51 1:47c28ece54ea 128 //get_VCipm(); //Vin1とCin1を取得する
MPPT51 1:47c28ece54ea 129 //pc.printf("HS_cnt: %d HS_usec %d\n", M.HS_cnt, M.HS_usec); //デバッグ用
MPPT51 0:3e0c71851fee 130 }
MPPT51 1:47c28ece54ea 131 rpm = 3750 / (M.HS_usec * 0.001); //ミリ秒に直して逆数を3750に掛けるああ //BLDCmotorDriver.cpp(.h)で使っている変数をmainで使う場合は「M.」を付ける。「M」なのはmainの上の方でそう設定してるから。usecはmicro second:マイクロ秒
MPPT51 1:47c28ece54ea 132 speed = rpm * 0.10518; //3750とか0.010518は、excelで計算している。ファイル名「」
MPPT51 1:47c28ece54ea 133 pc.printf("Duty: %.2f, Sector: %d, %.1f km/h, rpm: %1.2f, V: %.0f, C: %.0f\n\r",dc, sector, speed, rpm, V, C);
MPPT51 1:47c28ece54ea 134 Handler_canSlaveSend(); //送信処理を開始する
MPPT51 0:3e0c71851fee 135 }
MPPT51 1:47c28ece54ea 136 }