
sss
Dependencies: mbed TetraOmni_verKi PID2 QEI_verKi BusSerial
FourOmniMecha.cpp
- Committer:
- ttrist
- Date:
- 2020-03-26
- Revision:
- 0:620b24ebccae
File content as of revision 0:620b24ebccae:
#include "mbed.h" #include "BusSerial.h" #include "MotorControler.h" #include "PID.h" #include "QEI.h" #include "TetraOmni.h" //ハード定数 const int PPR = 250; const double MaxRPS = 12; //ソフト定数 const uint8_t HeadNum = 250; //基板ID const double Kp=0.05,Ki=0.058,Kd=0.005; //ホイール速度PID const double MoveRatio=0.7,RotationRatio=0.3; //移動と回転の比 const double DiffRange = 0.5; //Fake目標値の真目標への変化範囲 const double StopThresholdRPS = 1.5; //目標値が0の場合,このRPSなら一瞬で出力を0にする const int TargetRPSStage = 100; //目標値の偏差を分割する個数 //変数 //インスタンス生成 Timer timer; Ticker ticker0,ticker1,ticker2,ticker3; BusSerial BS(PA_0,PA_1,&timer); PID MOT_PID[4]= {PID(&timer),PID(&timer),PID(&timer),PID(&timer)}; TetraOmni Omni = TetraOmni(MoveRatio,RotationRatio,MaxRPS,DiffRange); MotorControler MOT[4]= {MotorControler( PA_8, PC_6, PA_7),MotorControler( PA_9, PC_7, PA_7), MotorControler( PA_10, PC_8, PA_7),MotorControler( PA_11, PC_9, PA_7) }; QEI ENC[4]= {QEI(PB_2, PA_6,PPR,&timer,&ticker0), QEI( PB_5, PB_4,PPR,&timer,&ticker1), QEI(PB_8, PB_7,PPR,&timer,&ticker2), QEI( PB_13, PB_12,PPR,&timer,&ticker3) }; //プロトタイプ宣言 void classSetting(); //ピン設定 DigitalOut RBG[3]= {DigitalOut(PA_15),DigitalOut(PB_0),DigitalOut(PA_4)}; int main() { printf("boot\n"); //クラス一括設定 classSetting(); for(int i=0; i<4; i++)MOT[i].setSpeed(0); //初期モーター速度は1にしとく for(int i =0; i<3; i++) { RBG[i]=1; wait(1); RBG[i]=0; } RBG[0]=1; while(1) { //値直接入力によるデバッグ部分 //uint8_t RecieveData[5] = {250,0,0,0,0b10000}; //データ受信 uint8_t RecieveData[5]; BS.GetBusSerial(&RecieveData[0],HeadNum,5,100); //***データがちゃんと受信できた場合*** if(RecieveData[0]==HeadNum) { //受信データ処理 double MoveDirection = RecieveData[1]*2; double YawDeg = (int)RecieveData[2] << 8 | (int)RecieveData[3]; bool StickBool = RecieveData[4] >> 4 & 0b1; int SpeedBool = RecieveData[4] >> 2 & 0b11;; int RotBool = RecieveData[4] & 0b11; //オムニターゲット速度計算 Omni.wheelTGTRPScalc(StickBool,MoveDirection,YawDeg,RotBool,SpeedBool); Omni.FakeRPScalc(); //モーター回転 for(int i =0; i<4; i++) { double ThisWheelRPS = ENC[i].getRPS(); if(Omni.Wheel_FakeTGTRPS(i)==0 && fabs(ThisWheelRPS)<StopThresholdRPS) MOT[i].setSpeed(0); else MOT[i].setSpeed(MOT_PID[i].controlPID(Omni.Wheel_FakeTGTRPS(i),ThisWheelRPS)); } //デバッグエリア //for(int i =0; i<5; i++) printf("%d ",RecieveData[i]); //受信データ確認 //for(int i =0; i<4; i++) printf("%.2f ",ENC[i].getRPS());//ホイールの現在のPRS確認 //for(int i =0; i<4; i++) printf("%.2f ",Omni.Wheel_TrueTGTRPS(i));//ホイールの真目標のPRS確認 //for(int i =0; i<4; i++) printf("%.2f ",Omni.Wheel_FakeTGTRPS(i));//ホイールの偽目標のPRS確認 //for(int i =0; i<4; i++) printf("%.2f -> %.2f | ",ENC[i].getRPS(),Omni.Wheel_TrueTGTRPS(i));//ホイールの現在のPRS確認 //printf("\n");//改行 } } } /********************************************* ********************************************** ******************関数************************* ********************************************** **********************************************/ void classSetting() { //Omni.SpeedStageSetting(20,35,50); for(int i =0; i<4; i++) { //MotorControler設定 MOT[i].setMotorDirection(CW); //setspeedの正の値の回転方向を決める.CWでDIR=0,CCWでDIR=1の動き MOT[i].setPwmFrequency(20000); //PWM周波数 MOT[i].enableDriver(); //モータ起動 //QEI設定 ENC[i].rotReverce(); ENC[i].useAvePRS(); //ticker使用 //***PID設定*** MOT_PID[i].setParameter(Kp,Ki,Kd); } Omni.TGTRPS_SwitchingStage = TargetRPSStage;//デフォはclass中で75 }