20200821_motacon_ver4
Dependencies: mbed FatFileSystemCpp INA226_abc BLDCmotorDriver_20200902_1
main.cpp@2:24ee83f3d19e, 2020-09-02 (annotated)
- 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?
User | Revision | Line number | New 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 | } |