From a6430e3a3e1818f56d1e9254a9905a6aa70012a2 Mon Sep 17 00:00:00 2001 From: EmanuelFeru Date: Mon, 15 Aug 2022 18:30:29 +0200 Subject: [PATCH] HOVERCAR: improved MULTI_MODE - improved MULTI_MODE by adding torque and speed limits - BEGINNER MODE: Power ON + Brake [released] + Throttle [released or pressed] - INTERMEDIATE MODE: Power ON + Brake [pressed] + Throttle [released] - ADVANCED MODE: Power ON + Brake [pressed] + Throttle [pressed] - made Voltage mode as default for hovercar (better for toddlers) - made MULTI_MODE_DRIVE active as default --- Inc/config.h | 15 ++++++++++++--- Src/main.c | 18 ++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/Inc/config.h b/Inc/config.h index 3b839d2..12bd564 100644 --- a/Inc/config.h +++ b/Inc/config.h @@ -500,7 +500,7 @@ #ifdef VARIANT_HOVERCAR #define FLASH_WRITE_KEY 0x1107 // Flash memory writing key. Change this key to ignore the input calibrations from the flash memory and use the ones in config.h #undef CTRL_MOD_REQ - #define CTRL_MOD_REQ TRQ_MODE // HOVERCAR works best in TORQUE Mode + #define CTRL_MOD_REQ VLT_MODE // HOVERCAR works best in TORQUE Mode. VOLTAGE mode is preffered when freewheeling is not desired when throttle is released. #define CONTROL_ADC 0 // use ADC as input. Number indicates priority for dual-input. Disable CONTROL_SERIAL_USART2, FEEDBACK_SERIAL_USART2, DEBUG_SERIAL_USART2! #define SIDEBOARD_SERIAL_USART3 1 // Rx from right sensor board: to use photosensors as buttons. Number indicates priority for dual-input. Comment-out if sideboard is not used! #define FEEDBACK_SERIAL_USART3 // Tx to right sensor board: for LED battery indication. Comment-out if sideboard is not used! @@ -525,16 +525,25 @@ // #define ELECTRIC_BRAKE_MAX 100 // (0, 500) Maximum electric brake to be applied when input torque request is 0 (pedal fully released). // #define ELECTRIC_BRAKE_THRES 120 // (0, 500) Threshold below at which the electric brake starts engaging. - // #define MULTI_MODE_DRIVE + #define MULTI_MODE_DRIVE // This option enables the selection of 3 driving modes at start-up using combinations of Brake and Throttle pedals (see below) #ifdef MULTI_MODE_DRIVE + // BEGINNER MODE: Power ON + Brake [released] + Throttle [released or pressed] #define MULTI_MODE_DRIVE_M1_MAX 175 - #define MULTI_MODE_DRIVE_M1_RATE 175 + #define MULTI_MODE_DRIVE_M1_RATE 250 + #define MULTI_MODE_M1_I_MOT_MAX 4 + #define MULTI_MODE_M1_N_MOT_MAX 30 + // INTERMEDIATE MODE: Power ON + Brake [pressed] + Throttle [released] #define MULTI_MODE_DRIVE_M2_MAX 500 #define MULTI_MODE_DRIVE_M2_RATE 300 + #define MULTI_MODE_M2_I_MOT_MAX 8 + #define MULTI_MODE_M2_N_MOT_MAX 80 + // ADVANCED MODE: Power ON + Brake [pressed] + Throttle [pressed] #define MULTI_MODE_DRIVE_M3_MAX 1000 #define MULTI_MODE_DRIVE_M3_RATE 450 + #define MULTI_MODE_M3_I_MOT_MAX I_MOT_MAX + #define MULTI_MODE_M3_N_MOT_MAX N_MOT_MAX #endif #endif diff --git a/Src/main.c b/Src/main.c index ccfa2ab..4b5bcd3 100644 --- a/Src/main.c +++ b/Src/main.c @@ -214,18 +214,24 @@ int main(void) { int16_t board_temp_adcFilt = adc_buffer.temp; #ifdef MULTI_MODE_DRIVE - if (adc_buffer.l_rx2 >= input1[0].min) { - drive_mode = 0; - max_speed = MULTI_MODE_DRIVE_M1_MAX; - rate = MULTI_MODE_DRIVE_M1_RATE; - } else if (adc_buffer.l_tx2 >= input2[0].min) { + if (adc_buffer.l_tx2 > input1[0].min + 50 && adc_buffer.l_rx2 > input2[0].min + 50) { drive_mode = 2; max_speed = MULTI_MODE_DRIVE_M3_MAX; rate = MULTI_MODE_DRIVE_M3_RATE; - } else { + rtP_Left.n_max = rtP_Right.n_max = MULTI_MODE_M3_N_MOT_MAX << 4; + rtP_Left.i_max = rtP_Right.i_max = (MULTI_MODE_M3_I_MOT_MAX * A2BIT_CONV) << 4; + } else if (adc_buffer.l_tx2 > input1[0].min + 50) { drive_mode = 1; max_speed = MULTI_MODE_DRIVE_M2_MAX; rate = MULTI_MODE_DRIVE_M2_RATE; + rtP_Left.n_max = rtP_Right.n_max = MULTI_MODE_M2_N_MOT_MAX << 4; + rtP_Left.i_max = rtP_Right.i_max = (MULTI_MODE_M2_I_MOT_MAX * A2BIT_CONV) << 4; + } else { + drive_mode = 0; + max_speed = MULTI_MODE_DRIVE_M1_MAX; + rate = MULTI_MODE_DRIVE_M1_RATE; + rtP_Left.n_max = rtP_Right.n_max = MULTI_MODE_M1_N_MOT_MAX << 4; + rtP_Left.i_max = rtP_Right.i_max = (MULTI_MODE_M1_I_MOT_MAX * A2BIT_CONV) << 4; } printf("Drive mode %i selected: max_speed:%i acc_rate:%i \r\n", drive_mode, max_speed, rate);