20200821_motacon_ver4

Dependencies:   mbed FatFileSystemCpp INA226_abc BLDCmotorDriver_20200902_1

Committer:
MPPT51
Date:
Wed Sep 02 05:05:55 2020 +0000
Revision:
2:24ee83f3d19e
Parent:
1:47c28ece54ea
20200902_kikkawa_2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MPPT51 2:24ee83f3d19e 1 //20200825 Kikkawa モタコン基板(緑色ver.1)での動作確認済み
MPPT51 1:47c28ece54ea 2 //BLDC, INA226, CAN
MPPT51 0:3e0c71851fee 3 #include "mbed.h"
MPPT51 1:47c28ece54ea 4 #include "BLDCmotorDriver.h"
MPPT51 1:47c28ece54ea 5 #include "INA226.hpp"
MPPT51 2:24ee83f3d19e 6 //#include "EthernetPowerControl.h" //消費電力削減
MPPT51 2:24ee83f3d19e 7 /*基本ポート設定*/
MPPT51 2:24ee83f3d19e 8 Serial pc(USBTX, USBRX); // USBシリアルポートのインスタンス
MPPT51 1:47c28ece54ea 9 BLDCmotorDriver M(p26, p24, p22, p25, p23, p21, p9, p8, p7, LED1);
MPPT51 1:47c28ece54ea 10 DigitalOut led2(LED2); //CAN_check
MPPT51 1:47c28ece54ea 11 DigitalOut led3(LED3); //direction_check
MPPT51 1:47c28ece54ea 12 DigitalOut led4(LED4); //accel_check
MPPT51 2:24ee83f3d19e 13 DigitalIn accel(p15);
MPPT51 2:24ee83f3d19e 14 DigitalIn direction(p16);
MPPT51 2:24ee83f3d19e 15 DigitalOut P17(p17); //see http://mbed.org/users/chris/notebook/Getting-best-ADC-performance/
MPPT51 2:24ee83f3d19e 16 DigitalOut P18(p18); //also setting unused analog input pins to digital outputs reduces A/D noise a bit
MPPT51 2:24ee83f3d19e 17 DigitalOut P19(p19);
MPPT51 2:24ee83f3d19e 18 AnalogIn Pot(p20);
MPPT51 1:47c28ece54ea 19
MPPT51 2:24ee83f3d19e 20 /*モータ駆動関係*/
MPPT51 2:24ee83f3d19e 21 float dc = 0.0;
MPPT51 1:47c28ece54ea 22
MPPT51 2:24ee83f3d19e 23 /*CAN関係*/
MPPT51 2:24ee83f3d19e 24 CAN CAN1(p30, p29); //CANのピンの設定
MPPT51 0:3e0c71851fee 25 int forSend = 0; //データ送信時に一時的に使用する変数
MPPT51 2:24ee83f3d19e 26 CANMessage msgCAN; //CAN送信用
MPPT51 2:24ee83f3d19e 27 void CAN1_send();
MPPT51 0:3e0c71851fee 28
MPPT51 1:47c28ece54ea 29 /*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 30 I2C i2c(p28,p27);
MPPT51 0:3e0c71851fee 31 void initINA226(); //INA226の初期設定を行う関数
MPPT51 1:47c28ece54ea 32 void INA226_init(); //INA226の初期設定用関数
MPPT51 1:47c28ece54ea 33 INA226 VCmonitor(i2c);
MPPT51 0:3e0c71851fee 34 unsigned short val;
MPPT51 1:47c28ece54ea 35 double V,C;
MPPT51 2:24ee83f3d19e 36
MPPT51 2:24ee83f3d19e 37 //printf用
MPPT51 2:24ee83f3d19e 38 char cnt_printf = 0;
MPPT51 0:3e0c71851fee 39
MPPT51 2:24ee83f3d19e 40 void CAN1_send() { //CANでデータ送信する関数。 //CAN1.attach(&Handler_canSlaveRecieve, CAN::RxIrq); <== この文はCAN受信割り込みの設定。使いたい時に使えるようにここに書いておく。使うときはmain関数で1回実行する。
MPPT51 2:24ee83f3d19e 41 msgCAN.id = 0x10; //送信するCANデータのIDを決める
MPPT51 2:24ee83f3d19e 42 msgCAN.len = 7; //CAN送信側で送るデータのバイト数
MPPT51 2:24ee83f3d19e 43
MPPT51 0:3e0c71851fee 44 forSend = (int)(V/100);
MPPT51 2:24ee83f3d19e 45 msgCAN.data[0] = forSend / 100; //forSend / 100 = 15あまり43 となり,答えの方がデータ格納される
MPPT51 2:24ee83f3d19e 46 msgCAN.data[1] = forSend % 100; //forSend / 100 = 15あまり43 となり,あまりの方がデータ格納される
MPPT51 0:3e0c71851fee 47
MPPT51 0:3e0c71851fee 48 forSend = (int)(C/10); //mAで取得した値を10で割り、char2分割で送り切れるようにする。(例: 測定電流が199.99Aのとき,C=199900.00となるため,forSend=19990となり,199と90で分割することで送信できる)
MPPT51 2:24ee83f3d19e 49 msgCAN.data[2] = forSend / 100; //forSend / 100 = 5あまり54 となり,答えの方がデータ格納される
MPPT51 2:24ee83f3d19e 50 msgCAN.data[3] = forSend % 100; //forSend % 100 = 5あまり54 となり,あまりの方がデータ格納される
MPPT51 0:3e0c71851fee 51
MPPT51 2:24ee83f3d19e 52 forSend = (int)(M.speed*10); //speed * 10 = 856.5だが,intにするため,856が代入される
MPPT51 2:24ee83f3d19e 53 msgCAN.data[4] = forSend / 100; //forSend / 100 = 8あまり56 となり,8がデータ格納される
MPPT51 2:24ee83f3d19e 54 msgCAN.data[5] = forSend % 100; //forSend % 100 = 8あまり56 となり,56がデータ格納される
MPPT51 0:3e0c71851fee 55
MPPT51 2:24ee83f3d19e 56 forSend = (int)(M.getDutyCycle()*100); //0~1を0~100にする
MPPT51 2:24ee83f3d19e 57 msgCAN.data[6] = forSend; //charの最大値である255以下になるため,そのままデータ格納される
MPPT51 0:3e0c71851fee 58
MPPT51 2:24ee83f3d19e 59 if(CAN1.write(msgCAN)){ //格納したデータを送信する
MPPT51 0:3e0c71851fee 60 }
MPPT51 0:3e0c71851fee 61 }
MPPT51 2:24ee83f3d19e 62
MPPT51 2:24ee83f3d19e 63 void INA226_init(){ //INA226の初期設定を行う関数
MPPT51 2:24ee83f3d19e 64 pc.printf("\n\r");
MPPT51 2:24ee83f3d19e 65 pc.printf("VCmonitor INA226 TEST Program. (BUILD:[" __DATE__ "/" __TIME__ "])\n\r");
MPPT51 1:47c28ece54ea 66 if(!VCmonitor.isExist()){ pc.printf("VCmonitor NOT FOUND "); }
MPPT51 1:47c28ece54ea 67 val = 0;
MPPT51 1:47c28ece54ea 68 if(VCmonitor.rawRead(0x00,&val) != 0){ pc.printf("VCmonitor READ ERROR "); } //configResisterの値を読み取れるか確認(通信できてるか確認)
MPPT51 1:47c28ece54ea 69 VCmonitor.setConfigResister(); //configurationResisterの設定
MPPT51 2:24ee83f3d19e 70 pc.printf("VCmonitor Reg 0x00 : 0x%04x\n\r",val); //configResisterの値表示
MPPT51 2:24ee83f3d19e 71 pc.printf("\n\r");
MPPT51 1:47c28ece54ea 72 VCmonitor.setCurrentCalibration(); //calibrationResisterの設定
MPPT51 1:47c28ece54ea 73 }
MPPT51 0:3e0c71851fee 74
MPPT51 1:47c28ece54ea 75 int main() {
MPPT51 2:24ee83f3d19e 76 //PHY_PowerDown(); //Ethernet停止 消費電力削減
MPPT51 2:24ee83f3d19e 77 pc.baud(115200); //pcとのシリアル通信速度指定。なるべく早くしないとpc.printfの処理時間が長くなってしまうかも
MPPT51 2:24ee83f3d19e 78 //ポート初期設定
MPPT51 1:47c28ece54ea 79 direction.mode(PullUp); //進行方向スイッチ入力ピンをプルアップに設定
MPPT51 1:47c28ece54ea 80 accel.mode(PullUp); //アクセルスイッチ入力ピンをプルアップに設定
MPPT51 2:24ee83f3d19e 81 //INA226初期設定
MPPT51 1:47c28ece54ea 82 INA226_init(); //INA226の初期設定する関数に飛ぶ
MPPT51 1:47c28ece54ea 83
MPPT51 1:47c28ece54ea 84 while(true) {
MPPT51 2:24ee83f3d19e 85 //ゲート信号デューティ比に使用する値をAD変換により取得
MPPT51 2:24ee83f3d19e 86 dc = ( Pot.read()*8 - 0.3 ); //可変抵抗の値からduty比を設定 Pot.read()を8倍することで可変抵抗をたくさん回さなくても値が上昇する -0.3して回生の処理をしやすくなるようにしておく(dcが0未満の時回生にするなど)
MPPT51 2:24ee83f3d19e 87 if( dc >= 1 ){ dc = 1; }
MPPT51 2:24ee83f3d19e 88 M.setDutyCycle(dc); //duty比の設定
MPPT51 2:24ee83f3d19e 89
MPPT51 2:24ee83f3d19e 90 //IPMの入力電圧、入力電流の測定
MPPT51 1:47c28ece54ea 91 VCmonitor.getVoltage(&V); //IPM電圧(mV)測定
MPPT51 2:24ee83f3d19e 92 V = V * 14.825; //計算の仕方は「ソーラーカー電装品図(パワポ資料)」に書いてある 270kと20kで分圧したとき14.825をかける
MPPT51 2:24ee83f3d19e 93 V = V * 0.996; //テスタ実測結果を反映して値を調整する
MPPT51 1:47c28ece54ea 94 VCmonitor.getCurrent(&C); //IPM電流(mA)測定
MPPT51 1:47c28ece54ea 95
MPPT51 2:24ee83f3d19e 96 //アクセルがONかOFFか判定する
MPPT51 2:24ee83f3d19e 97 if( !accel.read() ){ //accel.read()が0(スイッチがOFF)の時の処理
MPPT51 1:47c28ece54ea 98 led4 = 0;
MPPT51 2:24ee83f3d19e 99 M.accel = 0;
MPPT51 0:3e0c71851fee 100 }
MPPT51 1:47c28ece54ea 101 if( accel.read() ){
MPPT51 1:47c28ece54ea 102 if( !direction.read() ){ //directionスイッチが0のとき
MPPT51 1:47c28ece54ea 103 led3 = 0; //処理
MPPT51 1:47c28ece54ea 104 }
MPPT51 1:47c28ece54ea 105 else if( direction.read() ){ //directionスイッチが1のとき
MPPT51 1:47c28ece54ea 106 led3 = 1;
MPPT51 1:47c28ece54ea 107 }
MPPT51 1:47c28ece54ea 108 led4 = 1;
MPPT51 2:24ee83f3d19e 109 M.accel = 1;
MPPT51 0:3e0c71851fee 110 }
MPPT51 2:24ee83f3d19e 111 //シリアル通信でpc(teratermなど)に表示
MPPT51 2:24ee83f3d19e 112 ++cnt_printf;
MPPT51 2:24ee83f3d19e 113 if( cnt_printf >= 50 ){
MPPT51 2:24ee83f3d19e 114 pc.printf("Duty: %.2f, Sector: %d, %.1f km/h, rpm: %1.2f, V: %.0f, C: %.0f, limit1: %.3f, HS_cnt: %d HS_usec %.2f\n\r", M.getDutyCycle(), M.getSector(), M.speed, M.rpm, V, C, M.dc_limit1, M.HS_cnt, M.HS_usec);
MPPT51 2:24ee83f3d19e 115 cnt_printf = 0;
MPPT51 2:24ee83f3d19e 116 }
MPPT51 2:24ee83f3d19e 117 //CANデータ送信する
MPPT51 2:24ee83f3d19e 118 CAN1_send(); //送信処理する関数に飛ぶ
MPPT51 0:3e0c71851fee 119 }
MPPT51 1:47c28ece54ea 120 }