Fixes
This commit is contained in:
parent
b50efdcab2
commit
b1169c02b7
14
Inc/config.h
14
Inc/config.h
|
@ -256,11 +256,11 @@
|
||||||
#define ADC_PROTECT_THRESH 300 // ADC Protection threshold below/above the MIN/MAX ADC values
|
#define ADC_PROTECT_THRESH 300 // ADC Protection threshold below/above the MIN/MAX ADC values
|
||||||
#define INPUT1_DEADBAND 0 // How much of the center position is considered 'center' (100 = values -100 to 100 are considered 0)
|
#define INPUT1_DEADBAND 0 // How much of the center position is considered 'center' (100 = values -100 to 100 are considered 0)
|
||||||
#define INPUT2_DEADBAND 0 // How much of the center position is considered 'center' (100 = values -100 to 100 are considered 0)
|
#define INPUT2_DEADBAND 0 // How much of the center position is considered 'center' (100 = values -100 to 100 are considered 0)
|
||||||
// #define INPUT1_MID_POT // ADC1 middle resting poti: comment-out if NOT a middle resting poti
|
#define INPUT1_MID_POT // ADC1 middle resting poti: comment-out if NOT a middle resting poti
|
||||||
#define INPUT1_MIN 0 // min ADC1-value while poti at minimum-position (0 - 4095)
|
#define INPUT1_MIN 0 // min ADC1-value while poti at minimum-position (0 - 4095)
|
||||||
#define INPUT1_MID 2048 // mid ADC1-value while poti at minimum-position (ADC1_MIN - ADC1_MAX)
|
#define INPUT1_MID 2048 // mid ADC1-value while poti at minimum-position (ADC1_MIN - ADC1_MAX)
|
||||||
#define INPUT1_MAX 4095 // max ADC1-value while poti at maximum-position (0 - 4095)
|
#define INPUT1_MAX 4095 // max ADC1-value while poti at maximum-position (0 - 4095)
|
||||||
// #define INPUT2_MID_POT // ADC2 middle resting poti: comment-out if NOT a middle resting poti
|
#define INPUT2_MID_POT // ADC2 middle resting poti: comment-out if NOT a middle resting poti
|
||||||
#define INPUT2_MIN 0 // min ADC2-value while poti at minimum-position (0 - 4095)
|
#define INPUT2_MIN 0 // min ADC2-value while poti at minimum-position (0 - 4095)
|
||||||
#define INPUT2_MID 2048 // mid ADC2-value while poti at minimum-position (ADC2_MIN - ADC2_MAX)
|
#define INPUT2_MID 2048 // mid ADC2-value while poti at minimum-position (ADC2_MIN - ADC2_MAX)
|
||||||
#define INPUT2_MAX 4095 // max ADC2-value while poti at maximum-position (0 - 4095)
|
#define INPUT2_MAX 4095 // max ADC2-value while poti at maximum-position (0 - 4095)
|
||||||
|
@ -311,13 +311,13 @@
|
||||||
#define INPUT2_DEADBAND 0 // How much of the center position is considered 'center' (100 = values -100 to 100 are considered 0)
|
#define INPUT2_DEADBAND 0 // How much of the center position is considered 'center' (100 = values -100 to 100 are considered 0)
|
||||||
// Min / Max values of each channel (use DEBUG to determine these values)
|
// Min / Max values of each channel (use DEBUG to determine these values)
|
||||||
#define INPUT1_MID_POT
|
#define INPUT1_MID_POT
|
||||||
#define INPUT1_MIN -1024 // (-1000 - 0)
|
#define INPUT1_MIN -1024 // (-1024 - 0)
|
||||||
#define INPUT1_MID 0
|
#define INPUT1_MID 0
|
||||||
#define INPUT1_MAX 1024 // (0 - 1000)
|
#define INPUT1_MAX 1024 // (0 - 1024)
|
||||||
#define INPUT2_MID_POT
|
#define INPUT2_MID_POT
|
||||||
#define INPUT2_MIN -1024 // (-1000 - 0)
|
#define INPUT2_MIN -1024 // (-1024 - 0)
|
||||||
#define INPUT2_MID 0
|
#define INPUT2_MID 0
|
||||||
#define INPUT2_MAX 1024 // (0 - 1000)
|
#define INPUT2_MAX 1024 // (0 - 1024)
|
||||||
// # maybe good for ARMCHAIR #
|
// # maybe good for ARMCHAIR #
|
||||||
#define FILTER 3276 // 0.05f
|
#define FILTER 3276 // 0.05f
|
||||||
#define SPEED_COEFFICIENT 8192 // 0.5f
|
#define SPEED_COEFFICIENT 8192 // 0.5f
|
||||||
|
@ -503,7 +503,7 @@
|
||||||
*/
|
*/
|
||||||
#undef CTRL_MOD_REQ
|
#undef CTRL_MOD_REQ
|
||||||
#define CTRL_MOD_REQ TRQ_MODE // SKATEBOARD works best in TORQUE Mode
|
#define CTRL_MOD_REQ TRQ_MODE // SKATEBOARD works best in TORQUE Mode
|
||||||
// #define CONTROL_PWM_LEFT // use RC PWM as input on the LEFT cable. disable DEBUG_SERIAL_USART2!
|
//#define CONTROL_PWM_LEFT // use RC PWM as input on the LEFT cable. disable DEBUG_SERIAL_USART2!
|
||||||
#define CONTROL_PWM_RIGHT // use RC PWM as input on the RIGHT cable. disable DEBUG_SERIAL_USART3!
|
#define CONTROL_PWM_RIGHT // use RC PWM as input on the RIGHT cable. disable DEBUG_SERIAL_USART3!
|
||||||
#define INPUT1_DEADBAND 100 // How much of the center position is considered 'center' (100 = values -100 to 100 are considered 0)
|
#define INPUT1_DEADBAND 100 // How much of the center position is considered 'center' (100 = values -100 to 100 are considered 0)
|
||||||
#define INPUT2_DEADBAND 100 // How much of the center position is considered 'center' (100 = values -100 to 100 are considered 0)
|
#define INPUT2_DEADBAND 100 // How much of the center position is considered 'center' (100 = values -100 to 100 are considered 0)
|
||||||
|
|
|
@ -181,7 +181,7 @@
|
||||||
#define MIN3(a, b, c) MIN(a, MIN(b, c))
|
#define MIN3(a, b, c) MIN(a, MIN(b, c))
|
||||||
#define MAX3(a, b, c) MAX(a, MAX(b, c))
|
#define MAX3(a, b, c) MAX(a, MAX(b, c))
|
||||||
#define ARRAY_LEN(x) (uint32_t)(sizeof(x) / sizeof(*(x)))
|
#define ARRAY_LEN(x) (uint32_t)(sizeof(x) / sizeof(*(x)))
|
||||||
#define MAP(x, in_min, in_max, out_min, out_max) ((((x - in_min) * (out_max - out_min)) / (in_max - in_min)) + out_min )
|
#define MAP(x, in_min, in_max, out_min, out_max) (((((x) - (in_min)) * ((out_max) - (out_min))) / ((in_max) - (in_min))) + (out_min))
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -411,8 +411,8 @@ int main(void) {
|
||||||
if (main_loop_counter % 25 == 0) { // Send data periodically every 125 ms
|
if (main_loop_counter % 25 == 0) { // Send data periodically every 125 ms
|
||||||
setScopeChannel(0, (int16_t)cmd1_in); // 1: ADC1
|
setScopeChannel(0, (int16_t)cmd1_in); // 1: ADC1
|
||||||
setScopeChannel(1, (int16_t)cmd2_in); // 2: ADC2
|
setScopeChannel(1, (int16_t)cmd2_in); // 2: ADC2
|
||||||
setScopeChannel(2, (int16_t)speedR); // 3: output command: [-1000, 1000]
|
setScopeChannel(2, (int16_t)cmd1); //speedR); // 3: output command: [-1000, 1000]
|
||||||
setScopeChannel(3, (int16_t)speedL); // 4: output command: [-1000, 1000]
|
setScopeChannel(3, (int16_t)cmd2); //speedL); // 4: output command: [-1000, 1000]
|
||||||
setScopeChannel(4, (int16_t)adc_buffer.batt1); // 5: for battery voltage calibration
|
setScopeChannel(4, (int16_t)adc_buffer.batt1); // 5: for battery voltage calibration
|
||||||
setScopeChannel(5, (int16_t)(batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC)); // 6: for verifying battery voltage calibration
|
setScopeChannel(5, (int16_t)(batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC)); // 6: for verifying battery voltage calibration
|
||||||
setScopeChannel(6, (int16_t)board_temp_adcFilt); // 7: for board temperature calibration
|
setScopeChannel(6, (int16_t)board_temp_adcFilt); // 7: for board temperature calibration
|
||||||
|
|
68
Src/util.c
68
Src/util.c
|
@ -114,7 +114,7 @@ float setDistance;
|
||||||
uint16_t VirtAddVarTab[NB_OF_VAR] = {0x1337}; // Virtual address defined by the user: 0xFFFF value is prohibited
|
uint16_t VirtAddVarTab[NB_OF_VAR] = {0x1337}; // Virtual address defined by the user: 0xFFFF value is prohibited
|
||||||
static uint16_t saveValue = 0;
|
static uint16_t saveValue = 0;
|
||||||
static uint8_t saveValue_valid = 0;
|
static uint8_t saveValue_valid = 0;
|
||||||
#elif defined(CONTROL_ADC)
|
#elif !defined(VARIANT_HOVERBOARD) && !defined(VARIANT_TRANSPOTTER)
|
||||||
uint16_t VirtAddVarTab[NB_OF_VAR] = {0x1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308};
|
uint16_t VirtAddVarTab[NB_OF_VAR] = {0x1300, 1301, 1302, 1303, 1304, 1305, 1306, 1307, 1308};
|
||||||
#else
|
#else
|
||||||
uint16_t VirtAddVarTab[NB_OF_VAR] = {0x1300}; // Dummy virtual address to avoid warnings
|
uint16_t VirtAddVarTab[NB_OF_VAR] = {0x1300}; // Dummy virtual address to avoid warnings
|
||||||
|
@ -274,7 +274,7 @@ void Input_Init(void) {
|
||||||
UART_DisableRxErrors(&huart3);
|
UART_DisableRxErrors(&huart3);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONTROL_ADC
|
#if !defined(VARIANT_HOVERBOARD) && !defined(VARIANT_TRANSPOTTER)
|
||||||
|
|
||||||
uint16_t writeCheck, i_max, n_max;
|
uint16_t writeCheck, i_max, n_max;
|
||||||
HAL_FLASH_Unlock();
|
HAL_FLASH_Unlock();
|
||||||
|
@ -439,16 +439,17 @@ void adcCalibLim(void) {
|
||||||
|
|
||||||
consoleLog("Input calibration started... ");
|
consoleLog("Input calibration started... ");
|
||||||
|
|
||||||
|
readInput();
|
||||||
// Inititalization: MIN = a high values, MAX = a low value,
|
// Inititalization: MIN = a high values, MAX = a low value,
|
||||||
int32_t input1_fixdt = adc_buffer.l_tx2 << 16;
|
int32_t input1_fixdt = cmd1_in << 16;
|
||||||
int32_t input2_fixdt = adc_buffer.l_rx2 << 16;
|
int32_t input2_fixdt = cmd2_in << 16;
|
||||||
uint16_t input_cal_timeout = 0;
|
uint16_t input_cal_timeout = 0;
|
||||||
uint16_t INPUT1_MIN_temp = 4095;
|
int16_t INPUT1_MIN_temp = INPUT1_MAX;
|
||||||
uint16_t INPUT1_MID_temp = 0;
|
int16_t INPUT1_MID_temp = 0;
|
||||||
uint16_t INPUT1_MAX_temp = 0;
|
int16_t INPUT1_MAX_temp = INPUT1_MIN;
|
||||||
uint16_t INPUT2_MIN_temp = 4095;
|
int16_t INPUT2_MIN_temp = INPUT2_MAX;
|
||||||
uint16_t INPUT2_MID_temp = 0;
|
int16_t INPUT2_MID_temp = 0;
|
||||||
uint16_t INPUT2_MAX_temp = 0;
|
int16_t INPUT2_MAX_temp = INPUT2_MIN;
|
||||||
|
|
||||||
input_cal_valid = 1;
|
input_cal_valid = 1;
|
||||||
|
|
||||||
|
@ -457,8 +458,9 @@ void adcCalibLim(void) {
|
||||||
readInput();
|
readInput();
|
||||||
filtLowPass32(cmd1_in, FILTER, &input1_fixdt);
|
filtLowPass32(cmd1_in, FILTER, &input1_fixdt);
|
||||||
filtLowPass32(cmd2_in, FILTER, &input2_fixdt);
|
filtLowPass32(cmd2_in, FILTER, &input2_fixdt);
|
||||||
INPUT1_MID_temp = (uint16_t)CLAMP(input1_fixdt >> 16, 0, 4095); // convert fixed-point to integer
|
|
||||||
INPUT2_MID_temp = (uint16_t)CLAMP(input2_fixdt >> 16, 0, 4095);
|
INPUT1_MID_temp = (int16_t)CLAMP(input1_fixdt >> 16, INPUT1_MIN, INPUT1_MAX); // convert fixed-point to integer
|
||||||
|
INPUT2_MID_temp = (int16_t)CLAMP(input2_fixdt >> 16, INPUT2_MIN, INPUT2_MAX);
|
||||||
INPUT1_MIN_temp = MIN(INPUT1_MIN_temp, INPUT1_MID_temp);
|
INPUT1_MIN_temp = MIN(INPUT1_MIN_temp, INPUT1_MID_temp);
|
||||||
INPUT1_MAX_temp = MAX(INPUT1_MAX_temp, INPUT1_MID_temp);
|
INPUT1_MAX_temp = MAX(INPUT1_MAX_temp, INPUT1_MID_temp);
|
||||||
INPUT2_MIN_temp = MIN(INPUT2_MIN_temp, INPUT2_MID_temp);
|
INPUT2_MIN_temp = MIN(INPUT2_MIN_temp, INPUT2_MID_temp);
|
||||||
|
@ -477,20 +479,26 @@ void adcCalibLim(void) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
uint16_t input_margin = 0;
|
||||||
|
#ifdef CONTROL_ADC
|
||||||
|
input_margin = 100;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Add final ADC margin to have exact 0 and MAX at the minimum and maximum ADC value
|
// Add final ADC margin to have exact 0 and MAX at the minimum and maximum ADC value
|
||||||
if (input_cal_valid && (INPUT1_MAX_temp - INPUT1_MIN_temp) > 500 && (INPUT2_MAX_temp - INPUT2_MIN_temp) > 500) {
|
if (input_cal_valid && (INPUT1_MAX_temp - INPUT1_MIN_temp) > 500 && (INPUT2_MAX_temp - INPUT2_MIN_temp) > 500) {
|
||||||
INPUT1_MIN_CAL = INPUT1_MIN_temp + 100;
|
INPUT1_MIN_CAL = INPUT1_MIN_temp + input_margin;
|
||||||
INPUT1_MID_CAL = INPUT1_MID_temp;
|
INPUT1_MID_CAL = INPUT1_MID_temp;
|
||||||
INPUT1_MAX_CAL = INPUT1_MAX_temp - 100;
|
INPUT1_MAX_CAL = INPUT1_MAX_temp - input_margin;
|
||||||
INPUT2_MIN_CAL = INPUT2_MIN_temp + 100;
|
INPUT2_MIN_CAL = INPUT2_MIN_temp + input_margin;
|
||||||
INPUT2_MID_CAL = INPUT2_MID_temp;
|
INPUT2_MID_CAL = INPUT2_MID_temp;
|
||||||
INPUT2_MAX_CAL = INPUT2_MAX_temp - 100;
|
INPUT2_MAX_CAL = INPUT2_MAX_temp - input_margin;
|
||||||
consoleLog("OK\n");
|
consoleLog("OK\n");
|
||||||
} else {
|
} else {
|
||||||
input_cal_valid = 0;
|
input_cal_valid = 0;
|
||||||
consoleLog("FAIL (Pots travel too short)\n");
|
consoleLog("FAIL (Pots travel too short)\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -550,7 +558,7 @@ void saveConfig() {
|
||||||
HAL_FLASH_Lock();
|
HAL_FLASH_Lock();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONTROL_ADC
|
#if !defined(VARIANT_HOVERBOARD) && !defined(VARIANT_TRANSPOTTER)
|
||||||
if (input_cal_valid || cur_spd_valid) {
|
if (input_cal_valid || cur_spd_valid) {
|
||||||
HAL_FLASH_Unlock();
|
HAL_FLASH_Unlock();
|
||||||
EE_WriteVariable(VirtAddVarTab[0], FLASH_WRITE_KEY);
|
EE_WriteVariable(VirtAddVarTab[0], FLASH_WRITE_KEY);
|
||||||
|
@ -572,12 +580,12 @@ void saveConfig() {
|
||||||
* This function realizes a dead-band around 0 and scales the input between [out_min, out_max]
|
* This function realizes a dead-band around 0 and scales the input between [out_min, out_max]
|
||||||
*/
|
*/
|
||||||
int addDeadBand(int16_t u, int16_t deadBand, int16_t in_min, int16_t in_mid, int16_t in_max, int16_t out_min, int16_t out_max) {
|
int addDeadBand(int16_t u, int16_t deadBand, int16_t in_min, int16_t in_mid, int16_t in_max, int16_t out_min, int16_t out_max) {
|
||||||
if(u > in_mid - deadBand && u < in_mid + deadBand) {
|
if( u > in_mid - deadBand && u < in_mid + deadBand ) {
|
||||||
return 0;
|
return 0;
|
||||||
} else if(u > 0) {
|
} else if(u > in_mid) {
|
||||||
return MAP(u, in_mid + deadBand, in_max, 0, out_max);
|
return CLAMP( MAP(u, in_mid + deadBand, in_max, 0, out_max), 0 , out_max);
|
||||||
} else {
|
} else {
|
||||||
return MAP(u, in_mid - deadBand, in_min, out_min, 0);
|
return CLAMP( MAP(u, in_mid - deadBand, in_min, 0, out_min), out_min, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -683,7 +691,7 @@ void poweroff(void) {
|
||||||
|
|
||||||
|
|
||||||
void poweroffPressCheck(void) {
|
void poweroffPressCheck(void) {
|
||||||
#if defined(CONTROL_ADC)
|
#if !defined(VARIANT_HOVERBOARD) && !defined(VARIANT_TRANSPOTTER)
|
||||||
if(HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN)) {
|
if(HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN)) {
|
||||||
enable = 0;
|
enable = 0;
|
||||||
uint16_t cnt_press = 0;
|
uint16_t cnt_press = 0;
|
||||||
|
@ -833,21 +841,25 @@ void readCommand(void) {
|
||||||
timeoutFlagSerial = timeoutFlagSerial_L || timeoutFlagSerial_R;
|
timeoutFlagSerial = timeoutFlagSerial_L || timeoutFlagSerial_R;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//setScopeChannel(4, (int16_t)INPUT1_MIN_CAL);
|
||||||
|
//setScopeChannel(5, (int16_t)INPUT1_MID_CAL);
|
||||||
|
//setScopeChannel(6, (int16_t)INPUT1_MAX_CAL);
|
||||||
|
|
||||||
#if !defined(VARIANT_HOVERBOARD) && !defined(VARIANT_TRANSPOTTER)
|
#if !defined(VARIANT_HOVERBOARD) && !defined(VARIANT_TRANSPOTTER)
|
||||||
#ifdef INPUT1_MID_POT
|
#ifdef INPUT1_MID_POT
|
||||||
cmd1 = addDeadBand(cmd1_in, INPUT1_DEADBAND, INPUT1_MIN, INPUT1_MID, INPUT1_MAX, INPUT_MIN, INPUT_MAX);
|
cmd1 = addDeadBand(cmd1_in, INPUT1_DEADBAND, INPUT1_MIN_CAL, INPUT1_MID_CAL, INPUT1_MAX_CAL, INPUT_MIN, INPUT_MAX);
|
||||||
#else
|
#else
|
||||||
cmd1 = MAP( cmd1_in , INPUT1_MIN_CAL, INPUT1_MAX_CAL, 0, INPUT_MAX ); // ADC1
|
cmd1 = CLAMP(MAP( cmd1_in , INPUT1_MIN_CAL, INPUT1_MAX_CAL, 0, INPUT_MAX ), 0, INPUT_MAX); // ADC1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(VARIANT_SKATEBOARD)
|
#if !defined(VARIANT_SKATEBOARD)
|
||||||
#ifdef INPUT2_MID_POT
|
#ifdef INPUT2_MID_POT
|
||||||
cmd2 = addDeadBand(cmd2_in, INPUT2_DEADBAND, INPUT2_MIN, INPUT2_MID, INPUT2_MAX, INPUT_MIN, INPUT_MAX);
|
cmd2 = addDeadBand(cmd2_in, INPUT2_DEADBAND, INPUT2_MIN_CAL, INPUT2_MID_CAL, INPUT2_MAX_CAL, INPUT_MIN, INPUT_MAX);
|
||||||
#else
|
#else
|
||||||
cmd2 = MAP( cmd2_in , INPUT2_MIN_CAL, INPUT2_MAX_CAL, 0, INPUT_MAX ); // ADC2
|
cmd2 = CLAMP(MAP( cmd2_in , INPUT2_MIN_CAL, INPUT2_MAX_CAL, 0, INPUT_MAX ), 0, INPUT_MAX); // ADC2
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
cmd2 = addDeadBand(cmd2_in, INPUT2_DEADBAND, INPUT2_MIN, INPUT2_MID, INPUT2_MAX, INPUT2_OUT_MIN, INPUT_MAX);
|
cmd2 = addDeadBand(cmd2_in, INPUT2_DEADBAND, INPUT2_MIN_CAL, INPUT2_MID_CAL, INPUT2_MAX_CAL, INPUT2_OUT_MIN, INPUT_MAX);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1033,7 +1045,7 @@ void usart_process_debug(uint8_t *userCommand, uint32_t len)
|
||||||
{
|
{
|
||||||
for (; len > 0; len--, userCommand++) {
|
for (; len > 0; len--, userCommand++) {
|
||||||
if (*userCommand != '\n' && *userCommand != '\r') { // Do not accept 'new line' and 'carriage return' commands
|
if (*userCommand != '\n' && *userCommand != '\r') { // Do not accept 'new line' and 'carriage return' commands
|
||||||
consoleLog("-- Command received --\r\n");
|
//consoleLog("-- Command received --\r\n");
|
||||||
// handle_input(*userCommand); // -> Create this function to handle the user commands
|
// handle_input(*userCommand); // -> Create this function to handle the user commands
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue