20200823_Motacon2020_ver5_kikkawa
Dependencies: mbed FatFileSystemCpp INA226_abc BLDCmotorDriver_20200821_motacon_ver4
main.cpp@1:47c28ece54ea, 2020-08-21 (annotated)
- 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?
User | Revision | Line number | New 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 | } |