da
Dependencies: mbed TrapezoidControl QEI
System/Process/Process.cpp
- Committer:
- kishibekairohan
- Date:
- 2018-10-01
- Revision:
- 5:3ae504b88679
- Parent:
- 3:e10d8736fd22
File content as of revision 5:3ae504b88679:
#include "mbed.h" #include "Process.h" #include "../../Communication/RS485/ActuatorHub/ActuatorHub.h" #include "../../Communication/Controller/Controller.h" #include "../../Input/ExternalInt/ExternalInt.h" #include "../../Input/Switch/Switch.h" #include "../../Input/ColorSensor/ColorSensor.h" #include "../../Input/AccelerationSensor/AccelerationSensor.h" #include "../../Input/Potentiometer/Potentiometer.h" #include "../../Input/Rotaryencoder/Rotaryencoder.h" #include "../../LED/LED.h" #include "../../Safty/Safty.h" #include "../Using.h" #include "../../Communication/PID/PID.h" using namespace SWITCH; using namespace COLORSENSOR; using namespace ACCELERATIONSENSOR; using namespace PID_SPACE; using namespace ROTARYENCODER; static CONTROLLER::ControllerData *controller; ACTUATORHUB::MOTOR::MotorStatus motor[MOUNTING_MOTOR_NUM]; ACTUATORHUB::SOLENOID::SolenoidStatus solenoid; static bool lock; static bool processChangeComp; static int current; static void AllActuatorReset(); #ifdef USE_SUBPROCESS static void (*Process[USE_PROCESS_NUM])(void); #endif #pragma region USER-DEFINED_VARIABLES_AND_PROTOTYPE /*Replace here with the definition code of your variables.*/ Serial pc(USBTX, USBRX); unsigned long ColorIn(int index) { int result = 0; bool rtn = false; for(int i=0; i<12; i++) { CK[index] = 1; rtn = DOUT[index]; CK[index] = 0; if(rtn) { result|=(1 << i); } } return result; } #define TIRE_FR 0 //足回り前右 #define TIRE_FL 1 //足回り前左 #define TIRE_BR 2 //足回り後右 #define TIRE_BL 3 //足回り後左 #define Angle_R 4 //角度調節右 #define Angle_L 5 //角度調節左 #define Lim_AR 3 //角度調節右 #define Lim_AL 4 //角度調節左 #define Lim_R 0 //センター右 #define Lim_L 1 //センター左 //************メカナム******************** const int mecanum[15][15]= { { 0, 5, 21, 47, 83, 130, 187, 255, 255, 255, 255, 255, 255, 255, 255}, { -5, 0, 5, 21, 47, 83, 130, 187, 193, 208, 234, 255, 255, 255, 255}, { -21, -5, 0, 5, 21, 47, 83, 130, 135, 151, 177, 213, 255, 255, 255}, { -47, -21, 5, 0, 5, 21, 47, 83, 88, 104, 130, 167, 213, 255, 255}, { -83, -47, -21, 5, 0, 5, 21, 47, 52, 68, 94, 130, 177, 234, 255}, {-130, -83, -47, -21, 5, 0, 5, 21, 26, 42, 68, 104, 151, 208, 255}, {-187, -130, -83, -47, -21, -5, 0, 5, 10, 26, 52, 88, 135, 193, 255}, {-255, -187, -130, -83, -47, -21, -5, 0, 5, 21, 47, 83, 130, 187, 255}, {-255, -193, -135, -88, -52, -26, -10, -5, 0, 5, 21, 47, 83, 130, 187}, {-255, -208, -151, -104, -68, -42, -26, -21, -5, 0, 5, 21, 47, 83, 130}, {-255, -234, -177, -130, -94, -68, -52, -47, -21, -7, 0, 7, 21, 47, 83}, {-255, -255, -213, -167, -130, -104, -88, -83, -47, -21, -5, 0, 5, 21, 47}, {-255, -255, -255, -213, -177, -151, -135, -130, -83, -47, -21, -5, 0, 5, 21}, {-255, -255, -255, -255, -234, -208, -193, -187, -130, -83, -47, -21, -5, 0, 5}, {-255, -255, -255, -255, -255, -255, -255, -255, -187, -130, -83, -47, -21, -5, 0} }; const int curve[15] = {-204, -150, -104, -66, -38, -17, -4, 0, 4, 17, 38, 66, 104, 150, 204}; uint8_t SetStatus(int); uint8_t SetStatus(int pwmVal){ if(pwmVal < 0) return BACK; else if(pwmVal > 0) return FOR; else if(pwmVal == 0) return BRAKE; else return BRAKE; } uint8_t SetPWM(int); uint8_t SetPWM(int pwmVal){ if(pwmVal == 0 || pwmVal > 255 || pwmVal < -255) return 255; else return abs(pwmVal); } //************メカナム******************** //************カラーセンサ変数******************** int Color_A[3]; //[赤,緑,青] int Color_B[3]; int Color_C[3]; int Color_D[3]; int intergration = 50; /*int averageR_A; int averageG_A; int averageB_A; int averageR_B; int averageG_B; int averageB_B; int averageR_C; int averageG_C; int averageB_C; int averageR_D; int averageG_D; int averageB_D;*/ void ColorDetection(); /*DigitalIn www(RT11_PIN); DigitalIn mmm(RT12_PIN); int pp = 0; int bb = 0; */ //************カラーセンサ変数******************** //************ライントレース変数******************* int Point[3] = {234, 466, 590};//赤,緑,青 int colorSN; int startP = 35; int downP = 5; bool Goal_flag = false; PID goal = PID(0.03,-255,255,0,0,0); void GoalArrival(); //************ライントレース変数******************* //************ジャイロ******************* //void AngleDetection(); //void AngleControl(); float AngleY; PID gyro = PID(0.03, -150 , 150 , 8 , 0.03, 0); bool Angle_flag = false; float rotateY; int AngletargetX = 50; int AngletargetY = -50; int Angle_I; //************ジャイロ******************* //************ロタコン******************* int MemoRt; int Rt0; int Rt1; int Rt_A; int Rt_B; int PresentRt; //************ロタコン******************* #pragma endregion USER-DEFINED_VARIABLES_AND_PROTOTYPE #ifdef USE_SUBPROCESS #if USE_PROCESS_NUM>0 static void Process0(void); #endif #if USE_PROCESS_NUM>1 static void Process1(void); #endif #if USE_PROCESS_NUM>2 static void Process2(void); #endif #if USE_PROCESS_NUM>3 static void Process3(void); #endif #if USE_PROCESS_NUM>4 static void Process4(void); #endif #if USE_PROCESS_NUM>5 static void Process5(void); #endif #if USE_PROCESS_NUM>6 static void Process6(void); #endif #if USE_PROCESS_NUM>7 static void Process7(void); #endif #if USE_PROCESS_NUM>8 static void Process8(void); #endif #if USE_PROCESS_NUM>9 static void Process9(void); #endif #endif void SystemProcessInitialize() { #pragma region USER-DEFINED_VARIABLE_INIT /*Replace here with the initialization code of your variables.*/ #pragma endregion USER-DEFINED_VARIABLE_INIT lock = true; processChangeComp = true; current = DEFAULT_PROCESS; #ifdef USE_SUBPROCESS #if USE_PROCESS_NUM>0 Process[0] = Process0; #endif #if USE_PROCESS_NUM>1 Process[1] = Process1; #endif #if USE_PROCESS_NUM>2 Process[2] = Process2; #endif #if USE_PROCESS_NUM>3 Process[3] = Process3; #endif #if USE_PROCESS_NUM>4 Process[4] = Process4; #endif #if USE_PROCESS_NUM>5 Process[5] = Process5; #endif #if USE_PROCESS_NUM>6 Process[6] = Process6; #endif #if USE_PROCESS_NUM>7 Process[7] = Process7; #endif #if USE_PROCESS_NUM>8 Process[8] = Process8; #endif #if USE_PROCESS_NUM>9 Process[9] = Process9; #endif #endif } static void SystemProcessUpdate() { #ifdef USE_SUBPROCESS if(controller->Button.HOME) lock = false; if(controller->Button.START && processChangeComp) { current++; if (USE_PROCESS_NUM < current) current = USE_PROCESS_NUM; processChangeComp = false; } else if(controller->Button.SELECT && processChangeComp) { current--; if (current < 0) current = 0; processChangeComp = false; } else if(!controller->Button.SELECT && !controller->Button.START) processChangeComp = true; #endif #ifdef USE_MOTOR ACTUATORHUB::MOTOR::Motor::Update(motor); #endif #ifdef USE_SOLENOID ACTUATORHUB::SOLENOID::Solenoid::Update(solenoid); #endif #ifdef USE_RS485 ACTUATORHUB::ActuatorHub::Update(); #endif } void SystemProcess() { SystemProcessInitialize(); while(1) { #ifdef USE_MU controller = CONTROLLER::Controller::GetData(); #endif #ifdef USE_ERRORCHECK if(SAFTY::ErrorCheck::Check() & SAFTY::Error::ControllerLost) { CONTROLLER::Controller::DataReset(); AllActuatorReset(); lock = true; } else #endif { #ifdef USE_SUBPROCESS if(!lock) { Process[current](); } else #endif { //ロック時の処理 } } SystemProcessUpdate(); } } #pragma region PROCESS #ifdef USE_SUBPROCESS #if USE_PROCESS_NUM>0 static void Process0() { if(LimitSw::IsPressed(Lim_AR) && motor[4].dir == FOR && motor[5].dir == BACK){ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; motor[Angle_R].pwm = 255; motor[Angle_L].pwm = 255; }else if(LimitSw::IsPressed(Lim_AL) && motor[4].dir == BACK && motor[5].dir == FOR){ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; motor[Angle_R].pwm = 255; motor[Angle_L].pwm = 255; } for(int i = 0;i<20;i++){ float y = 0; y = acc[1]*1000; float rotateY = (y - 305)/2.21 - 90; AngleY += rotateY; } AngleY = AngleY /20; int gyropwm = gyro.SetPV(AngleY,Angle_I); if(controller->Button.A){ Angle_flag = true; }/* if(controller->Button.Y){ Angle_flag = true; }*/ if (Angle_flag){ motor[Angle_R].dir = SetStatus(gyropwm); motor[Angle_L].dir = SetStatus(-gyropwm); motor[Angle_R].pwm = SetPWM(gyropwm); motor[Angle_L].pwm = SetPWM(gyropwm); if(Angle_I - 2 < AngleY && AngleY < Angle_I + 2){ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; Angle_flag = false; } } } #endif #if USE_PROCESS_NUM>1 static void Process1() { motor[TIRE_FR].dir = SetStatus(-mecanum[controller->AnalogL.Y][14-controller->AnalogL.X] + curve[controller->AnalogR.X]); motor[TIRE_FL].dir = SetStatus(mecanum[controller->AnalogL.Y][controller->AnalogL.X] + curve[controller->AnalogR.X]); motor[TIRE_BR].dir = SetStatus(-mecanum[14-controller->AnalogL.X][14-controller->AnalogL.Y] + curve[controller->AnalogR.X]); motor[TIRE_BL].dir = SetStatus(mecanum[controller->AnalogL.X][14-controller->AnalogL.Y] + curve[controller->AnalogR.X]); motor[TIRE_FR].pwm = SetPWM(mecanum[controller->AnalogL.Y][14-controller->AnalogL.X]); motor[TIRE_FL].pwm = SetPWM(mecanum[controller->AnalogL.Y][controller->AnalogL.X]); motor[TIRE_BR].pwm = SetPWM(mecanum[14-controller->AnalogL.X][14-controller->AnalogL.Y]); motor[TIRE_BL].pwm = SetPWM(mecanum[controller->AnalogL.X][14-controller->AnalogL.Y]); if (abs(controller->AnalogL.X-7) <= 4 && controller->AnalogL.X!=7 && controller->AnalogL.Y!=7 && controller->AnalogR.X==7){ motor[TIRE_FR].pwm = motor[0].pwm * 1.3; motor[TIRE_FL].pwm = motor[1].pwm * 1.3; } } #endif #if USE_PROCESS_NUM>2 static void Process2() { static bool color_flag = false; static bool traceon = false; static bool yokofla = false; static bool compA = false; static bool compB = false; static bool compC = false; static bool compD = false; static bool invationA = false; static bool invationB = false; static bool invationC = false; static bool invationD = false; ColorDetection(); // if(Color_A[0] > Point[0] && Color_A[1] > Point[1] && Color_A[2] > Point[2] && !compA)//白 { invationA ^= 1;//start false,over true compA = true;//on true,noon false } else if(!(Color_A[0] > Point[0] && Color_A[1] > Point[1] && Color_A[2] > Point[2]))compA = false;//茶 if(Color_B[0] > Point[0] && Color_B[1] > Point[1] && Color_B[2] > Point[2] && !compB)//白 { invationB ^= 1;//start false,over true compB = true;//on true,noon false } else if(!(Color_B[0] > Point[0] && Color_B[1] > Point[1] && Color_B[2] > Point[2]))compB = false;//茶 // if(controller->Button.B && !color_flag) { traceon ^= 1; color_flag = true; } else if(!controller->Button.B) { color_flag = false; } if(traceon) { if(!invationA && !compA && !invationB && !compB){ motor[TIRE_FR].dir = FOR; motor[TIRE_FL].dir = FOR; motor[TIRE_BR].dir = BACK; motor[TIRE_BL].dir = BACK; motor[TIRE_FR].pwm = startP; motor[TIRE_FL].pwm = startP; motor[TIRE_BR].pwm = startP; motor[TIRE_BL].pwm = startP; } else if(invationA && compA && !invationB && !compB){ motor[TIRE_FR].dir = FOR; motor[TIRE_FL].dir = FOR; motor[TIRE_BR].dir = BACK; motor[TIRE_BL].dir = BACK; motor[TIRE_FR].pwm = startP - downP; motor[TIRE_FL].pwm = startP - downP; motor[TIRE_BR].pwm = startP - downP; motor[TIRE_BL].pwm = startP - downP; } else if(!invationA && !compA && !invationB && !compB){ motor[TIRE_FR].dir = BRAKE; motor[TIRE_FL].dir = BRAKE; motor[TIRE_BR].dir = BRAKE; motor[TIRE_BL].dir = BRAKE; motor[0].pwm = 255; motor[1].pwm = 255; motor[2].pwm = 255; motor[3].pwm = 255; wait(5); yokofla = true; } else if(invationA && !compA && invationB && !compB && yokofla){ motor[TIRE_FR].dir = BACK; motor[TIRE_FL].dir = BACK; motor[TIRE_BR].dir = FOR; motor[TIRE_BL].dir = FOR; motor[TIRE_FR].pwm = startP - downP; motor[TIRE_FL].pwm = startP - downP; motor[TIRE_BR].pwm = startP - downP; motor[TIRE_BL].pwm = startP - downP; } else if(invationA && !compA && !invationB && !compB && yokofla){ motor[TIRE_FR].dir = FOR; motor[TIRE_FL].dir = BACK; motor[TIRE_BR].dir = FOR; motor[TIRE_BL].dir = BACK; motor[TIRE_FR].pwm = startP; motor[TIRE_FL].pwm = startP; motor[TIRE_BR].pwm = startP; motor[TIRE_BL].pwm = startP; } else if(LimitSw::IsPressed(3) && LimitSw::IsPressed(4) && invationA && !compA && !invationB && !compB && yokofla && traceon){ motor[TIRE_FR].dir = BRAKE; motor[TIRE_FL].dir = BRAKE; motor[TIRE_BR].dir = BRAKE; motor[TIRE_BL].dir = BRAKE; motor[TIRE_FR].pwm = 255; motor[TIRE_FL].pwm = 255; motor[TIRE_BR].pwm = 255; motor[TIRE_BL].pwm = 255; } /*//// motor[0].dir = BACK; motor[1].dir = BACK; motor[2].dir = FOR; motor[3].dir = FOR; motor[0].pwm = startP; motor[1].pwm = startP; motor[2].pwm = startP; motor[3].pwm = startP; else if() { motor[0].dir = BRAKE; motor[1].dir = BRAKE; motor[2].dir = BRAKE; motor[3].dir = BRAKE; motor[0].pwm = 255; motor[1].pwm = 255; motor[2].pwm = 255; motor[3].pwm = 255; }*////// else if(LimitSw::IsPressed(Lim_R) && LimitSw::IsPressed(Lim_L)){ motor[TIRE_FR].dir = FOR; motor[TIRE_FL].dir = FOR; motor[TIRE_BR].dir = BACK; motor[TIRE_BL].dir = BACK; motor[TIRE_FR].pwm = 100; motor[TIRE_FL].pwm = 100; motor[TIRE_BR].pwm = 100; motor[TIRE_BL].pwm = 100; }else if(!LimitSw::IsPressed(3) && LimitSw::IsPressed(4)){ motor[TIRE_FR].dir = FOR; motor[TIRE_BR].dir = FOR; motor[TIRE_FR].pwm = 20; motor[TIRE_BR].pwm = 20; }else if(LimitSw::IsPressed(3) && !LimitSw::IsPressed(4)){ motor[TIRE_FL].dir = BACK; motor[TIRE_BL].dir = BACK; motor[TIRE_FL].pwm = 20; motor[TIRE_BL].pwm = 20; } else if(!LimitSw::IsPressed(3) && !LimitSw::IsPressed(4)){ Goal_flag = true; GoalArrival(); }else{ motor[TIRE_FR].dir = BRAKE; motor[TIRE_FL].dir = BRAKE; motor[TIRE_BR].dir = BRAKE; motor[TIRE_BL].dir = BRAKE; } } } #endif #if USE_PROCESS_NUM>3 static void Process3() { if(controller->Button.R){ motor[Angle_R].dir = FOR; motor[Angle_L].dir = BACK; motor[Angle_R].pwm = 150; motor[Angle_L].pwm = 150; }else if(controller->Button.L){ motor[Angle_R].dir = BACK; motor[Angle_L].dir = FOR; motor[Angle_R].pwm = 150; motor[Angle_L].pwm = 150; }else{ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; } if(LimitSw::IsPressed(Lim_AR) && motor[4].dir == FOR && motor[5].dir == BACK){ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; motor[Angle_R].pwm = 255; motor[Angle_L].pwm = 255; }else if(LimitSw::IsPressed(Lim_AL) && motor[4].dir == BACK && motor[5].dir == FOR){ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; motor[Angle_R].pwm = 255; motor[Angle_L].pwm = 255; } } #endif #if USE_PROCESS_NUM>4 static void Process4() { /* for(int i=0;i<10;i++) { ColorDetection(); averageR_A += Color_A[0]; averageG_A += Color_A[1]; averageB_A += Color_A[2]; averageR_B += Color_B[0]; averageG_B += Color_B[1]; averageB_B += Color_B[2]; averageR_C += Color_C[0]; averageG_C += Color_C[1]; averageB_C += Color_C[2]; averageR_D += Color_D[0]; averageG_D += Color_D[1]; averageB_D += Color_D[2]; } pc.printf("AR_A:%d, AG_A:%d ,AB_A:%d \r\n",averageR_A / 10 ,averageG_A / 10, averageB_A / 10); pc.printf("AR_B:%d, AG_B:%d ,AB_B:%d \r\n",averageR_B / 10 ,averageG_B / 10, averageB_B / 10); pc.printf("AR_C:%d, AG_C:%d ,AB_C:%d \r\n",averageR_C / 10 ,averageG_C / 10, averageB_C / 10); pc.printf("AR_D:%d, AG_D:%d ,AB_D:%d \r\n",averageR_D / 10 ,averageG_D / 10, averageB_D / 10); averageR_A = 0; averageG_A = 0; averageB_A = 0; averageR_B = 0; averageG_B = 0; averageB_B = 0; averageR_C = 0; averageG_C = 0; averageB_C = 0; averageR_D = 0; averageG_D = 0; averageB_D = 0;*/ } #endif #if USE_PROCESS_NUM>5 static void Process5() { if(LimitSw::IsPressed(Lim_AR) && motor[4].dir == FOR && motor[5].dir == BACK){ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; motor[Angle_R].pwm = 255; motor[Angle_L].pwm = 255; }else if(LimitSw::IsPressed(Lim_AL) && motor[4].dir == BACK && motor[5].dir == FOR){ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; motor[Angle_R].pwm = 255; motor[Angle_L].pwm = 255; } for(int i = 0;i<20;i++){ float y = 0; y = acc[1]*1000; float rotateY = (y - 305)/2.21 - 90; AngleY += rotateY; } AngleY = AngleY /20; int gyropwm = gyro.SetPV(AngleY,AngletargetY); if(controller->Button.X){ Angle_flag = true; }/* if(controller->Button.Y){ Angle_flag = true; }*/ if (Angle_flag){ motor[Angle_R].dir = SetStatus(gyropwm); motor[Angle_L].dir = SetStatus(-gyropwm); motor[Angle_R].pwm = SetPWM(gyropwm); motor[Angle_L].pwm = SetPWM(gyropwm); if(AngletargetY - 2 < AngleY && AngleY < AngletargetY + 2){ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; Angle_flag = false; } } /*float y = 0; y = acc[1]*1000; float rotateY = (y - 305)/2.21 - 90; int gyropwm = gyro.SetPV(rotateY , Angletarget); if(controller->Button.X){ Angle_flag = true; } if (Angle_flag){ motor[Angle_R].dir = SetStatus(gyropwm); motor[Angle_L].dir = SetStatus(-gyropwm); motor[Angle_R].pwm = SetPWM(gyropwm); motor[Angle_L].pwm = SetPWM(gyropwm); if(Angletarget - 2 < rotateY && rotateY < Angletarget + 2){ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; Angle_flag = false; } }*/ else{ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; } } #endif #if USE_PROCESS_NUM>6 static void Process6() { //void Int::Initialize(BoardRtInt[0].fall(int2)); } #endif #if USE_PROCESS_NUM>7 static void Process7() { } #endif #if USE_PROCESS_NUM>8 static void Process8() { } #endif #if USE_PROCESS_NUM>9 static void Process9() { } #endif #endif #pragma endregion PROCESS static void AllActuatorReset() { #ifdef USE_SOLENOID solenoid.all = ALL_SOLENOID_OFF; #endif #ifdef USE_MOTOR for (uint8_t i = 0; i < MOUNTING_MOTOR_NUM; i++) { motor[i].dir = FREE; motor[i].pwm = 0; } #endif } #pragma region USER-DEFINED-FUNCTIONS void ColorDetection(){ GATE = 0; CK[0] = 0; CK[1] = 0; CK[2] = 0; CK[3] = 0; RANGE = 1; GATE = 1; wait_ms(intergration); GATE = 0; wait_us(4); Color_A[0] = ColorIn(0); //赤 wait_us(3); Color_A[1] = ColorIn(0); //青 wait_us(3); Color_A[2] = ColorIn(0); //緑 Color_B[0] = ColorIn(1); wait_us(3); Color_B[1] = ColorIn(1); wait_us(3); Color_B[2] = ColorIn(1); Color_C[0] = ColorIn(2); wait_us(3); Color_C[1] = ColorIn(2); wait_us(3); Color_C[2] = ColorIn(2); Color_D[0] = ColorIn(3); wait_us(3); Color_D[1] = ColorIn(3); wait_us(3); Color_D[2] = ColorIn(3); } /*void AngleDetection(){ float x = 0, y= 0, z = 0; //x = acc[0]*1000; y = acc[1]*1000; //z = acc[2]*1000; //pc.printf("X:%3.1f , Y:%3.1f , Z:%3.1f \r\n",x,y,z); //float rotateX = (x - 306)/2.22 - 90; float rotateY = (y - 305)/2.21 - 90; //float rotateZ = (z - 300)/1.18 - 90; //pc.printf("X:%3.1f , Y:%3.1f , Z:%3.1f \r\n" , rotateX , rotateY , rotateZ); }*/ /*void AngleControl(){ int Angletarget = -50; float AnglevalueY = rotateY; int gyropwm = gyro.SetPV(AnglevalueY , Angletarget); if (Angle_flag){ motor[Angle_R].dir = SetStatus(gyropwm); motor[Angle_L].dir = SetStatus(-gyropwm); motor[Angle_R].pwm = SetPWM(gyropwm); motor[Angle_L].pwm = SetPWM(gyropwm); if(Angletarget - 2 < AnglevalueY && AnglevalueY < Angletarget + 2){ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; Angle_flag = false; } }else{ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; } //pc.printf("PWM:%d \r\n" , gyropwm); }*/ void GoalArrival(){ int Goaltarget = 0; float Goalvalue = 0; int goalpwm = goal.SetPV(Goalvalue,Goaltarget); if (Goal_flag){ motor[TIRE_FR].dir = SetStatus(goalpwm); motor[TIRE_FL].dir = SetStatus(-goalpwm); motor[TIRE_BR].dir = SetStatus(goalpwm); motor[TIRE_BL].dir = SetStatus(-goalpwm); motor[TIRE_FR].pwm = SetPWM(goalpwm); motor[TIRE_FL].pwm = SetPWM(goalpwm); motor[TIRE_BR].pwm = SetPWM(goalpwm); motor[TIRE_BL].pwm = SetPWM(goalpwm); if(Goaltarget > Goalvalue - 10 && Goaltarget < Goalvalue+ 10){ motor[TIRE_FR].dir = BRAKE; motor[TIRE_FL].dir = BRAKE; motor[TIRE_BR].dir = BRAKE; motor[TIRE_BL].dir = BRAKE; Goal_flag = false; } }else{ motor[Angle_R].dir = BRAKE; motor[Angle_L].dir = BRAKE; } } /* void RotaryD(uint8_t, uint8_t){ uint8_t D; MemoRt = Rt1; Rt0 = Rt0 << 1; Rt0 = Rt0 & 3; Rt1 = Rt1 & 3; D = (Rt0 + Rt1) & 3; //return (D); } void GetRt(){ uint8_t DJ; double rad = 0; PresentRt = 0x00; if(LimitSw::IsPressed(Rt_A)) PresentRt = 0x02; if(LimitSw::IsPressed(Rt_B)) PresentRt = 0x01; if(MemoRt != PresentRt) DJ = RotaryD(MemoRt,PresentRt); if(D>=2)rad = 360.0 /50.0; else rad = -(360.0/50.0); Rt = Rt + rad /360.0*20; }*/ #pragma endregion