* First tries with can * More implementations * More registers * More implementations * Moved canbus registers into protocol submodule * CAN finishing work * Implemented debug utilities * back/front board compile time defines * More compile defines * Fixed disable mosfets stuck * More improvements * More refactorings * Cleanups * Cleanups * Updated merged protocol
88 lines
6.2 KiB
C
88 lines
6.2 KiB
C
#pragma once
|
|
|
|
#ifdef GSCHISSENE_PWM_FREQ
|
|
#define PWM_FREQ 12000 // PWM frequency in Hz
|
|
#else
|
|
#define PWM_FREQ 16000 // PWM frequency in Hz
|
|
#endif
|
|
#define DEAD_TIME 48 // PWM deadtime
|
|
#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
|
|
|
|
// ############################### GENERAL ###############################
|
|
|
|
/* How to calibrate: connect GND and RX of a 3.3v uart-usb adapter to the right sensor board cable
|
|
* Be careful not to use the red wire of the cable. 15v will destroye verything.).
|
|
* If you are using nunchuck, disable it temporarily. enable DEBUG_SERIAL_USART3 and DEBUG_SERIAL_ASCII use asearial terminal.
|
|
*/
|
|
|
|
/* Battery voltage calibration: connect power source. see <How to calibrate>.
|
|
* Write value nr 5 to BAT_CALIB_ADC. make and flash firmware.
|
|
* Then you can verify voltage on value 6 (to get calibrated voltage multiplied by 100).
|
|
*/
|
|
#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
|
|
#define BAT_CALIB_REAL_VOLTAGE 3970 // input voltage measured by multimeter (multiplied by 100). For example 43.00 V * 100 = 4300
|
|
#define BAT_CALIB_ADC 1492 // adc-value measured by mainboard (value nr 5 on UART debug output)
|
|
|
|
#define BAT_CELLS 12 // battery number of cells. Normal Hoverboard battery: 10s
|
|
|
|
/* 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!
|
|
* Let your board cool down. see <How to calibrate>.
|
|
* 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.
|
|
* Write debug 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.
|
|
* Enable warning and/or poweroff and make and flash firmware.
|
|
*/
|
|
#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
|
|
#define TEMP_CAL_LOW_ADC 1655 // temperature 1: ADC value
|
|
#define TEMP_CAL_LOW_DEG_C 358 // temperature 1: measured temperature [°C * 10]. Here 35.8 °C
|
|
#define TEMP_CAL_HIGH_ADC 1588 // temperature 2: ADC value
|
|
#define TEMP_CAL_HIGH_DEG_C 489 // temperature 2: measured temperature [°C * 10]. Here 48.9 °C
|
|
|
|
|
|
// ############################### INPUT ###############################
|
|
|
|
#define USART2_BAUD 38400 // UART2 baud rate (long wired cable)
|
|
#define USART2_WORDLENGTH UART_WORDLENGTH_8B // UART_WORDLENGTH_8B or UART_WORDLENGTH_9B
|
|
#define USART3_BAUD 38400 // UART3 baud rate (short wired cable)
|
|
#define USART3_WORDLENGTH UART_WORDLENGTH_8B // UART_WORDLENGTH_8B or UART_WORDLENGTH_9B
|
|
|
|
#define DIAG_ENA 1 // [-] Motor Diagnostics enable flag: 0 = Disabled, 1 = Enabled (default)
|
|
|
|
#define FIELD_WEAK_ENA 1 // [-] Field Weakening / Phase Advance enable flag: 0 = Disabled (default), 1 = Enabled
|
|
#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.
|
|
|
|
/* GENERAL NOTES:
|
|
* 1. The above parameters 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!
|
|
*/
|