着陸用旋回実装
Dependencies: HCSR04_2 MPU6050_2 mbed SDFileSystem3
Fork of Autoflight2018_47 by
Diff: main.cpp
- Revision:
- 2:23daa5fa28b4
- Parent:
- 1:f383708a5a52
- Child:
- 3:206b17251f5b
diff -r f383708a5a52 -r 23daa5fa28b4 main.cpp --- a/main.cpp Fri Sep 07 09:47:37 2018 +0000 +++ b/main.cpp Sat Sep 08 05:32:55 2018 +0000 @@ -26,12 +26,11 @@ #define KP_RUD 3.0 #define KI_RUD 0.0 #define KD_RUD 0.0 -#define KP_AIL 3.0 -#define KI_AIL 0.0 -#define KD_AIL 0.0 +#define KP_AIL 0.1 +#define KI_AIL 0.2 +#define KD_AIL 0.2 - - +//#define g_AIL_L_Ratio_rightloop 0.5 #define GAIN_CONTROLVALUE_TO_PWM 3.0 @@ -44,6 +43,8 @@ #define TAKEOFF_THR 0.8 #define LOOP_THR 0.6 +#define g_rightloopRUD 1500 + #define RIGHT_ROLL_SHORT -12.0 #define RIGHT_PITCH_SHORT -5.0 #define LEFT_ROLL_SHORT 12.0 @@ -130,6 +131,9 @@ int16_t minpwm[6] = {1180,1180,1180,1180,1180,1180}; int16_t oldTHR = 1000; +int16_t g_AIL_L_Ratio_rightloop = 0.5; + + static float nowAngle[3] = {0,0,0}; const float trimAngle[3] = {0.0, 0.0, 0.0}; const float maxAngle[2] = {90, 90}; @@ -316,7 +320,7 @@ //Rotate(targetAngle, 30.0); CalculateControlValue(targetAngle, controlValue); UpdateAutoPWM(controlValue); - wait_ms(23); + wait_ms(30); #if DEBUG_PRINT_INLOOP DebugPrint(); #endif @@ -366,7 +370,7 @@ } void Init_PWM(){ - for (uint8_t i = 0; i < 4; ++i){ + for (uint8_t i = 0; i < 6; ++i){ trimpwm[i] = 1500 + (int16_t)(lengthdivpwm * (trim[i]/100)); maxpwm[i] = 1500 + (int16_t)(lengthdivpwm * (expMax[i]/100)); minpwm[i] = 1500 - (int16_t)(lengthdivpwm * (expMin[i]/100)); @@ -725,12 +729,13 @@ addpwm[PITCH] = (float)GAIN_CONTROLVALUE_TO_PWM * controlValue[PITCH]; //センサ:機首下げ正 レバー:機首上げ正 addpwm[ROLL] = (float)GAIN_CONTROLVALUE_TO_PWM * controlValue[ROLL]; //センサ:右回転正(8月13日時点;左回転が正!) レバー:右回転正 - //autopwm[ELE] = trimpwm[ELE] + reverce[ELE] * addpwm[PITCH]; + autopwm[ELE] = trimpwm[ELE] + reverce[ELE] * addpwm[PITCH]; //rewrite autopwm[AIL_R] = trimpwm[AIL_R] + reverce[AIL_R] * addpwm[AIL_R]; //autopwm[THR] = oldTHR; autopwm[ELE] = ThresholdMaxMin(autopwm[ELE], maxpwm[ELE], minpwm[ELE]); autopwm[AIL_R] = ThresholdMaxMin(autopwm[AIL_R], maxpwm[AIL_R], minpwm[AIL_R]); + } inline float CalcRatio(float value, float trim, float limit){ @@ -755,6 +760,8 @@ return minpwm[THR] + (int16_t)(2 * lengthdivpwm * ratio); } + + /*---SBUS割り込み処理---*/ //udate_Inputで抽出したpwmデータを整形して各変数に代入する。(マニュアルモード) @@ -769,8 +776,8 @@ for(uint8_t i=0;i<6;i++){ pwm[i] = sbus.manualpwm[i]; } - pc.printf("%d ,",pwm[0]);//R - pc.printf("%d ,\r\n",pwm[5]);//L + /*pc.printf("%d ,",pwm[0]);//R + pc.printf("%d ,\r\n",pwm[5]);//L*/ oldTHR = sbus.manualpwm[THR]; //pc.printf("update_manual\r\n"); break; @@ -782,7 +789,10 @@ pwm[RUD] = autopwm[RUD]; pwm[DROP] = autopwm[DROP]; pwm[AIL_L] = autopwm[AIL_L]; + pc.printf("%d ,",pwm[AIL_R]);//R + pc.printf("%d ,\r\n",pwm[AIL_L]);//L //pc.printf("update_auto\r\n"); + break; default: @@ -1176,9 +1186,12 @@ //右旋回 void UpdateTargetAngle_Rightloop(float targetAngle[3]){ //右旋回 + autopwm[RUD]=g_rightloopRUD; targetAngle[ROLL] = g_rightloopROLL; targetAngle[PITCH] = g_rightloopPITCH ; - autopwm[THR] = SetTHRinRatio(g_loopTHR); + autopwm[THR] = oldTHR;//SetTHRinRatio(g_loopTHR); + autopwm[AIL_L]=trimpwm[AIL_L]+(autopwm[AIL_R]-trimpwm[AIL_R])*0.5;//*inverse;//g_AIL_L_Ratio_rightloop; + pc.printf("",) //checkHeight(targetAngle); //pc.printf("Roll = %f, PITCH = %f, THR = %d \r\n", targetAngle[ROLL], targetAngle[PITCH], autopwm[THR]); } @@ -1201,7 +1214,7 @@ autopwm[THR] = SetTHRinRatio(g_loopTHR); //checkHeight(targetAngle); - //printf("Roll = %f, PITCH = %f, THR = %d \r\n", targetAngle[ROLL], targetAngle[PITCH], autopwm[THR]); + //printf("Roll = %f, PITCH = %f, THR = %d \r\n", targetAngle[], targetAngle[PITCH], autopwm[THR]); } void UpdateTargetAngle_Leftloop_short(float targetAngle[3]){ @@ -1236,7 +1249,7 @@ //for(uint8_t i=0; i<8; i++) pc.printf("%d ",sbus.manualpwm[i]); //for(uint8_t i=1; i<4; i++) pc.printf("%d ",sbus.manualpwm[i]); //pc.printf("\r\n"); - for(uint8_t i=0; i<3; i++) pc.printf("%3.2f\t",nowAngle[i]); + //for(uint8_t i=0; i<3; i++) pc.printf("%3.2f\t",nowAngle[i]); //for(uint8_t i=0; i<2; i++) pc.printf("%3.2f\t",nowAngle[i]); //ロール、ピッチのみ 小数点以下2ケタ //pc.printf("%d\t",autopwm[ELE]); pc.printf("%d\t",autopwm[RUD]); //pc.printf("%d",g_distance);