99 * @{
1010 *
1111 * @file AutoTune/autotune.c
12- * @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2016.
12+ * @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2016-2017 .
1313 * dRonin, http://dRonin.org/, Copyright (C) 2015-2016
1414 * Tau Labs, http://taulabs.org, Copyright (C) 2013-2014
1515 * The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
6969#undef STACK_SIZE_BYTES
7070// Pull Request version tested on Sparky2. 292 bytes of stack left when configured with 1340
7171// Beware that Nano needs 156 bytes more stack than Sparky2
72- #define STACK_SIZE_BYTES 1340
73- #define TASK_PRIORITY (tskIDLE_PRIORITY + 1)
72+ #define STACK_SIZE_BYTES 1340
73+ #define TASK_PRIORITY (tskIDLE_PRIORITY + 1)
7474
75- #define AF_NUMX 13
76- #define AF_NUMP 43
75+ #define AF_NUMX 13
76+ #define AF_NUMP 43
7777
7878#if !defined(AT_QUEUE_NUMELEM )
79- #define AT_QUEUE_NUMELEM 18
79+ #define AT_QUEUE_NUMELEM 18
8080#endif
8181
82- #define TASK_STARTUP_DELAY_MS 250 /* delay task startup this much, waiting on accessory valid */
83- #define NOT_AT_MODE_DELAY_MS 50 /* delay this many ms if not in autotune mode */
84- #define NOT_AT_MODE_RATE (1000.0f / NOT_AT_MODE_DELAY_MS) /* this many loops per second if not in autotune mode */
85- #define SMOOTH_QUICK_FLUSH_DELAY 0.5f /* wait this long after last change to flush to permanent storage */
86- #define SMOOTH_QUICK_FLUSH_TICKS (SMOOTH_QUICK_FLUSH_DELAY * NOT_AT_MODE_RATE) /* this many ticks after last change to flush to permanent storage */
82+ #define TASK_STARTUP_DELAY_MS 250 /* delay task startup this much, waiting on accessory valid */
83+ #define NOT_AT_MODE_DELAY_MS 50 /* delay this many ms if not in autotune mode */
84+ #define NOT_AT_MODE_RATE (1000.0f / NOT_AT_MODE_DELAY_MS) /* this many loops per second if not in autotune mode */
85+ #define SMOOTH_QUICK_FLUSH_DELAY 0.5f /* wait this long after last change to flush to permanent storage */
86+ #define SMOOTH_QUICK_FLUSH_TICKS (SMOOTH_QUICK_FLUSH_DELAY * NOT_AT_MODE_RATE) /* this many ticks after last change to flush to permanent storage */
8787
88- #define MAX_PTS_PER_CYCLE 4 /* max gyro updates to process per loop see YIELD_MS and consider gyro rate */
89- #define INIT_TIME_DELAY_MS 100 /* delay to allow stab bank, etc. to be populated after flight mode switch change detection */
90- #define SYSTEMIDENT_TIME_DELAY_MS 2000 /* delay before starting systemident (shaking) flight mode */
91- #define INIT_TIME_DELAY2_MS 2500 /* delay before starting to capture data */
92- #define YIELD_MS 2 /* delay this long between processing sessions see MAX_PTS_PER_CYCLE and consider gyro rate */
88+ #define MAX_PTS_PER_CYCLE 4 /* max gyro updates to process per loop see YIELD_MS and consider gyro rate */
89+ #define INIT_TIME_DELAY_MS 100 /* delay to allow stab bank, etc. to be populated after flight mode switch change detection */
90+ #define SYSTEMIDENT_TIME_DELAY_MS 2000 /* delay before starting systemident (shaking) flight mode */
91+ #define INIT_TIME_DELAY2_MS 2500 /* delay before starting to capture data */
92+ #define YIELD_MS 2 /* delay this long between processing sessions see MAX_PTS_PER_CYCLE and consider gyro rate */
9393
9494// CheckSettings() returned error bits
95- #define TAU_NAN 1
96- #define BETA_NAN 2
97- #define ROLL_BETA_LOW 4
98- #define PITCH_BETA_LOW 8
99- #define YAW_BETA_LOW 16
100- #define TAU_TOO_LONG 32
101- #define TAU_TOO_SHORT 64
102- #define CPU_TOO_SLOW 128
103-
104- // smooth-quick modes
105- #define SMOOTH_QUICK_DISABLED 0
106- #define SMOOTH_QUICK_ACCESSORY_BASE 10
107- #define SMOOTH_QUICK_TOGGLE_BASE 20
95+ #define TAU_NAN 1
96+ #define BETA_NAN 2
97+ #define ROLL_BETA_LOW 4
98+ #define PITCH_BETA_LOW 8
99+ #define YAW_BETA_LOW 16
100+ #define TAU_TOO_LONG 32
101+ #define TAU_TOO_SHORT 64
102+ #define CPU_TOO_SLOW 128
108103
104+ #define FMS_TOGGLE_STEP_DISABLED 0.0f
109105
110106// Private types
111107enum AUTOTUNE_STATE { AT_INIT , AT_INIT_DELAY , AT_INIT_DELAY2 , AT_START , AT_RUN , AT_FINISHED , AT_WAITING };
@@ -136,11 +132,11 @@ static float gyroReadTimeAverageAlpha;
136132static float gyroReadTimeAverageAlphaAlpha ;
137133static float alpha ;
138134static float smoothQuickValue ;
135+ static float flightModeSwitchToggleStepValue ;
139136static volatile uint32_t atPointsSpilled ;
140137static uint32_t throttleAccumulator ;
141138static uint8_t rollMax , pitchMax ;
142139static int8_t accessoryToUse ;
143- static int8_t flightModeSwitchTogglePosition ;
144140static bool moduleEnabled ;
145141
146142
@@ -288,13 +284,13 @@ static void AutoTuneTask(__attribute__((unused)) void *parameters)
288284 savePidNeeded = false;
289285 // Save PIDs to permanent settings
290286 switch (systemIdentSettings .DestinationPidBank ) {
291- case 1 :
287+ case SYSTEMIDENTSETTINGS_DESTINATIONPIDBANK_BANK1 :
292288 UAVObjSave (StabilizationSettingsBank1Handle (), 0 );
293289 break ;
294- case 2 :
290+ case SYSTEMIDENTSETTINGS_DESTINATIONPIDBANK_BANK2 :
295291 UAVObjSave (StabilizationSettingsBank2Handle (), 0 );
296292 break ;
297- case 3 :
293+ case SYSTEMIDENTSETTINGS_DESTINATIONPIDBANK_BANK3 :
298294 UAVObjSave (StabilizationSettingsBank3Handle (), 0 );
299295 break ;
300296 }
@@ -306,13 +302,13 @@ static void AutoTuneTask(__attribute__((unused)) void *parameters)
306302 // and the autotune data gathering is complete
307303 // and the autotune data gathered is good
308304 // note: CheckFlightModeSwitchForPidRequest(mode) only returns true if current mode is not autotune
309- if (flightModeSwitchTogglePosition != -1 && CheckFlightModeSwitchForPidRequest (flightStatus .FlightMode )
305+ if (flightModeSwitchToggleStepValue > FMS_TOGGLE_STEP_DISABLED && CheckFlightModeSwitchForPidRequest (flightStatus .FlightMode )
310306 && systemIdentSettings .Complete && !CheckSettings ()) {
311307 if (flightStatus .Armed == FLIGHTSTATUS_ARMED_ARMED ) {
312308 // if user toggled while armed set PID's to next in sequence
313309 // if you assume that smoothest is -1 and quickest is +1
314310 // this corresponds to 0,+.50,+1.00,-1.00,-.50 (for 5 position toggle)
315- smoothQuickValue += 1.0f / ( float ) flightModeSwitchTogglePosition ;
311+ smoothQuickValue += flightModeSwitchToggleStepValue ;
316312 if (smoothQuickValue > 1.001f ) {
317313 smoothQuickValue = -1.0f ;
318314 }
@@ -746,39 +742,45 @@ static void InitSystemIdent(bool loadDefaults)
746742// Update SmoothQuickSource to be used
747743static void UpdateSmoothQuickSource (uint8_t smoothQuickSource , bool loadDefaults )
748744{
745+ // disable PID changing with accessory0-3 and flight mode switch toggle
746+ accessoryToUse = -1 ;
747+ flightModeSwitchToggleStepValue = FMS_TOGGLE_STEP_DISABLED ;
748+
749749 switch (smoothQuickSource ) {
750- case SMOOTH_QUICK_ACCESSORY_BASE + 0 : // use accessory0
751- case SMOOTH_QUICK_ACCESSORY_BASE + 1 : // use accessory1
752- case SMOOTH_QUICK_ACCESSORY_BASE + 2 : // use accessory2
753- case SMOOTH_QUICK_ACCESSORY_BASE + 3 : // use accessory3
754- // leave smoothQuickValue alone since it is always controlled by knob
755- // disable PID changing with flight mode switch
756- flightModeSwitchTogglePosition = -1 ;
757- // enable PID changing with accessory0-3
758- accessoryToUse = smoothQuickSource - SMOOTH_QUICK_ACCESSORY_BASE ;
750+ case SYSTEMIDENTSETTINGS_SMOOTHQUICKSOURCE_ACCESSORY0 :
751+ accessoryToUse = 0 ;
759752 break ;
760- case SMOOTH_QUICK_TOGGLE_BASE + 3 : // use flight mode switch toggle with 3 points
761- case SMOOTH_QUICK_TOGGLE_BASE + 5 : // use flight mode switch toggle with 5 points
762- case SMOOTH_QUICK_TOGGLE_BASE + 7 : // use flight mode switch toggle with 7 points
763- // don't allow init of current toggle position in the middle of 3x fms toggle
764- if (loadDefaults ) {
765- // set toggle to middle of range
766- smoothQuickValue = 0.0f ;
767- }
768- // enable PID changing with flight mode switch
769- flightModeSwitchTogglePosition = (smoothQuickSource - 1 - SMOOTH_QUICK_TOGGLE_BASE ) / 2 ;
770- // disable PID changing with accessory0-3
771- accessoryToUse = -1 ;
753+ case SYSTEMIDENTSETTINGS_SMOOTHQUICKSOURCE_ACCESSORY1 :
754+ accessoryToUse = 1 ;
755+ break ;
756+ case SYSTEMIDENTSETTINGS_SMOOTHQUICKSOURCE_ACCESSORY2 :
757+ accessoryToUse = 2 ;
772758 break ;
773- case SMOOTH_QUICK_DISABLED :
759+ case SYSTEMIDENTSETTINGS_SMOOTHQUICKSOURCE_ACCESSORY3 :
760+ accessoryToUse = 3 ;
761+ break ;
762+ // enable PID changing with flight mode switch
763+ // -1 to +1 give a range = 2, define step value for desired positions: 3, 5, 7
764+ case SYSTEMIDENTSETTINGS_SMOOTHQUICKSOURCE_FMSTOGGLE3POS :
765+ flightModeSwitchToggleStepValue = 1.0f ;
766+ break ;
767+ case SYSTEMIDENTSETTINGS_SMOOTHQUICKSOURCE_FMSTOGGLE5POS :
768+ flightModeSwitchToggleStepValue = 0.5f ;
769+ break ;
770+ case SYSTEMIDENTSETTINGS_SMOOTHQUICKSOURCE_FMSTOGGLE7POS :
771+ flightModeSwitchToggleStepValue = 0.33f ;
772+ break ;
773+ case SYSTEMIDENTSETTINGS_SMOOTHQUICKSOURCE_DISABLED :
774774 default :
775- // leave smoothQuickValue alone so user can set it to a different value and have it stay that value
776- // disable PID changing with flight mode switch
777- flightModeSwitchTogglePosition = -1 ;
778- // disable PID changing with accessory0-3
779775 accessoryToUse = -1 ;
776+ flightModeSwitchToggleStepValue = FMS_TOGGLE_STEP_DISABLED ;
780777 break ;
781778 }
779+ // don't allow init of current toggle position in the middle of 3x fms toggle
780+ if (loadDefaults && (flightModeSwitchToggleStepValue > FMS_TOGGLE_STEP_DISABLED )) {
781+ // set toggle to middle of range
782+ smoothQuickValue = 0.0f ;
783+ }
782784}
783785
784786
@@ -928,13 +930,13 @@ static void ComputeStabilizationAndSetPidsFromDampAndNoise(float dampRate, float
928930 _Static_assert (sizeof (StabilizationSettingsBank1Data ) == sizeof (StabilizationBankData ), "sizeof(StabilizationSettingsBank1Data) != sizeof(StabilizationBankData)" );
929931 StabilizationBankData volatile stabSettingsBank ;
930932 switch (systemIdentSettings .DestinationPidBank ) {
931- case 1 :
933+ case SYSTEMIDENTSETTINGS_DESTINATIONPIDBANK_BANK1 :
932934 StabilizationSettingsBank1Get ((void * )& stabSettingsBank );
933935 break ;
934- case 2 :
936+ case SYSTEMIDENTSETTINGS_DESTINATIONPIDBANK_BANK2 :
935937 StabilizationSettingsBank2Get ((void * )& stabSettingsBank );
936938 break ;
937- case 3 :
939+ case SYSTEMIDENTSETTINGS_DESTINATIONPIDBANK_BANK3 :
938940 StabilizationSettingsBank3Get ((void * )& stabSettingsBank );
939941 break ;
940942 }
@@ -1161,13 +1163,13 @@ static void ComputeStabilizationAndSetPidsFromDampAndNoise(float dampRate, float
11611163
11621164 // Save PIDs to UAVO RAM (not permanently yet)
11631165 switch (systemIdentSettings .DestinationPidBank ) {
1164- case 1 :
1166+ case SYSTEMIDENTSETTINGS_DESTINATIONPIDBANK_BANK1 :
11651167 StabilizationSettingsBank1Set ((void * )& stabSettingsBank );
11661168 break ;
1167- case 2 :
1169+ case SYSTEMIDENTSETTINGS_DESTINATIONPIDBANK_BANK2 :
11681170 StabilizationSettingsBank2Set ((void * )& stabSettingsBank );
11691171 break ;
1170- case 3 :
1172+ case SYSTEMIDENTSETTINGS_DESTINATIONPIDBANK_BANK3 :
11711173 StabilizationSettingsBank3Set ((void * )& stabSettingsBank );
11721174 break ;
11731175 }
0 commit comments