2020-02-16 20:58:15 +00:00
// Define to prevent recursive inclusion
# ifndef CONFIG_H
# define CONFIG_H
2019-10-06 13:09:15 +00:00
# include "stm32f1xx_hal.h"
2020-02-16 20:58:15 +00:00
// ############################### VARIANT SELECTION ###############################
// PlatformIO: uncomment desired variant in platformio.ini
// Keil uVision: select desired variant from the Target drop down menu (to the right of the Load button)
// Ubuntu: define the desired build variant here if you want to use make in console
// or use VARIANT environment variable for example like "make -e VARIANT=VARIANT_NUNCHUK". Select only one at a time.
2020-01-03 23:09:57 +00:00
# if !defined(PLATFORMIO)
//#define VARIANT_ADC // Variant for control via ADC input
2020-01-18 00:08:47 +00:00
//#define VARIANT_USART // Variant for Serial control via USART3 input
2020-01-29 20:20:04 +00:00
//#define VARIANT_NUNCHUK // Variant for Nunchuk controlled vehicle build
2020-01-03 23:09:57 +00:00
//#define VARIANT_PPM // Variant for RC-Remote with PPM-Sum Signal
2020-03-21 18:24:29 +00:00
//#define VARIANT_PWM // Variant for RC-Remote with PWM Signal
2020-01-08 18:16:34 +00:00
//#define VARIANT_IBUS // Variant for RC-Remotes with FLYSKY IBUS
2020-01-07 17:09:19 +00:00
//#define VARIANT_HOVERCAR // Variant for HOVERCAR build
2020-03-01 09:00:26 +00:00
//#define VARIANT_HOVERBOARD // Variant for HOVERBOARD build
2020-01-07 17:09:19 +00:00
//#define VARIANT_TRANSPOTTER // Variant for TRANSPOTTER build https://github.com/NiklasFauth/hoverboard-firmware-hack/wiki/Build-Instruction:-TranspOtter https://hackaday.io/project/161891-transpotter-ng
2019-12-23 11:12:01 +00:00
# endif
2020-02-16 20:58:15 +00:00
// ########################### END OF VARIANT SELECTION ############################
2019-10-06 13:09:15 +00:00
2020-01-29 20:20:04 +00:00
// ############################### DO-NOT-TOUCH SETTINGS ###############################
# define PWM_FREQ 16000 // PWM frequency in Hz / is also used for buzzer
# define DEAD_TIME 48 // PWM deadtime
# ifdef VARIANT_TRANSPOTTER
# define DELAY_IN_MAIN_LOOP 2
# else
# define DELAY_IN_MAIN_LOOP 5 // in ms. default 5. it is independent of all the timing critical stuff. do not touch if you do not know what you are doing.
# endif
# define TIMEOUT 5 // number of wrong / missing input commands before emergency off
# define A2BIT_CONV 50 // A to bit for current conversion on ADC. Example: 1 A = 50, 2 A = 100, etc
// ADC conversion time definitions
# define ADC_CONV_TIME_1C5 (14) //Total ADC clock cycles / conversion = ( 1.5+12.5)
# define ADC_CONV_TIME_7C5 (20) //Total ADC clock cycles / conversion = ( 7.5+12.5)
# define ADC_CONV_TIME_13C5 (26) //Total ADC clock cycles / conversion = ( 13.5+12.5)
# define ADC_CONV_TIME_28C5 (41) //Total ADC clock cycles / conversion = ( 28.5+12.5)
# define ADC_CONV_TIME_41C5 (54) //Total ADC clock cycles / conversion = ( 41.5+12.5)
# define ADC_CONV_TIME_55C5 (68) //Total ADC clock cycles / conversion = ( 55.5+12.5)
# define ADC_CONV_TIME_71C5 (84) //Total ADC clock cycles / conversion = ( 71.5+12.5)
# define ADC_CONV_TIME_239C5 (252) //Total ADC clock cycles / conversion = (239.5+12.5)
// This settings influences the actual sample-time. Only use definitions above
// This parameter needs to be the same as the ADC conversion for Current Phase of the FIRST Motor in setup.c
# define ADC_CONV_CLOCK_CYCLES (ADC_CONV_TIME_7C5)
// Set the configured ADC divider. This parameter needs to be the same ADC divider as PeriphClkInit.AdcClockSelection (see main.c)
# define ADC_CLOCK_DIV (4)
// ADC Total conversion time: this will be used to offset TIM8 in advance of TIM1 to align the Phase current ADC measurement
// This parameter is used in setup.c
# define ADC_TOTAL_CONV_TIME (ADC_CLOCK_DIV * ADC_CONV_CLOCK_CYCLES) // = ((SystemCoreClock / ADC_CLOCK_HZ) * ADC_CONV_CLOCK_CYCLES), where ADC_CLOCK_HZ = SystemCoreClock/ADC_CLOCK_DIV
// ########################### END OF DO-NOT-TOUCH SETTINGS ############################
2019-10-06 13:09:15 +00:00
2020-01-18 01:00:48 +00:00
// ############################### BATTERY ###############################
/* Battery voltage calibration: connect power source.
* see How to calibrate .
* Write debug output value nr 5 to BAT_CALIB_ADC . make and flash firmware .
* Then you can verify voltage on debug output value 6 ( to get calibrated voltage multiplied by 100 ) .
*/
2019-10-20 11:31:47 +00:00
# define BAT_FILT_COEF 655 // battery voltage filter coefficient in fixed-point. coef_fixedPoint = coef_floatingPoint * 2^16. In this case 655 = 0.01 * 2^16
2020-01-18 01:00:48 +00:00
# define BAT_CALIB_REAL_VOLTAGE 3970 // input voltage measured by multimeter (multiplied by 100). In this case 43.00 V * 100 = 4300
2019-12-31 12:35:01 +00:00
# define BAT_CALIB_ADC 1492 // adc-value measured by mainboard (value nr 5 on UART debug output)
2019-10-20 11:31:47 +00:00
# define BAT_CELLS 10 // battery number of cells. Normal Hoverboard battery: 10s
2020-03-01 09:00:26 +00:00
# define BAT_LVL2_ENABLE 0 // to beep or not to beep, 1 or 0
# define BAT_LVL1_ENABLE 1 // to beep or not to beep, 1 or 0
# define BAT_BLINK_INTERVAL 80 // battery led blink interval (80 loops * 5ms ~= 400ms)
# define BAT_LVL5 (390 * BAT_CELLS * BAT_CALIB_ADC) / BAT_CALIB_REAL_VOLTAGE // Green blink: no beep
# define BAT_LVL4 (380 * BAT_CELLS * BAT_CALIB_ADC) / BAT_CALIB_REAL_VOLTAGE // Yellow: no beep
# define BAT_LVL3 (370 * BAT_CELLS * BAT_CALIB_ADC) / BAT_CALIB_REAL_VOLTAGE // Yellow blink: no beep
# define BAT_LVL2 (360 * BAT_CELLS * BAT_CALIB_ADC) / BAT_CALIB_REAL_VOLTAGE // Red: gently beep at this voltage level. [V*100/cell]. In this case 3.60 V/cell
# define BAT_LVL1 (350 * BAT_CELLS * BAT_CALIB_ADC) / BAT_CALIB_REAL_VOLTAGE // Red blink: fast beep. Your battery is almost empty. Charge now! [V*100/cell]. In this case 3.50 V/cell
# define BAT_DEAD (337 * BAT_CELLS * BAT_CALIB_ADC) / BAT_CALIB_REAL_VOLTAGE // All leds off: undervoltage poweroff. (while not driving) [V*100/cell]. In this case 3.37 V/cell
2020-01-18 01:00:48 +00:00
// ######################## END OF BATTERY ###############################
2019-10-20 11:31:47 +00:00
2020-01-18 01:00:48 +00:00
// ############################### TEMPERATURE ###############################
2019-10-20 11:31:47 +00:00
/* Board overheat detection: the sensor is inside the STM/GD chip.
* It is very inaccurate without calibration ( up to 45 ° C ) . So only enable this funcion after calibration !
2020-01-18 01:00:48 +00:00
* Let your board cool down .
* see < How to calibrate .
2019-10-20 11:31:47 +00:00
* Get the real temp of the chip by thermo cam or another temp - sensor taped on top of the chip and write it to TEMP_CAL_LOW_DEG_C .
2020-01-18 01:00:48 +00:00
* Write debug output value 8 to TEMP_CAL_LOW_ADC . drive around to warm up the board . it should be at least 20 ° C warmer . repeat it for the HIGH - values .
2019-10-20 11:31:47 +00:00
* Enable warning and / or poweroff and make and flash firmware .
2020-01-18 01:00:48 +00:00
*/
2019-10-20 11:31:47 +00:00
# define TEMP_FILT_COEF 655 // temperature filter coefficient in fixed-point. coef_fixedPoint = coef_floatingPoint * 2^16. In this case 655 = 0.01 * 2^16
2019-10-06 13:09:15 +00:00
# define TEMP_CAL_LOW_ADC 1655 // temperature 1: ADC value
2019-10-20 11:31:47 +00:00
# define TEMP_CAL_LOW_DEG_C 358 // temperature 1: measured temperature [°C * 10]. Here 35.8 °C
2019-10-06 13:09:15 +00:00
# define TEMP_CAL_HIGH_ADC 1588 // temperature 2: ADC value
2019-10-20 11:31:47 +00:00
# define TEMP_CAL_HIGH_DEG_C 489 // temperature 2: measured temperature [°C * 10]. Here 48.9 °C
2020-01-18 01:10:40 +00:00
# define TEMP_WARNING_ENABLE 0 // to beep or not to beep, 1 or 0, DO NOT ACTIVITE WITHOUT CALIBRATION!
2019-10-20 11:31:47 +00:00
# define TEMP_WARNING 600 // annoying fast beeps [°C * 10]. Here 60.0 °C
2019-10-06 13:09:15 +00:00
# define TEMP_POWEROFF_ENABLE 0 // to poweroff or not to poweroff, 1 or 0, DO NOT ACTIVITE WITHOUT CALIBRATION!
2019-10-20 11:31:47 +00:00
# define TEMP_POWEROFF 650 // overheat poweroff. (while not driving) [°C * 10]. Here 65.0 °C
2020-01-18 01:00:48 +00:00
// ######################## END OF TEMPERATURE ###############################
2019-10-06 13:09:15 +00:00
2020-01-29 20:20:04 +00:00
// ############################### MOTOR CONTROL #########################
/* GENERAL NOTES:
* 1. The parameters here are over - writing the default motor parameters . For all the available parameters check BLDC_controller_data . c
* 2. The parameters are represented in fixed point data type for a more efficient code execution
* 3. For calibrating the fixed - point parameters use the Fixed - Point Viewer tool ( see < https : //github.com/EmanuelFeru/FixedPointViewer>)
* 4. For more details regarding the parameters and the working principle of the controller please consult the Simulink model
* 5. A webview was created , so Matlab / Simulink installation is not needed , unless you want to regenerate the code .
* The webview is an html page that can be opened with browsers like : Microsoft Internet Explorer or Microsoft Edge
*
* NOTES Field Weakening / Phase Advance :
* 1. The Field Weakening is a linear interpolation from 0 to FIELD_WEAK_MAX or PHASE_ADV_MAX ( depeding if FOC or SIN is selected , respectively )
* 2. The Field Weakening starts engaging at FIELD_WEAK_LO and reaches the maximum value at FIELD_WEAK_HI
* 3. If you re - calibrate the Field Weakening please take all the safety measures ! The motors can spin very fast !
Inputs :
- cmd1 and cmd2 : analog normalized input values . INPUT_MIN to INPUT_MAX
- button1 and button2 : digital input values . 0 or 1
- adc_buffer . l_tx2 and adc_buffer . l_rx2 : unfiltered ADC values ( you do not need them ) . 0 to 4095
Outputs :
- speedR and speedL : normal driving INPUT_MIN to INPUT_MAX
*/
// Control selections
# define CTRL_TYP_SEL 2 // [-] Control type selection: 0 = Commutation , 1 = Sinusoidal, 2 = FOC Field Oriented Control (default)
# define CTRL_MOD_REQ 1 // [-] Control mode request: 0 = Open mode, 1 = VOLTAGE mode (default), 2 = SPEED mode, 3 = TORQUE mode. Note: SPEED and TORQUE modes are only available for FOC!
# define DIAG_ENA 1 // [-] Motor Diagnostics enable flag: 0 = Disabled, 1 = Enabled (default)
// Limitation settings
2020-05-03 13:29:40 +00:00
# define I_MOT_MAX 15 // [A] Maximum single motor current limit
# define I_DC_MAX 17 // [A] Maximum stage2 DC Link current limit for Commutation and Sinusoidal types (This is the final current protection. Above this value, current chopping is applied. To avoid this make sure that I_DC_MAX = I_MOT_MAX + 2A)
2020-01-29 20:20:04 +00:00
# define N_MOT_MAX 1000 // [rpm] Maximum motor speed limit
// Field Weakening / Phase Advance
# define FIELD_WEAK_ENA 0 // [-] Field Weakening / Phase Advance enable flag: 0 = Disabled (default), 1 = Enabled
2020-05-03 13:29:40 +00:00
# define FIELD_WEAK_MAX 5 // [A] Maximum Field Weakening D axis current (only for FOC). Higher current results in higher maximum speed. Up to 10A has been tested using 10" wheels.
2020-01-29 20:20:04 +00:00
# define PHASE_ADV_MAX 25 // [deg] Maximum Phase Advance angle (only for SIN). Higher angle results in higher maximum speed.
# define FIELD_WEAK_HI 1500 // [-] Input target High threshold for reaching maximum Field Weakening / Phase Advance. Do NOT set this higher than 1500.
# define FIELD_WEAK_LO 1000 // [-] Input target Low threshold for starting Field Weakening / Phase Advance. Do NOT set this higher than 1000.
// ########################### END OF MOTOR CONTROL ########################
2020-02-16 20:58:15 +00:00
// ############################## DEFAULT SETTINGS ############################
// Default settings will be applied at the end of this config file if not set before
2020-03-01 09:00:26 +00:00
# define INACTIVITY_TIMEOUT 8 // Minutes of not driving until poweroff. it is not very precise.
# define BEEPS_BACKWARD 1 // 0 or 1
# define FLASH_WRITE_KEY 0x1234 // Flash writing key, used when writing data to flash memory
// #define SUPPORT_BUTTONS // Define for buttons support on ADC, Nunchuck
2020-02-16 20:58:15 +00:00
/* FILTER is in fixdt(0,16,16): VAL_fixedPoint = VAL_floatingPoint * 2^16. In this case 6553 = 0.1 * 2^16
* Value of COEFFICIENT is in fixdt ( 1 , 16 , 14 )
* If VAL_floatingPoint > = 0 , VAL_fixedPoint = VAL_floatingPoint * 2 ^ 14
* If VAL_floatingPoint < 0 , VAL_fixedPoint = 2 ^ 16 + floor ( VAL_floatingPoint * 2 ^ 14 ) .
*/
// Value of RATE is in fixdt(1,16,4): VAL_fixedPoint = VAL_floatingPoint * 2^4. In this case 480 = 30 * 2^4
# define DEFAULT_RATE 480 // 30.0f [-] lower value == slower rate [0, 32767] = [0.0, 2047.9375]. Do NOT make rate negative (>32767)
# define DEFAULT_FILTER 6553 // Default for FILTER 0.1f [-] lower value == softer filter [0, 65535] = [0.0 - 1.0].
# define DEFAULT_SPEED_COEFFICIENT 16384 // Default for SPEED_COEFFICIENT 1.0f [-] higher value == stronger. [0, 65535] = [-2.0 - 2.0]. In this case 16384 = 1.0 * 2^14
# define DEFAULT_STEER_COEFFICIENT 8192 // Defualt for STEER_COEFFICIENT 0.5f [-] higher value == stronger. [0, 65535] = [-2.0 - 2.0]. In this case 8192 = 0.5 * 2^14. If you do not want any steering, set it to 0.
// ######################### END OF DEFAULT SETTINGS ##########################
2020-01-18 01:00:48 +00:00
// ############################### DEBUG SERIAL ###############################
/* Connect GND and RX of a 3.3v uart-usb adapter to the left (USART2) or right sensor board cable (USART3)
* Be careful not to use the red wire of the cable . 15 v will destroye evrything .
* If you are using VARIANT_NUNCHUK , disable it temporarily .
* enable DEBUG_SERIAL_USART3 or DEBUG_SERIAL_USART2
* and DEBUG_SERIAL_ASCII use asearial terminal .
*
*
* DEBUG_SERIAL_ASCII output is :
* // "1:345 2:1337 3:0 4:0 5:0 6:0 7:0 8:0\r\n"
*
* 1 : ( int16_t ) adc_buffer . l_tx2 ) ; ADC1
* 2 : ( int16_t ) adc_buffer . l_rx2 ) ; ADC2
* 3 : ( int16_t ) speedR ) ; output command : [ - 1000 , 1000 ]
* 4 : ( int16_t ) speedL ) ; output command : [ - 1000 , 1000 ]
* 5 : ( int16_t ) adc_buffer . batt1 ) ; Battery adc - value measured by mainboard
* 6 : ( int16_t ) ( batVoltage * BAT_CALIB_REAL_VOLTAGE / BAT_CALIB_ADC ) ) ; Battery calibrated voltage multiplied by 100 for verifying battery voltage calibration
* 7 : ( int16_t ) board_temp_adcFilt ) ; for board temperature calibration
* 8 : ( int16_t ) board_temp_deg_c ) ; Temperature in celcius for verifying board temperature calibration
*
*/
2019-11-29 16:31:53 +00:00
2020-01-18 01:00:48 +00:00
// #define DEBUG_SERIAL_USART2 // left sensor board cable, disable if ADC or PPM is used!
2020-03-24 19:36:19 +00:00
# if defined(VARIANT_ADC) || defined(VARIANT_PPM)
2020-03-01 09:00:26 +00:00
# define DEBUG_SERIAL_USART3 // right sensor board cable, disable if I2C (nunchuk or lcd) is used!
2020-01-29 20:20:04 +00:00
# endif
2019-10-06 13:09:15 +00:00
2020-01-03 23:09:57 +00:00
# ifndef VARIANT_TRANSPOTTER
2019-11-26 22:58:20 +00:00
//#define DEBUG_SERIAL_SERVOTERM
2020-02-06 20:53:38 +00:00
# define DEBUG_SERIAL_ASCII
2019-11-26 22:58:20 +00:00
# endif
2020-01-18 01:00:48 +00:00
// ########################### END OF DEBUG SERIAL ############################
2019-10-06 13:09:15 +00:00
2019-11-29 16:31:53 +00:00
2020-01-18 01:00:48 +00:00
// ############################### DEBUG LCD ###############################
//#define DEBUG_I2C_LCD // standard 16x2 or larger text-lcd via i2c-converter on right sensor board cable
// ########################### END OF DEBUG LCD ############################
2020-01-07 20:01:17 +00:00
2020-01-18 01:00:48 +00:00
// ################################# VARIANT_ADC SETTINGS ############################
# ifdef VARIANT_ADC
/* CONTROL VIA TWO POTENTIOMETERS
* ADC - calibration to cover the full poti - range :
2019-10-20 11:31:47 +00:00
* Connect potis to left sensor board cable ( 0 to 3.3 V ) ( do NOT use the red 15 V wire in the cable ! ) . see < How to calibrate > .
2019-10-27 17:21:04 +00:00
* Turn the potis to minimum position , write value 1 to ADC1_MIN and value 2 to ADC2_MIN
* Turn the potis to maximum position , write value 1 to ADC1_MAX and value 2 to ADC2_MAX
* For middle resting potis : Let the potis in the middle resting position , write value 1 to ADC1_MID and value 2 to ADC2_MID
* Make , flash and test it .
2020-01-18 01:00:48 +00:00
*/
2019-12-31 12:35:01 +00:00
# define CONTROL_ADC // use ADC as input. disable CONTROL_SERIAL_USART2, FEEDBACK_SERIAL_USART2, DEBUG_SERIAL_USART2!
// #define ADC_PROTECT_ENA // ADC Protection Enable flag. Use this flag to make sure the ADC is protected when GND or Vcc wire is disconnected
2020-05-26 20:17:40 +00:00
# define ADC_PROTECT_TIMEOUT 100 // ADC Protection: number of wrong / missing input commands before safety state is taken
# define ADC_PROTECT_THRESH 300 // ADC Protection threshold below/above the MIN/MAX ADC values
2019-12-31 12:35:01 +00:00
// #define ADC1_MID_POT // ADC1 middle resting poti: comment-out if NOT a middle resting poti
# define ADC1_MIN 0 // min ADC1-value while poti at minimum-position (0 - 4095)
# define ADC1_MID 2048 // mid ADC1-value while poti at minimum-position (ADC1_MIN - ADC1_MAX)
# define ADC1_MAX 4095 // max ADC1-value while poti at maximum-position (0 - 4095)
// #define ADC2_MID_POT // ADC2 middle resting poti: comment-out if NOT a middle resting poti
# define ADC2_MIN 0 // min ADC2-value while poti at minimum-position (0 - 4095)
# define ADC2_MID 2048 // mid ADC2-value while poti at minimum-position (ADC2_MIN - ADC2_MAX)
# define ADC2_MAX 4095 // max ADC2-value while poti at maximum-position (0 - 4095)
# endif
2020-01-18 01:00:48 +00:00
// ############################# END OF VARIANT_ADC SETTINGS #########################
// ############################ VARIANT_USART SETTINGS ############################
# ifdef VARIANT_USART
2020-03-01 09:00:26 +00:00
// #define SIDEBOARD_SERIAL_USART2
2020-01-29 20:20:04 +00:00
// #define CONTROL_SERIAL_USART2 // left sensor board cable, disable if ADC or PPM is used! For Arduino control check the hoverSerial.ino
// #define FEEDBACK_SERIAL_USART2 // left sensor board cable, disable if ADC or PPM is used!
2020-03-01 09:00:26 +00:00
// #define SIDEBOARD_SERIAL_USART3
2020-01-29 20:20:04 +00:00
# define CONTROL_SERIAL_USART3 // right sensor board cable, disable if I2C (nunchuk or lcd) is used! For Arduino control check the hoverSerial.ino
# define FEEDBACK_SERIAL_USART3 // right sensor board cable, disable if I2C (nunchuk or lcd) is used!
2020-01-18 01:00:48 +00:00
# endif
// ######################## END OF VARIANT_USART SETTINGS #########################
// ################################# VARIANT_NUNCHUK SETTINGS ############################
# ifdef VARIANT_NUNCHUK
/* left sensor board cable. USART3
* keep cable short , use shielded cable , use ferrits , stabalize voltage in nunchuk ,
* use the right one of the 2 types of nunchuks , add i2c pullups .
* use original nunchuk . most clones does not work very well .
* Recommendation : Nunchuk Breakout Board https : //github.com/Jan--Henrik/hoverboard-breakout
*/
# define CONTROL_NUNCHUK // use nunchuk as input. disable FEEDBACK_SERIAL_USART3, DEBUG_SERIAL_USART3!
// # maybe good for ARMCHAIR #
# define FILTER 3276 // 0.05f
# define SPEED_COEFFICIENT 8192 // 0.5f
# define STEER_COEFFICIENT 62259 // -0.2f
# endif
// ############################# END OF VARIANT_NUNCHUK SETTINGS #########################
// ################################# VARIANT_PPM SETTINGS ##############################
# ifdef VARIANT_PPM
/* ###### CONTROL VIA RC REMOTE ######
* left sensor board cable . Channel 1 : steering , Channel 2 : speed .
* https : //gist.github.com/peterpoetzi/1b63a4a844162196613871767189bd05
*/
# define CONTROL_PPM // use PPM-Sum as input. disable CONTROL_SERIAL_USART2!
# define PPM_NUM_CHANNELS 6 // total number of PPM channels to receive, even if they are not used.
2020-03-24 19:36:19 +00:00
# define PPM_DEADBAND 100 // 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)
# define PPM_CH1_MAX 1000 // (0 - 1000)
# define PPM_CH1_MIN -1000 // (-1000 - 0)
# define PPM_CH2_MAX 1000 // (0 - 1000)
# define PPM_CH2_MIN -1000 // (-1000 - 0)
2020-01-18 01:00:48 +00:00
# endif
// ############################# END OF VARIANT_PPM SETTINGS ############################
2020-03-21 18:24:29 +00:00
// ################################# VARIANT_PWM SETTINGS ##############################
# ifdef VARIANT_PWM
/* ###### CONTROL VIA RC REMOTE ######
* left sensor board cable . Connect PA2 to channel 1 and PA3 to channel 2 on receiver .
* Channel 1 : steering , Channel 2 : speed .
*/
# define CONTROL_PWM // use RC PWM as input. disable DEBUG_SERIAL_USART2!
2020-03-24 19:36:19 +00:00
# define PWM_DEADBAND 100 // How much of the center position is considered 'center' (100 = values -100 to 100 are considered 0)
2020-03-21 18:24:29 +00:00
// Min / Max values of each channel (use DEBUG to determine these values)
2020-03-24 19:36:19 +00:00
# define PWM_CH1_MAX 1000 // (0 - 1000)
# define PWM_CH1_MIN -1000 // (-1000 - 0)
# define PWM_CH2_MAX 1000 // (0 - 1000)
# define PWM_CH2_MIN -1000 // (-1000 - 0)
# define FILTER 6553 // 0.1f [-] fixdt(0,16,16) lower value == softer filter [0, 65535] = [0.0 - 1.0].
# define SPEED_COEFFICIENT 16384 // 1.0f [-] fixdt(1,16,14) higher value == stronger. [0, 65535] = [-2.0 - 2.0]. In this case 16384 = 1.0 * 2^14
2020-06-02 12:42:14 +00:00
# define STEER_COEFFICIENT 16384 // 1.0f [-] fixdt(1,16,14) higher value == stronger. [0, 65535] = [-2.0 - 2.0]. In this case 16384 = 1.0 * 2^14. If you do not want any steering, set it to 0.
2020-03-24 19:36:19 +00:00
// #define SUPPORT_BUTTONS // use right sensor board cable for button inputs. Disable DEBUG_SERIAL_USART3!
2020-03-21 18:24:29 +00:00
// #define INVERT_R_DIRECTION
// #define INVERT_L_DIRECTION
# endif
// ############################# END OF VARIANT_PPM SETTINGS ############################
2020-01-18 01:00:48 +00:00
// ################################# VARIANT_IBUS SETTINGS ##############################
# ifdef VARIANT_IBUS
/* CONTROL VIA RC REMOTE WITH FLYSKY IBUS PROTOCOL
* Connected to Left sensor board cable . Channel 1 : steering , Channel 2 : speed .
*/
# define CONTROL_IBUS // use IBUS as input
# define IBUS_NUM_CHANNELS 14 // total number of IBUS channels to receive, even if they are not used.
# define IBUS_LENGTH 0x20
# define IBUS_COMMAND 0x40
# undef USART2_BAUD
# define USART2_BAUD 115200
# define CONTROL_SERIAL_USART2 // left sensor board cable, disable if ADC or PPM is used!
# define FEEDBACK_SERIAL_USART2 // left sensor board cable, disable if ADC or PPM is used!
# endif
// ############################# END OF VARIANT_IBUS SETTINGS ############################
// ############################ VARIANT_HOVERCAR SETTINGS ############################
2020-01-03 23:09:57 +00:00
# ifdef VARIANT_HOVERCAR
2020-03-17 14:38:35 +00:00
# undef CTRL_MOD_REQ
# define CTRL_MOD_REQ 3 // HOVERCAR works best in TORQUE Mode
2019-12-31 12:35:01 +00:00
# define CONTROL_ADC // use ADC as input. disable CONTROL_SERIAL_USART2, FEEDBACK_SERIAL_USART2, DEBUG_SERIAL_USART2!
# define ADC_PROTECT_ENA // ADC Protection Enable flag. Use this flag to make sure the ADC is protected when GND or Vcc wire is disconnected
2020-05-26 20:17:40 +00:00
# define ADC_PROTECT_TIMEOUT 100 // ADC Protection: number of wrong / missing input commands before safety state is taken
2020-03-01 09:00:26 +00:00
# define ADC_PROTECT_THRESH 300 // ADC Protection threshold below/above the MIN/MAX ADC values
2019-12-31 12:35:01 +00:00
# define ADC1_MIN 1000 // min ADC1-value while poti at minimum-position (0 - 4095)
# define ADC1_MAX 2500 // max ADC1-value while poti at maximum-position (0 - 4095)
# define ADC2_MIN 500 // min ADC2-value while poti at minimum-position (0 - 4095)
# define ADC2_MAX 2200 // max ADC2-value while poti at maximum-position (0 - 4095)
2020-01-29 20:20:04 +00:00
# define SPEED_COEFFICIENT 16384 // 1.0f
# define STEER_COEFFICIENT 0 // 0.0f
2020-03-01 09:00:26 +00:00
// #define INVERT_R_DIRECTION // Invert rotation of right motor
// #define INVERT_L_DIRECTION // Invert rotation of left motor
# define SIDEBOARD_SERIAL_USART3
# define FEEDBACK_SERIAL_USART3 // right sensor board cable, disable if I2C (nunchuk or lcd) is used!
// #define DEBUG_SERIAL_USART3 // right sensor board cable, disable if I2C (nunchuk or lcd) is used!
2019-11-26 22:58:20 +00:00
# endif
2020-01-29 20:20:04 +00:00
// Multiple tap detection: default DOUBLE Tap on Brake pedal (4 pulses)
# define MULTIPLE_TAP_NR 2 * 2 // [-] Define tap number: MULTIPLE_TAP_NR = number_of_taps * 2, number_of_taps = 1 (for single taping), 2 (for double tapping), 3 (for triple tapping), etc...
# define MULTIPLE_TAP_HI 600 // [-] Multiple tap detection High hysteresis threshold
# define MULTIPLE_TAP_LO 200 // [-] Multiple tap detection Low hysteresis threshold
# define MULTIPLE_TAP_TIMEOUT 2000 // [ms] Multiple tap detection Timeout period. The taps need to happen within this time window to be accepted.
2020-01-18 01:00:48 +00:00
// ######################## END OF VARIANT_HOVERCAR SETTINGS #########################
2019-10-06 13:09:15 +00:00
2020-02-16 20:58:15 +00:00
// ############################ VARIANT_HOVERBOARD SETTINGS ############################
2020-03-01 09:00:26 +00:00
// Communication: [DONE]
// Balancing controller: [TODO]
2020-02-16 20:58:15 +00:00
# ifdef VARIANT_HOVERBOARD
2020-03-01 09:00:26 +00:00
# define SIDEBOARD_SERIAL_USART2 // left sensor board cable, disable if ADC or PPM is used!
# define FEEDBACK_SERIAL_USART2
# define SIDEBOARD_SERIAL_USART3 // right sensor board cable, disable if I2C (nunchuk or lcd) is used!
# define FEEDBACK_SERIAL_USART3
2020-02-16 20:58:15 +00:00
# endif
// ######################## END OF VARIANT_HOVERBOARD SETTINGS #########################
2020-01-18 01:00:48 +00:00
// ################################# VARIANT_TRANSPOTTER SETTINGS ############################
//TODO ADD VALIDATION
# ifdef VARIANT_TRANSPOTTER
# define CONTROL_GAMETRAK
2020-01-29 20:20:04 +00:00
# define SUPPORT_LCD
2020-02-16 20:58:15 +00:00
// #define SUPPORT_NUNCHUK
2020-01-29 20:20:04 +00:00
# define GAMETRAK_CONNECTION_NORMAL // for normal wiring according to the wiki instructions
2020-01-18 01:00:48 +00:00
//#define GAMETRAK_CONNECTION_ALTERNATE // use this define instead if you messed up the gametrak ADC wiring (steering is speed, and length of the wire is steering)
2020-01-29 20:20:04 +00:00
# define ROT_P 1.2 // P coefficient for the direction controller. Positive / Negative values to invert gametrak steering direction.
2020-01-18 01:00:48 +00:00
// during nunchuk control (only relevant when activated)
2020-01-29 20:20:04 +00:00
# define SPEED_COEFFICIENT 14746 // 0.9f - higher value == stronger. 0.0 to ~2.0?
# define STEER_COEFFICIENT 8192 // 0.5f - higher value == stronger. if you do not want any steering, set it to 0.0; 0.0 to 1.0
# define INVERT_R_DIRECTION // Invert right motor
# define INVERT_L_DIRECTION // Invert left motor
2020-01-18 01:00:48 +00:00
# endif
// ############################# END OF VARIANT_TRANSPOTTER SETTINGS ########################
2019-12-12 22:44:33 +00:00
2019-10-06 13:09:15 +00:00
2020-01-18 01:00:48 +00:00
// ########################### UART SETIINGS ############################
2020-03-01 09:00:26 +00:00
# if defined(FEEDBACK_SERIAL_USART2) || defined(CONTROL_SERIAL_USART2) || defined(DEBUG_SERIAL_USART2) || defined(SIDEBOARD_SERIAL_USART2) || \
defined ( FEEDBACK_SERIAL_USART3 ) | | defined ( CONTROL_SERIAL_USART3 ) | | defined ( DEBUG_SERIAL_USART3 ) | | defined ( SIDEBOARD_SERIAL_USART3 )
# define SERIAL_START_FRAME 0xABCD // [-] Start frame definition for serial commands
2020-01-18 01:00:48 +00:00
# define SERIAL_TIMEOUT 160 // [-] Serial timeout duration for the received data. 160 ~= 0.8 sec. Calculation: 0.8 sec / 0.005 sec
# endif
2020-03-01 09:00:26 +00:00
# if defined(FEEDBACK_SERIAL_USART2) || defined(CONTROL_SERIAL_USART2) || defined(DEBUG_SERIAL_USART2) || defined(SIDEBOARD_SERIAL_USART2)
2020-01-18 01:00:48 +00:00
# ifndef USART2_BAUD
2020-01-29 20:20:04 +00:00
# define USART2_BAUD 38400 // UART2 baud rate (long wired cable)
2020-01-18 01:00:48 +00:00
# endif
# define USART2_WORDLENGTH UART_WORDLENGTH_8B // UART_WORDLENGTH_8B or UART_WORDLENGTH_9B
# endif
2020-03-01 09:00:26 +00:00
# if defined(FEEDBACK_SERIAL_USART3) || defined(CONTROL_SERIAL_USART3) || defined(DEBUG_SERIAL_USART3) || defined(SIDEBOARD_SERIAL_USART3)
2020-01-18 01:00:48 +00:00
# define USART3_BAUD 38400 // UART3 baud rate (short wired cable)
# define USART3_WORDLENGTH UART_WORDLENGTH_8B // UART_WORDLENGTH_8B or UART_WORDLENGTH_9B
2019-12-14 12:51:37 +00:00
# endif
2019-10-06 13:09:15 +00:00
2020-03-01 09:00:26 +00:00
# if defined(DEBUG_SERIAL_USART2)
# define UART_DMA_CHANNEL_TX DMA1_Channel7
# elif defined(DEBUG_SERIAL_USART3)
# define UART_DMA_CHANNEL_TX DMA1_Channel2
2020-01-18 01:00:48 +00:00
# endif
// ########################### UART SETIINGS ############################
2020-01-03 23:09:57 +00:00
2020-01-18 01:00:48 +00:00
// ############################### APPLY DEFAULT SETTINGS ###############################
2020-01-29 20:20:04 +00:00
# ifndef RATE
# define RATE DEFAULT_RATE
# endif
# ifndef FILTER
# define FILTER DEFAULT_FILTER
# endif
2020-01-18 01:00:48 +00:00
# ifndef SPEED_COEFFICIENT
# define SPEED_COEFFICIENT DEFAULT_SPEED_COEFFICIENT
# endif
# ifndef STEER_COEFFICIENT
# define STEER_COEFFICIENT DEFAULT_STEER_COEFFICIENT
2020-01-03 23:09:57 +00:00
# endif
2020-01-18 01:00:48 +00:00
// ########################### END OF APPLY DEFAULT SETTING ############################
2020-01-03 23:09:57 +00:00
2019-10-06 13:09:15 +00:00
2020-01-18 01:00:48 +00:00
// ############################### VALIDATE SETTINGS ###############################
2020-03-21 18:24:29 +00:00
# if !defined(VARIANT_ADC) && !defined(VARIANT_USART) && !defined(VARIANT_NUNCHUK) && !defined(VARIANT_PPM) && !defined(VARIANT_PWM) && \
! defined ( VARIANT_IBUS ) & & ! defined ( VARIANT_HOVERCAR ) & & ! defined ( VARIANT_HOVERBOARD ) & & ! defined ( VARIANT_TRANSPOTTER )
2020-01-05 13:28:02 +00:00
# error Variant not defined! Please check platformio.ini or Inc / config.h for available variants.
2020-01-03 23:09:57 +00:00
# endif
2019-11-29 16:31:53 +00:00
# if defined(CONTROL_SERIAL_USART2) && defined(CONTROL_SERIAL_USART3)
# error CONTROL_SERIAL_USART2 and CONTROL_SERIAL_USART3 not allowed, choose one.
# endif
2020-03-01 09:00:26 +00:00
# if defined(CONTROL_SERIAL_USART2) && defined(SIDEBOARD_SERIAL_USART2)
# error CONTROL_SERIAL_USART2 and SIDEBOARD_SERIAL_USART2 not allowed, choose one.
# endif
# if defined(CONTROL_SERIAL_USART3) && defined(SIDEBOARD_SERIAL_USART3)
# error CONTROL_SERIAL_USART3 and SIDEBOARD_SERIAL_USART3 not allowed, choose one.
2019-11-29 16:31:53 +00:00
# endif
# if defined(DEBUG_SERIAL_USART2) && defined(FEEDBACK_SERIAL_USART2)
# error DEBUG_SERIAL_USART2 and FEEDBACK_SERIAL_USART2 not allowed, choose one.
# endif
# if defined(DEBUG_SERIAL_USART3) && defined(FEEDBACK_SERIAL_USART3)
# error DEBUG_SERIAL_USART3 and FEEDBACK_SERIAL_USART3 not allowed, choose one.
# endif
# if defined(DEBUG_SERIAL_USART2) && defined(DEBUG_SERIAL_USART3)
# error DEBUG_SERIAL_USART2 and DEBUG_SERIAL_USART3 not allowed, choose one.
# endif
2020-03-01 09:00:26 +00:00
# if defined(CONTROL_ADC) && (defined(CONTROL_SERIAL_USART2) || defined(SIDEBOARD_SERIAL_USART2) || defined(FEEDBACK_SERIAL_USART2) || defined(DEBUG_SERIAL_USART2))
2019-11-29 16:31:53 +00:00
# error CONTROL_ADC and SERIAL_USART2 not allowed. It is on the same cable.
2019-10-06 13:09:15 +00:00
# endif
2020-03-01 09:00:26 +00:00
# if (defined(CONTROL_SERIAL_USART2) || defined(SIDEBOARD_SERIAL_USART2) || defined(DEBUG_SERIAL_USART2)) && defined(CONTROL_PPM)
2019-11-29 16:31:53 +00:00
# error CONTROL_PPM and SERIAL_USART2 not allowed. It is on the same cable.
2019-10-06 13:09:15 +00:00
# endif
2020-03-24 18:57:08 +00:00
# if (defined(CONTROL_SERIAL_USART2) || defined(SIDEBOARD_SERIAL_USART2) || defined(DEBUG_SERIAL_USART2)) && defined(CONTROL_PWM)
# error CONTROL_PWM and SERIAL_USART2 not allowed. It is on the same cable.
# endif
# if (defined(CONTROL_SERIAL_USART3) || defined(SIDEBOARD_SERIAL_USART3) || defined(DEBUG_SERIAL_USART3)) && defined(CONTROL_PWM) && defined(SUPPORT_BUTTONS)
# error SUPPORT_BUTTONS and SERIAL_USART3 not allowed for VARIANT_PWM. It is on the same cable.
# endif
2020-03-01 09:00:26 +00:00
# if (defined(CONTROL_SERIAL_USART3) || defined(SIDEBOARD_SERIAL_USART3) || defined(DEBUG_SERIAL_USART3)) && defined(CONTROL_NUNCHUK)
2020-01-18 00:15:45 +00:00
# error CONTROL_NUNCHUK and SERIAL_USART3 not allowed. It is on the same cable.
2019-10-06 13:09:15 +00:00
# endif
2020-03-01 09:00:26 +00:00
# if (defined(CONTROL_SERIAL_USART3) || defined(SIDEBOARD_SERIAL_USART3) || defined(DEBUG_SERIAL_USART3)) && defined(DEBUG_I2C_LCD)
2019-11-29 16:31:53 +00:00
# error DEBUG_I2C_LCD and SERIAL_USART3 not allowed. It is on the same cable.
2019-10-06 13:09:15 +00:00
# endif
2020-03-24 18:57:08 +00:00
# if defined(CONTROL_ADC) && (defined(CONTROL_PPM) || defined(CONTROL_PWM) || defined(CONTROL_NUNCHUK)) || defined(CONTROL_PPM) && (defined(CONTROL_PWM) || defined(CONTROL_NUNCHUK)) || defined(CONTROL_PWM) && defined(CONTROL_NUNCHUK)
# error only 1 input method allowed. use CONTROL_ADC or CONTROL_PPM or CONTROL_PWM or CONTROL_NUNCHUK.
2019-10-06 13:09:15 +00:00
# endif
2019-12-31 12:35:01 +00:00
2020-03-01 09:00:26 +00:00
# if defined(ADC_PROTECT_ENA) && ((ADC1_MIN - ADC_PROTECT_THRESH) <= 0 || (ADC1_MAX + ADC_PROTECT_THRESH) >= 4095)
2019-12-31 12:35:01 +00:00
# warning ADC1 Protection NOT possible! Adjust the ADC thresholds.
# undef ADC_PROTECT_ENA
# endif
2020-03-01 09:00:26 +00:00
# if defined(ADC_PROTECT_ENA) && ((ADC2_MIN - ADC_PROTECT_THRESH) <= 0 || (ADC2_MAX + ADC_PROTECT_THRESH) >= 4095)
2019-12-31 12:35:01 +00:00
# warning ADC2 Protection NOT possible! Adjust the ADC thresholds.
# undef ADC_PROTECT_ENA
# endif
2020-01-03 23:09:57 +00:00
# if defined(CONTROL_PPM) && !defined(PPM_NUM_CHANNELS)
# error Total number of PPM channels needs to be set
2020-01-18 01:00:48 +00:00
# endif
// ############################# END OF VALIDATE SETTINGS ############################
2020-02-16 20:58:15 +00:00
# endif