Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed FatFileSystemCpp INA226_abc BLDCmotorDriver_20200902_1
Revision 2:24ee83f3d19e, committed 2020-09-02
- Comitter:
- MPPT51
- Date:
- Wed Sep 02 05:05:55 2020 +0000
- Parent:
- 1:47c28ece54ea
- Commit message:
- 20200902_kikkawa_2
Changed in this revision
| BLDCmotorDriver.lib | Show annotated file Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/BLDCmotorDriver.lib Fri Aug 21 08:30:26 2020 +0000 +++ b/BLDCmotorDriver.lib Wed Sep 02 05:05:55 2020 +0000 @@ -1,1 +1,1 @@ -https://os.mbed.com/users/MPPT51/code/BLDCmotorDriver_20200821_motacon_ver4/#51643d078474 +https://os.mbed.com/users/MPPT51/code/BLDCmotorDriver_20200902_1/#7365c75b2af1
--- a/main.cpp Fri Aug 21 08:30:26 2020 +0000
+++ b/main.cpp Wed Sep 02 05:05:55 2020 +0000
@@ -1,40 +1,30 @@
-//20200803 Kikkawa モタコン基板(緑色ver.1)での動作確認済み
+//20200825 Kikkawa モタコン基板(緑色ver.1)での動作確認済み
//BLDC, INA226, CAN
-
#include "mbed.h"
#include "BLDCmotorDriver.h"
#include "INA226.hpp"
-
-/*定数の設定*/
-#define Vin1_LENGTH 20 //要素数(個数指定用の定数)
-#define Cin1_LENGTH 20 //要素数(個数指定用の定数)
-#define canSlaveID 0x10 //CAN通信IDを0x10に設定
-
-CAN canSlave(p30, p29);
-Timer timer; //回転数計算用タイマ設定
-Ticker ticker1; //割り込み設定用
-Ticker ticker2; //割り込み設定用
-
-Serial pc(USBTX, USBRX);
+//#include "EthernetPowerControl.h" //消費電力削減
+/*基本ポート設定*/
+Serial pc(USBTX, USBRX); // USBシリアルポートのインスタンス
BLDCmotorDriver M(p26, p24, p22, p25, p23, p21, p9, p8, p7, LED1);
-AnalogIn Pot(p20);
-DigitalIn direction(p16);
-DigitalIn accel(p15);
-
DigitalOut led2(LED2); //CAN_check
DigitalOut led3(LED3); //direction_check
DigitalOut led4(LED4); //accel_check
-
-double rpm = 0.0, speed = 0.0; //モータ回転数、速度
-float dc = 0.0, dc_limit = 0.0;
-int sector = 0;
+DigitalIn accel(p15);
+DigitalIn direction(p16);
+DigitalOut P17(p17); //see http://mbed.org/users/chris/notebook/Getting-best-ADC-performance/
+DigitalOut P18(p18); //also setting unused analog input pins to digital outputs reduces A/D noise a bit
+DigitalOut P19(p19);
+AnalogIn Pot(p20);
-bool flagPrintf = 0; //main関数でのprintf処理のため
+/*モータ駆動関係*/
+float dc = 0.0;
+/*CAN関係*/
+CAN CAN1(p30, p29); //CANのピンの設定
int forSend = 0; //データ送信時に一時的に使用する変数
-bool CANsendOK = 0; //CAN受信完了時,セットする(mainでのprintfのため)
-CANMessage msgSlave; //CAN送信用
-void Handler_canSlaveSend();
+CANMessage msgCAN; //CAN送信用
+void CAN1_send();
/*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);
@@ -43,77 +33,70 @@
INA226 VCmonitor(i2c);
unsigned short val;
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}; //一時的データ格納配列
-void get_VCipm(void); //IPMの電圧電流計測関数
+
+//printf用
+char cnt_printf = 0;
-void Handler_canSlaveSend() {
+void CAN1_send() { //CANでデータ送信する関数。 //CAN1.attach(&Handler_canSlaveRecieve, CAN::RxIrq); <== この文はCAN受信割り込みの設定。使いたい時に使えるようにここに書いておく。使うときはmain関数で1回実行する。
+ msgCAN.id = 0x10; //送信するCANデータのIDを決める
+ msgCAN.len = 7; //CAN送信側で送るデータのバイト数
+
forSend = (int)(V/100);
- msgSlave.data[0] = forSend / 100; //forSend / 100 = 15あまり43 となり,答えの方がデータ格納される
- msgSlave.data[1] = forSend % 100; //forSend / 100 = 15あまり43 となり,あまりの方がデータ格納される
+ msgCAN.data[0] = forSend / 100; //forSend / 100 = 15あまり43 となり,答えの方がデータ格納される
+ msgCAN.data[1] = forSend % 100; //forSend / 100 = 15あまり43 となり,あまりの方がデータ格納される
forSend = (int)(C/10); //mAで取得した値を10で割り、char2分割で送り切れるようにする。(例: 測定電流が199.99Aのとき,C=199900.00となるため,forSend=19990となり,199と90で分割することで送信できる)
- msgSlave.data[2] = forSend / 100; //forSend / 100 = 5あまり54 となり,答えの方がデータ格納される
- msgSlave.data[3] = forSend % 100; //forSend % 100 = 5あまり54 となり,あまりの方がデータ格納される
+ msgCAN.data[2] = forSend / 100; //forSend / 100 = 5あまり54 となり,答えの方がデータ格納される
+ msgCAN.data[3] = forSend % 100; //forSend % 100 = 5あまり54 となり,あまりの方がデータ格納される
- forSend = (int)(speed*10); //speed * 10 = 856.5だが,intにするため,856が代入される
- msgSlave.data[4] = forSend / 100; //forSend / 100 = 8あまり56 となり,8がデータ格納される
- msgSlave.data[5] = forSend % 100; //forSend % 100 = 8あまり56 となり,56がデータ格納される
+ forSend = (int)(M.speed*10); //speed * 10 = 856.5だが,intにするため,856が代入される
+ msgCAN.data[4] = forSend / 100; //forSend / 100 = 8あまり56 となり,8がデータ格納される
+ msgCAN.data[5] = forSend % 100; //forSend % 100 = 8あまり56 となり,56がデータ格納される
- forSend = (int)(dc*100); //dc * 100 = 95
- msgSlave.data[6] = forSend; //charの最大値である255以下になるため,そのままデータ格納される
+ forSend = (int)(M.getDutyCycle()*100); //0~1を0~100にする
+ msgCAN.data[6] = forSend; //charの最大値である255以下になるため,そのままデータ格納される
- if(canSlave.write(msgSlave)){ //格納したデータを送信する
- CANsendOK = 1;
+ if(CAN1.write(msgCAN)){ //格納したデータを送信する
}
}
-/*
-void Handler_canSlaveRecieve(){ //canMasterから送信要求が来たとき,データ送信するための関数
- if( canSlave.read( msgSlave ) ){ //msgに送られたデータが入る
- led2 = !led2;
- if( msgSlave.id == canSlaveID ){ //IDがcanSlaveIDであれば処理する
- Handler_canSlaveSend(); //送信処理を開始する
- }
- }
-}
-*/
-void INA226_init(){ //INA226初期設定を行う関数
- printf("\n\r");
- printf("VCmonitor INA226 TEST Program. (BUILD:[" __DATE__ "/" __TIME__ "])\n\r");
+
+void INA226_init(){ //INA226の初期設定を行う関数
+ pc.printf("\n\r");
+ pc.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");
+ pc.printf("VCmonitor Reg 0x00 : 0x%04x\n\r",val); //configResisterの値表示
+ pc.printf("\n\r");
VCmonitor.setCurrentCalibration(); //calibrationResisterの設定
}
int main() {
- /*ポート初期設定*/
+ //PHY_PowerDown(); //Ethernet停止 消費電力削減
+ pc.baud(115200); //pcとのシリアル通信速度指定。なるべく早くしないとpc.printfの処理時間が長くなってしまうかも
+ //ポート初期設定
direction.mode(PullUp); //進行方向スイッチ入力ピンをプルアップに設定
accel.mode(PullUp); //アクセルスイッチ入力ピンをプルアップに設定
-
- /*INA226初期設定*/
+ //INA226初期設定
INA226_init(); //INA226の初期設定する関数に飛ぶ
-
- /*CAN初期設定*/
-// canSlave.attach(&Handler_canSlaveRecieve, CAN::RxIrq); //CAN受信割り込みの設定
- msgSlave.id = canSlaveID; //CAN送信側(slave)のIDを決定
- msgSlave.len = 7; //CAN送信側で送るデータのバイト数
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;
-
+ //ゲート信号デューティ比に使用する値をAD変換により取得
+ dc = ( Pot.read()*8 - 0.3 ); //可変抵抗の値からduty比を設定 Pot.read()を8倍することで可変抵抗をたくさん回さなくても値が上昇する -0.3して回生の処理をしやすくなるようにしておく(dcが0未満の時回生にするなど)
+ if( dc >= 1 ){ dc = 1; }
+ M.setDutyCycle(dc); //duty比の設定
+
+ //IPMの入力電圧、入力電流の測定
VCmonitor.getVoltage(&V); //IPM電圧(mV)測定
+ V = V * 14.825; //計算の仕方は「ソーラーカー電装品図(パワポ資料)」に書いてある 270kと20kで分圧したとき14.825をかける
+ V = V * 0.996; //テスタ実測結果を反映して値を調整する
VCmonitor.getCurrent(&C); //IPM電流(mA)測定
- if( !accel.read() ){
+ //アクセルがONかOFFか判定する
+ if( !accel.read() ){ //accel.read()が0(スイッチがOFF)の時の処理
led4 = 0;
- M.setDutyCycle(0); //duty比の設定 duty比を0にする
+ M.accel = 0;
}
if( accel.read() ){
if( !direction.read() ){ //directionスイッチが0のとき
@@ -123,14 +106,15 @@
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); //デバッグ用
+ M.accel = 1;
}
- 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(); //送信処理を開始する
+ //シリアル通信でpc(teratermなど)に表示
+ ++cnt_printf;
+ if( cnt_printf >= 50 ){
+ 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);
+ cnt_printf = 0;
+ }
+ //CANデータ送信する
+ CAN1_send(); //送信処理する関数に飛ぶ
}
}
\ No newline at end of file