20200823_Motacon2020_ver5_kikkawa
Dependencies: mbed FatFileSystemCpp INA226_abc BLDCmotorDriver_20200821_motacon_ver4
Revision 1:47c28ece54ea, committed 2020-08-21
- Comitter:
- MPPT51
- Date:
- Fri Aug 21 08:30:26 2020 +0000
- Parent:
- 0:3e0c71851fee
- Commit message:
- 20200821_motacon_ver4
Changed in this revision
diff -r 3e0c71851fee -r 47c28ece54ea BLDCmotorDriver.lib --- a/BLDCmotorDriver.lib Mon Aug 03 03:20:27 2020 +0000 +++ b/BLDCmotorDriver.lib Fri Aug 21 08:30:26 2020 +0000 @@ -1,1 +1,1 @@ -http://developer.mbed.org/teams/TVZ-Mechatronics-Team/code/BLDCmotorDriver/#cf8183ae80ef +https://os.mbed.com/users/MPPT51/code/BLDCmotorDriver_20200821_motacon_ver4/#51643d078474
diff -r 3e0c71851fee -r 47c28ece54ea INA226.lib --- a/INA226.lib Mon Aug 03 03:20:27 2020 +0000 +++ b/INA226.lib Fri Aug 21 08:30:26 2020 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/users/tosihisa/code/INA226/#a122073b93e2 +https://os.mbed.com/users/MPPT51/code/INA226_abc/#15402b7eddf7
diff -r 3e0c71851fee -r 47c28ece54ea RateLimiter.lib --- a/RateLimiter.lib Mon Aug 03 03:20:27 2020 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/teams/TVZ-Mechatronics-Team/code/RateLimiter/#d735360f91f9
diff -r 3e0c71851fee -r 47c28ece54ea main.cpp --- a/main.cpp Mon Aug 03 03:20:27 2020 +0000 +++ b/main.cpp Fri Aug 21 08:30:26 2020 +0000 @@ -1,129 +1,54 @@ -/* - Motacon 20200803 ver.2 - ver.1: ブラシレスモータ(BLDC), USBメモリ書き込み, LM61(インバータ温度測定), INA226(インバータ電流電圧測定), CAN - ver.2 まともなプログラムになるように努力中 -*/ +//20200803 Kikkawa モタコン基板(緑色ver.1)での動作確認済み +//BLDC, INA226, CAN + #include "mbed.h" -#include "MSCFileSystem.h" //USBメモリ操作のため -#include "INA226.hpp" //INA226操作のため -#include "RateLimiter.h" //モータ加減速調整のため -#include "BLDCmotorDriver.h"//BLDC操作のため - +#include "BLDCmotorDriver.h" +#include "INA226.hpp" + /*定数の設定*/ #define Vin1_LENGTH 20 //要素数(個数指定用の定数) #define Cin1_LENGTH 20 //要素数(個数指定用の定数) -#define Vout1_LENGTH 20 //要素数(個数指定用の定数) -#define Cout1_LENGTH 20 //要素数(個数指定用の定数) -#define temp1_LENGTH 20 //要素数(個数指定用の定数) -#define temp2_LENGTH 20 //要素数(個数指定用の定数) +#define canSlaveID 0x10 //CAN通信IDを0x10に設定 -/*基本の設定*/ -Serial pc(USBTX, USBRX); -DigitalOut myled(LED1); // -DigitalOut led2(LED2); // -DigitalOut led3(LED3); // -bool flagPrintf = 0; //main関数でのprintf処理のためのフラグ -Ticker ticker1; //割り込み設定用 - -/*BLDC設定*/ +CAN canSlave(p30, p29); Timer timer; //回転数計算用タイマ設定 -BLDCmotorDriver M(p26, p24, p22, p25, p23, p21, p14, p17, p18, LED1); +Ticker ticker1; //割り込み設定用 +Ticker ticker2; //割り込み設定用 + +Serial pc(USBTX, USBRX); +BLDCmotorDriver M(p26, p24, p22, p25, p23, p21, p9, p8, p7, LED1); AnalogIn Pot(p20); -InterruptIn HS_p16(p16); -InterruptIn DIRECTION_SW(p8); -void initBLDC(); //BLDCの初期設定を行う関数 -float rpm = 0, speed = 0; -double dc = 0.0; -bool direction = 0;//方向を決める -int begin, end; // -int HS_timer = 0; //速度検出のために使う変数 -int HS_timer1 = 0; //速度検出のために使う変数 -int reset_cnt = 0; //Timerをリセットするために使うカウンタ +DigitalIn direction(p16); +DigitalIn accel(p15); + +DigitalOut led2(LED2); //CAN_check +DigitalOut led3(LED3); //direction_check +DigitalOut led4(LED4); //accel_check -/*CANの設定*/ -CAN canSlave(p30, p29); //CANのピン設定 -void initCAN(); //CANの初期設定を行う関数 +double rpm = 0.0, speed = 0.0; //モータ回転数、速度 +float dc = 0.0, dc_limit = 0.0; +int sector = 0; + +bool flagPrintf = 0; //main関数でのprintf処理のため + int forSend = 0; //データ送信時に一時的に使用する変数 bool CANsendOK = 0; //CAN受信完了時,セットする(mainでのprintfのため) CANMessage msgSlave; //CAN送信用 -unsigned int canSlaveID = 0x10; //canSlaveの初期IDを0x10に設定 (モタコン:0x10, ) void Handler_canSlaveSend(); -/*INA226設定*/ //GNDGND(G-G):0x80, Vs+Vs+(1-1):0x8A, SDASDA(D-D):0x94, SCLSCL(C-C):0x9E, GNDVs+(G-1):0x82 +/*INA226関係*/ //GNDGND(G-G):0x80, Vs+Vs+(1-1):0x8A, SDASDA(D-D):0x94, SCLSCL(C-C):0x9E, GNDVs+(G-1):0x82 I2C i2c(p28,p27); -INA226 VCmonitor1(i2c,0x9E); //GNDGND(G-G)に設定したINA226がVCmonitor1(1台目) -INA226 VCmonitor2(i2c,0x94); //Vs+Vs+(1-1)に設定したINA226がVCmonitor2(2台目) void initINA226(); //INA226の初期設定を行う関数 +void INA226_init(); //INA226の初期設定用関数 +INA226 VCmonitor(i2c); unsigned short val; -double V,C,Vin1,Cin1,Vout1,Cout1; +double V,C; int count = 1; //INA226動作確認用カウンタ float data_Vin1[Vin1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列 float data_Cin1[Cin1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列 -float data_Vout1[Vout1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列 -float data_Cout1[Cout1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列 -void get_VCin1(void); -void get_VCout1(void); - -/*温度測定(LM61)設定*/ -AnalogIn LM61(p15); ////set p15 to analog input to read LM61 sensor's voltage output -float temp1 = 0.0, temp2 = 0.0; -void get_temp(void); //温度取得する関数 -float data_temp1[temp1_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列 -float data_temp2[temp2_LENGTH] = {0.0, 0.0, 0.0, 0.0, 0.0}; //一時的データ格納配列 - -/*ADCのピン設定*/ //also setting unused analog input pins to digital outputs reduces A/D noise a bit //see http://mbed.org/users/chris/notebook/Getting-best-ADC-performance/ -DigitalOut P19(p19); - - /*USBメモリの設定*/ -MSCFileSystem msc("usb"); // Mount flash drive under the name "msc" -void write_toMSC(void); //MSC=USBメモリ -FILE *fp; //ファイルの設定 - -//Timer timer; //処理時間測定用タイマ デバッグに使用する -int n = 0; //移動平均算出に使うカウンタ +void get_VCipm(void); //IPMの電圧電流計測関数 -/*時間割り込み関数*/ -void handler_0t2s(){ //0.2秒毎の割り込み - if( direction == 0 ){ //正回転 - dc = Pot.read(); - } - if( direction == 1 ){ //逆回転 - dc = -1 * Pot.read(); - } - reset_cnt++; - if( reset_cnt >= 6000 ){ - timer.reset(); - reset_cnt = 0; - } - //flagPrintf = 1; -} -/*ホールセンサの立ち上がりから立ち上がりまでの時間計測する関数*/ -void handler_HS(){ - if( HS_timer == 0 ){ - begin = timer.read_us(); - HS_timer1 = 0; - } - if( HS_timer == 1 ){ - end = timer.read_us(); - HS_timer1 = 1; - } - if( HS_timer1 == 0 ){ - HS_timer = 1; - } - if( HS_timer1 == 1 ){ - HS_timer = 0; - rpm = 3750 / (abs(end - begin) * 0.001); - speed = rpm * 0.10518; - } -} -/*Directionスイッチの割り込み 進行方向切り替え*/ -void handler_directionSW(){ - if( dc <= 0 ){ - direction = !direction; - } -} -/*CANでデータを送信する関数*/ -void Handler_canSlaveSend() { +void Handler_canSlaveSend() { forSend = (int)(V/100); msgSlave.data[0] = forSend / 100; //forSend / 100 = 15あまり43 となり,答えの方がデータ格納される msgSlave.data[1] = forSend % 100; //forSend / 100 = 15あまり43 となり,あまりの方がデータ格納される @@ -143,115 +68,69 @@ CANsendOK = 1; } } -/*CAN通信相手から送信要求がきたとき実行される*/ -void Handler_canSlaveRecieve(){ //CANの通信相手から,送信要求がきたときに実行される関数 +/* +void Handler_canSlaveRecieve(){ //canMasterから送信要求が来たとき,データ送信するための関数 if( canSlave.read( msgSlave ) ){ //msgに送られたデータが入る led2 = !led2; if( msgSlave.id == canSlaveID ){ //IDがcanSlaveIDであれば処理する - Handler_canSlaveSend(); //送信処理をする関数に飛ぶ + Handler_canSlaveSend(); //送信処理を開始する } } } -/*電圧と電流測定する関数*/ -void get_VCin1(){ - if((VCmonitor1.getVoltage(&V) == 0) && (VCmonitor1.getCurrent(&C) == 0)){ //1台目INA226の電圧電流測定 - Vin1 -= data_Vin1[n]; //移動平均処理 - Cin1 -= data_Cin1[n]; //移動平均処理 - data_Vin1[n] = V/Vin1_LENGTH; //移動平均処理 - data_Cin1[n] = C/Cin1_LENGTH; //移動平均処理 - Vin1 += data_Vin1[n]; //移動平均処理 - Cin1 += data_Cin1[n]; //移動平均処理 - pc.printf("\n%d, Vin1: %f, Cin1: %f\n",count,Vin1,Cin1); - } -} -/*温度測定する関数*/ -void get_temp(){ - temp1 -= data_temp1[n]; //移動平均処理 - data_temp1[n] = ( ((LM61*3.3)-0.600)*100.0 ) / temp1_LENGTH; //移動平均処理 - temp1 += data_temp1[n]; //移動平均処理 - pc.printf("temp1:%5.2F C temp2:%5.2F C \n\r", temp1, temp2); -} -void write_toMSC(){ - if ( (fp= fopen( "/usb/MPPT.csv", "a")) == NULL ){ //ファイルを開く, aは上書きの命令(ファイルが存在しなければ新規作成する) - pc.printf("USB error\r\n"); - exit(1); - } - pc.printf("USB file write!\r\n"); - //timer.start(); //書き込み時間測定開始 - fprintf(fp,"%f,%f,%f,%f,%f,%f\n", Vin1, Cin1, Vout1, Vout1, temp1, temp2); //ファイル書き込み - //timer.stop(); //書き込み時間測定終了 - fclose(fp); //ファイルを閉じる - //pc.printf("write time :%f\n\n\n",timer.read()); -} +*/ +void INA226_init(){ //INA226初期設定を行う関数 + printf("\n\r"); + printf("VCmonitor INA226 TEST Program. (BUILD:[" __DATE__ "/" __TIME__ "])\n\r"); + if(!VCmonitor.isExist()){ pc.printf("VCmonitor NOT FOUND "); } + val = 0; + if(VCmonitor.rawRead(0x00,&val) != 0){ pc.printf("VCmonitor READ ERROR "); } //configResisterの値を読み取れるか確認(通信できてるか確認) + VCmonitor.setConfigResister(); //configurationResisterの設定 + printf("VCmonitor Reg 0x00 : 0x%04x\n\r",val); //configResisterの値表示 + printf("\n\r"); + VCmonitor.setCurrentCalibration(); //calibrationResisterの設定 +} -/*INA226の初期設定*/ -void initINA226(){ - // 1台目の設定 - if ( !VCmonitor1.isExist() ){ - pc.printf("VCmonitor1 INA226 Not Found.\n"); - } - val = 0; - if ( VCmonitor1.rawRead(0x00,&val) != 0){ - pc.printf("VCmonitor1 INA226 Read Error\n"); - } - pc.printf("VCmonitor1 Reg 0x00 : 0x%04x\r\n",val); - VCmonitor1.setCurrentCalibration(); -} -/*CANの初期設定*/ -void initCAN(){ - canSlave.attach(&Handler_canSlaveRecieve, CAN::RxIrq); //CAN受信割り込みの設定 +int main() { + /*ポート初期設定*/ + direction.mode(PullUp); //進行方向スイッチ入力ピンをプルアップに設定 + accel.mode(PullUp); //アクセルスイッチ入力ピンをプルアップに設定 + + /*INA226初期設定*/ + INA226_init(); //INA226の初期設定する関数に飛ぶ + + /*CAN初期設定*/ +// canSlave.attach(&Handler_canSlaveRecieve, CAN::RxIrq); //CAN受信割り込みの設定 msgSlave.id = canSlaveID; //CAN送信側(slave)のIDを決定 msgSlave.len = 7; //CAN送信側で送るデータのバイト数 -} -void initBLDC(){ - timer.start(); //回転数計算用タイマスタート - DIRECTION_SW.mode(PullUp); //directionスイッチのモード設定 - DIRECTION_SW.fall(&handler_directionSW); //directionスイッチの立ち上がり割り込み設定 - DIRECTION_SW.rise(&handler_directionSW); //directionスイッチの立ち下がり割り込み設定 どちらも同じ関数に飛ぶ - led3 = DIRECTION_SW.read(); -// HS_p16.rise(&handler_HS); //ホールセンサ立ち上がり割り込み設定 -} - -/*メイン関数*/ -int main() -{ - initINA226(); //INA226の初期設定 - initCAN(); - initBLDC(); //BLDC制御のための初期設定 - ticker1.attach(&handler_0t2s, 0.3); //0.3秒毎に飛ぶ「handler_0t3s」関数 - - while(1) { - get_VCin1(); //Vipm(IPMへの入力電圧)とCipm(IPMへの入力電流)を取得 - get_temp(); //温度測定 -// write_toMSC(); //データをUSBメモリに保存 - - n++; - if( n >= Vin1_LENGTH ){ //カウンタがサンプル数を超えたら,0に戻り,移動平均算出を続ける - n = 0; + + while(true) { + dc = ( Pot.read()-0.5 )*2; //可変抵抗の値からduty比を設定 +// dc_limit = -0.0147 * speed * speed + 2.6842 * speed + 29.885; //加速側制限.elsxの式 +// dc = dc * dc_limit; + + VCmonitor.getVoltage(&V); //IPM電圧(mV)測定 + VCmonitor.getCurrent(&C); //IPM電流(mA)測定 + + if( !accel.read() ){ + led4 = 0; + M.setDutyCycle(0); //duty比の設定 duty比を0にする } - - M.setDutyCycle(dc); //モータを駆動する関数 引数dcは,PWMのデューティ比 - flagPrintf = 1; - if( flagPrintf ){ //flagPrntfが1なら,以下を処理する - flagPrintf = 0; - pc.printf("Duty Cycle: %1.2f, Sector: %d\n\r",dc, M.getSector()); - pc.printf("Toggle the led takes %d us\n", abs(end - begin)); - pc.printf("%f rpm\n",rpm); - pc.printf("%f km/h\n",speed); - pc.printf("V,%f,C,%f\n",V,C); + if( accel.read() ){ + if( !direction.read() ){ //directionスイッチが0のとき + led3 = 0; //処理 + } + else if( direction.read() ){ //directionスイッチが1のとき + led3 = 1; + } + led4 = 1; + M.setDutyCycle(dc); //duty比の設定 + sector = M.getSector(); + //get_VCipm(); //Vin1とCin1を取得する + //pc.printf("HS_cnt: %d HS_usec %d\n", M.HS_cnt, M.HS_usec); //デバッグ用 } - /* - if( CANsendOK ) { - CANsendOK = 0; - printf("Data in msgSlave.data[0] : %d\n\r", msgSlave.data[0]); //CANで送信したデータをそのまま表示 - printf("Data in msgSlave.data[1] : %d\n\r", msgSlave.data[1]); //上に同じ - printf("Data in msgSlave.data[2] : %d\n\r", msgSlave.data[2]); //上に同じ - printf("Data in msgSlave.data[3] : %d\n\r", msgSlave.data[3]); //上に同じ - printf("Data in msgSlave.data[4] : %d\n\r", msgSlave.data[4]); //上に同じ - printf("Data in msgSlave.data[5] : %d\n\r", msgSlave.data[5]); //上に同じ - printf("Data in msgSlave.data[6] : %d\n\r", msgSlave.data[6]); //上に同じ - printf("\n\r"); - } - */ + rpm = 3750 / (M.HS_usec * 0.001); //ミリ秒に直して逆数を3750に掛けるああ //BLDCmotorDriver.cpp(.h)で使っている変数をmainで使う場合は「M.」を付ける。「M」なのはmainの上の方でそう設定してるから。usecはmicro second:マイクロ秒 + speed = rpm * 0.10518; //3750とか0.010518は、excelで計算している。ファイル名「」 + pc.printf("Duty: %.2f, Sector: %d, %.1f km/h, rpm: %1.2f, V: %.0f, C: %.0f\n\r",dc, sector, speed, rpm, V, C); + Handler_canSlaveSend(); //送信処理を開始する } -} +} \ No newline at end of file