mirror of https://github.com/rusefi/bldc.git
commit
36d32ed96d
|
@ -400,20 +400,23 @@
|
||||||
#ifndef APPCONF_BALANCE_TORQUETILT_SPEED
|
#ifndef APPCONF_BALANCE_TORQUETILT_SPEED
|
||||||
#define APPCONF_BALANCE_TORQUETILT_SPEED 5
|
#define APPCONF_BALANCE_TORQUETILT_SPEED 5
|
||||||
#endif
|
#endif
|
||||||
#ifndef APPCONF_BALANCE_TORQUETILT_POWER
|
#ifndef APPCONF_BALANCE_TORQUETILT_STRENGTH
|
||||||
#define APPCONF_BALANCE_TORQUETILT_POWER 0.0
|
#define APPCONF_BALANCE_TORQUETILT_STRENGTH 0.0
|
||||||
#endif
|
#endif
|
||||||
#ifndef APPCONF_BALANCE_TORQUETILT_FILTER
|
#ifndef APPCONF_BALANCE_TORQUETILT_FILTER
|
||||||
#define APPCONF_BALANCE_TORQUETILT_FILTER 0.95
|
#define APPCONF_BALANCE_TORQUETILT_FILTER 0.95
|
||||||
#endif
|
#endif
|
||||||
#ifndef APPCONF_BALANCE_TURNTILT_POWER
|
#ifndef APPCONF_BALANCE_TURNTILT_STRENGTH
|
||||||
#define APPCONF_BALANCE_TURNTILT_POWER 0
|
#define APPCONF_BALANCE_TURNTILT_STRENGTH 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef APPCONF_BALANCE_TURNTILT_ANGLE_LIMIT
|
#ifndef APPCONF_BALANCE_TURNTILT_ANGLE_LIMIT
|
||||||
#define APPCONF_BALANCE_TURNTILT_ANGLE_LIMIT 5
|
#define APPCONF_BALANCE_TURNTILT_ANGLE_LIMIT 5
|
||||||
#endif
|
#endif
|
||||||
#ifndef APPCONF_BALANCE_TURNTILT_ANGLE_CUT
|
#ifndef APPCONF_BALANCE_TURNTILT_START_ANGLE
|
||||||
#define APPCONF_BALANCE_TURNTILT_ANGLE_CUT 1
|
#define APPCONF_BALANCE_TURNTILT_START_ANGLE 1
|
||||||
|
#endif
|
||||||
|
#ifndef APPCONF_BALANCE_TURNTILT_START_ERPM
|
||||||
|
#define APPCONF_BALANCE_TURNTILT_START_ERPM 100
|
||||||
#endif
|
#endif
|
||||||
#ifndef APPCONF_BALANCE_TURNTILT_SPEED
|
#ifndef APPCONF_BALANCE_TURNTILT_SPEED
|
||||||
#define APPCONF_BALANCE_TURNTILT_SPEED 5
|
#define APPCONF_BALANCE_TURNTILT_SPEED 5
|
||||||
|
|
|
@ -201,7 +201,7 @@ bool check_faults(bool ignoreTimers){
|
||||||
}
|
}
|
||||||
|
|
||||||
// Switch partially open and stopped
|
// Switch partially open and stopped
|
||||||
if(switch_state == HALF && abs_erpm < balance_conf.fault_adc_half_erpm){
|
if((switch_state == HALF || switch_state == OFF) && abs_erpm < balance_conf.fault_adc_half_erpm){
|
||||||
if(ST2MS(current_time - fault_switch_half_timer) > balance_conf.fault_delay_switch_half || ignoreTimers){
|
if(ST2MS(current_time - fault_switch_half_timer) > balance_conf.fault_delay_switch_half || ignoreTimers){
|
||||||
state = FAULT_SWITCH_HALF;
|
state = FAULT_SWITCH_HALF;
|
||||||
return true;
|
return true;
|
||||||
|
@ -307,7 +307,7 @@ void apply_torquetilt(void){
|
||||||
// Take abs motor current, subtract start offset, and take the max of that with 0 to get the current above our start threshold (absolute).
|
// Take abs motor current, subtract start offset, and take the max of that with 0 to get the current above our start threshold (absolute).
|
||||||
// Then multiply it by "power" to get our desired angle, and min with the limit to respect boundaries.
|
// Then multiply it by "power" to get our desired angle, and min with the limit to respect boundaries.
|
||||||
// Finally multiply it by sign motor current to get directionality back
|
// Finally multiply it by sign motor current to get directionality back
|
||||||
torquetilt_target = fminf(fmaxf((fabsf(torquetilt_filtered_current) - balance_conf.torquetilt_start_current), 0) * balance_conf.torquetilt_power, balance_conf.torquetilt_angle_limit) * SIGN(torquetilt_filtered_current);
|
torquetilt_target = fminf(fmaxf((fabsf(torquetilt_filtered_current) - balance_conf.torquetilt_start_current), 0) * balance_conf.torquetilt_strength, balance_conf.torquetilt_angle_limit) * SIGN(torquetilt_filtered_current);
|
||||||
|
|
||||||
if(fabsf(torquetilt_target - torquetilt_interpolated) < torquetilt_step_size){
|
if(fabsf(torquetilt_target - torquetilt_interpolated) < torquetilt_step_size){
|
||||||
torquetilt_interpolated = torquetilt_target;
|
torquetilt_interpolated = torquetilt_target;
|
||||||
|
@ -321,27 +321,25 @@ void apply_torquetilt(void){
|
||||||
|
|
||||||
void apply_turntilt(void){
|
void apply_turntilt(void){
|
||||||
// Calculate desired angle
|
// Calculate desired angle
|
||||||
turntilt_target = abs_roll_angle_sin * balance_conf.turntilt_power;
|
turntilt_target = abs_roll_angle_sin * balance_conf.turntilt_strength;
|
||||||
|
|
||||||
// Apply cutzone
|
// Apply cutzone
|
||||||
if(abs_roll_angle < balance_conf.turntilt_angle_cut){
|
if(abs_roll_angle < balance_conf.turntilt_start_angle){
|
||||||
turntilt_target = 0;
|
turntilt_target = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable at 0 speed otherwise add directionality
|
// Disable below erpm threshold otherwise add directionality
|
||||||
if(abs_erpm < 100){
|
if(abs_erpm < balance_conf.turntilt_start_erpm){
|
||||||
turntilt_target = 0;
|
turntilt_target = 0;
|
||||||
}else {
|
}else {
|
||||||
turntilt_target *= SIGN(erpm);
|
turntilt_target *= SIGN(erpm);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply speed scaling
|
// Apply speed scaling
|
||||||
if(balance_conf.turntilt_erpm_boost_end > 0){
|
if(abs_erpm < balance_conf.turntilt_erpm_boost_end){
|
||||||
if(abs_erpm < balance_conf.turntilt_erpm_boost_end){
|
turntilt_target *= 1 + ((balance_conf.turntilt_erpm_boost/100.0f) * (abs_erpm / balance_conf.turntilt_erpm_boost_end));
|
||||||
turntilt_target *= 1 + ((balance_conf.turntilt_erpm_boost/100.0f) * (abs_erpm / balance_conf.turntilt_erpm_boost_end));
|
}else{
|
||||||
}else{
|
turntilt_target *= 1 + (balance_conf.turntilt_erpm_boost/100.0f);
|
||||||
turntilt_target *= 1 + (balance_conf.turntilt_erpm_boost/100.0f);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Limit angle to max angle
|
// Limit angle to max angle
|
||||||
|
@ -536,7 +534,7 @@ static THD_FUNCTION(balance_thread, arg) {
|
||||||
abs_proportional = fabsf(proportional);
|
abs_proportional = fabsf(proportional);
|
||||||
if(abs_proportional > balance_conf.booster_angle){
|
if(abs_proportional > balance_conf.booster_angle){
|
||||||
if(abs_proportional - balance_conf.booster_angle < balance_conf.booster_ramp){
|
if(abs_proportional - balance_conf.booster_angle < balance_conf.booster_ramp){
|
||||||
pid_value += (balance_conf.booster_current * SIGN(proportional)) * (abs_proportional - balance_conf.booster_angle);
|
pid_value += (balance_conf.booster_current * SIGN(proportional)) * ((abs_proportional - balance_conf.booster_angle) / balance_conf.booster_ramp);
|
||||||
}else{
|
}else{
|
||||||
pid_value += balance_conf.booster_current * SIGN(proportional);
|
pid_value += balance_conf.booster_current * SIGN(proportional);
|
||||||
}
|
}
|
||||||
|
|
|
@ -307,11 +307,12 @@ int32_t confgenerator_serialize_appconf(uint8_t *buffer, const app_configuration
|
||||||
buffer_append_float32_auto(buffer, conf->app_balance_conf.torquetilt_start_current, &ind);
|
buffer_append_float32_auto(buffer, conf->app_balance_conf.torquetilt_start_current, &ind);
|
||||||
buffer_append_float32_auto(buffer, conf->app_balance_conf.torquetilt_angle_limit, &ind);
|
buffer_append_float32_auto(buffer, conf->app_balance_conf.torquetilt_angle_limit, &ind);
|
||||||
buffer_append_float32_auto(buffer, conf->app_balance_conf.torquetilt_speed, &ind);
|
buffer_append_float32_auto(buffer, conf->app_balance_conf.torquetilt_speed, &ind);
|
||||||
buffer_append_float32_auto(buffer, conf->app_balance_conf.torquetilt_power, &ind);
|
buffer_append_float32_auto(buffer, conf->app_balance_conf.torquetilt_strength, &ind);
|
||||||
buffer_append_float32_auto(buffer, conf->app_balance_conf.torquetilt_filter, &ind);
|
buffer_append_float32_auto(buffer, conf->app_balance_conf.torquetilt_filter, &ind);
|
||||||
buffer_append_float32_auto(buffer, conf->app_balance_conf.turntilt_power, &ind);
|
buffer_append_float32_auto(buffer, conf->app_balance_conf.turntilt_strength, &ind);
|
||||||
buffer_append_float32_auto(buffer, conf->app_balance_conf.turntilt_angle_limit, &ind);
|
buffer_append_float32_auto(buffer, conf->app_balance_conf.turntilt_angle_limit, &ind);
|
||||||
buffer_append_float32_auto(buffer, conf->app_balance_conf.turntilt_angle_cut, &ind);
|
buffer_append_float32_auto(buffer, conf->app_balance_conf.turntilt_start_angle, &ind);
|
||||||
|
buffer_append_uint16(buffer, conf->app_balance_conf.turntilt_start_erpm, &ind);
|
||||||
buffer_append_float32_auto(buffer, conf->app_balance_conf.turntilt_speed, &ind);
|
buffer_append_float32_auto(buffer, conf->app_balance_conf.turntilt_speed, &ind);
|
||||||
buffer_append_uint16(buffer, conf->app_balance_conf.turntilt_erpm_boost, &ind);
|
buffer_append_uint16(buffer, conf->app_balance_conf.turntilt_erpm_boost, &ind);
|
||||||
buffer_append_uint16(buffer, conf->app_balance_conf.turntilt_erpm_boost_end, &ind);
|
buffer_append_uint16(buffer, conf->app_balance_conf.turntilt_erpm_boost_end, &ind);
|
||||||
|
@ -659,11 +660,12 @@ bool confgenerator_deserialize_appconf(const uint8_t *buffer, app_configuration
|
||||||
conf->app_balance_conf.torquetilt_start_current = buffer_get_float32_auto(buffer, &ind);
|
conf->app_balance_conf.torquetilt_start_current = buffer_get_float32_auto(buffer, &ind);
|
||||||
conf->app_balance_conf.torquetilt_angle_limit = buffer_get_float32_auto(buffer, &ind);
|
conf->app_balance_conf.torquetilt_angle_limit = buffer_get_float32_auto(buffer, &ind);
|
||||||
conf->app_balance_conf.torquetilt_speed = buffer_get_float32_auto(buffer, &ind);
|
conf->app_balance_conf.torquetilt_speed = buffer_get_float32_auto(buffer, &ind);
|
||||||
conf->app_balance_conf.torquetilt_power = buffer_get_float32_auto(buffer, &ind);
|
conf->app_balance_conf.torquetilt_strength = buffer_get_float32_auto(buffer, &ind);
|
||||||
conf->app_balance_conf.torquetilt_filter = buffer_get_float32_auto(buffer, &ind);
|
conf->app_balance_conf.torquetilt_filter = buffer_get_float32_auto(buffer, &ind);
|
||||||
conf->app_balance_conf.turntilt_power = buffer_get_float32_auto(buffer, &ind);
|
conf->app_balance_conf.turntilt_strength = buffer_get_float32_auto(buffer, &ind);
|
||||||
conf->app_balance_conf.turntilt_angle_limit = buffer_get_float32_auto(buffer, &ind);
|
conf->app_balance_conf.turntilt_angle_limit = buffer_get_float32_auto(buffer, &ind);
|
||||||
conf->app_balance_conf.turntilt_angle_cut = buffer_get_float32_auto(buffer, &ind);
|
conf->app_balance_conf.turntilt_start_angle = buffer_get_float32_auto(buffer, &ind);
|
||||||
|
conf->app_balance_conf.turntilt_start_erpm = buffer_get_uint16(buffer, &ind);
|
||||||
conf->app_balance_conf.turntilt_speed = buffer_get_float32_auto(buffer, &ind);
|
conf->app_balance_conf.turntilt_speed = buffer_get_float32_auto(buffer, &ind);
|
||||||
conf->app_balance_conf.turntilt_erpm_boost = buffer_get_uint16(buffer, &ind);
|
conf->app_balance_conf.turntilt_erpm_boost = buffer_get_uint16(buffer, &ind);
|
||||||
conf->app_balance_conf.turntilt_erpm_boost_end = buffer_get_uint16(buffer, &ind);
|
conf->app_balance_conf.turntilt_erpm_boost_end = buffer_get_uint16(buffer, &ind);
|
||||||
|
@ -995,11 +997,12 @@ void confgenerator_set_defaults_appconf(app_configuration *conf) {
|
||||||
conf->app_balance_conf.torquetilt_start_current = APPCONF_BALANCE_TORQUETILT_START_CURRENT;
|
conf->app_balance_conf.torquetilt_start_current = APPCONF_BALANCE_TORQUETILT_START_CURRENT;
|
||||||
conf->app_balance_conf.torquetilt_angle_limit = APPCONF_BALANCE_TORQUETILT_ANGLE_LIMIT;
|
conf->app_balance_conf.torquetilt_angle_limit = APPCONF_BALANCE_TORQUETILT_ANGLE_LIMIT;
|
||||||
conf->app_balance_conf.torquetilt_speed = APPCONF_BALANCE_TORQUETILT_SPEED;
|
conf->app_balance_conf.torquetilt_speed = APPCONF_BALANCE_TORQUETILT_SPEED;
|
||||||
conf->app_balance_conf.torquetilt_power = APPCONF_BALANCE_TORQUETILT_POWER;
|
conf->app_balance_conf.torquetilt_strength = APPCONF_BALANCE_TORQUETILT_STRENGTH;
|
||||||
conf->app_balance_conf.torquetilt_filter = APPCONF_BALANCE_TORQUETILT_FILTER;
|
conf->app_balance_conf.torquetilt_filter = APPCONF_BALANCE_TORQUETILT_FILTER;
|
||||||
conf->app_balance_conf.turntilt_power = APPCONF_BALANCE_TURNTILT_POWER;
|
conf->app_balance_conf.turntilt_strength = APPCONF_BALANCE_TURNTILT_STRENGTH;
|
||||||
conf->app_balance_conf.turntilt_angle_limit = APPCONF_BALANCE_TURNTILT_ANGLE_LIMIT;
|
conf->app_balance_conf.turntilt_angle_limit = APPCONF_BALANCE_TURNTILT_ANGLE_LIMIT;
|
||||||
conf->app_balance_conf.turntilt_angle_cut = APPCONF_BALANCE_TURNTILT_ANGLE_CUT;
|
conf->app_balance_conf.turntilt_start_angle = APPCONF_BALANCE_TURNTILT_START_ANGLE;
|
||||||
|
conf->app_balance_conf.turntilt_start_erpm = APPCONF_BALANCE_TURNTILT_START_ERPM;
|
||||||
conf->app_balance_conf.turntilt_speed = APPCONF_BALANCE_TURNTILT_SPEED;
|
conf->app_balance_conf.turntilt_speed = APPCONF_BALANCE_TURNTILT_SPEED;
|
||||||
conf->app_balance_conf.turntilt_erpm_boost = APPCONF_BALANCE_TURNTILT_ERPM_BOOST;
|
conf->app_balance_conf.turntilt_erpm_boost = APPCONF_BALANCE_TURNTILT_ERPM_BOOST;
|
||||||
conf->app_balance_conf.turntilt_erpm_boost_end = APPCONF_BALANCE_TURNTILT_ERPM_BOOST_END;
|
conf->app_balance_conf.turntilt_erpm_boost_end = APPCONF_BALANCE_TURNTILT_ERPM_BOOST_END;
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
// Constants
|
// Constants
|
||||||
#define MCCONF_SIGNATURE 857427939
|
#define MCCONF_SIGNATURE 857427939
|
||||||
#define APPCONF_SIGNATURE 3423413835
|
#define APPCONF_SIGNATURE 2721948964
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
int32_t confgenerator_serialize_mcconf(uint8_t *buffer, const mc_configuration *conf);
|
int32_t confgenerator_serialize_mcconf(uint8_t *buffer, const mc_configuration *conf);
|
||||||
|
|
|
@ -714,11 +714,12 @@ typedef struct {
|
||||||
float torquetilt_start_current;
|
float torquetilt_start_current;
|
||||||
float torquetilt_angle_limit;
|
float torquetilt_angle_limit;
|
||||||
float torquetilt_speed;
|
float torquetilt_speed;
|
||||||
float torquetilt_power;
|
float torquetilt_strength;
|
||||||
float torquetilt_filter;
|
float torquetilt_filter;
|
||||||
float turntilt_power;
|
float turntilt_strength;
|
||||||
float turntilt_angle_limit;
|
float turntilt_angle_limit;
|
||||||
float turntilt_angle_cut;
|
float turntilt_start_angle;
|
||||||
|
uint16_t turntilt_start_erpm;
|
||||||
float turntilt_speed;
|
float turntilt_speed;
|
||||||
uint16_t turntilt_erpm_boost;
|
uint16_t turntilt_erpm_boost;
|
||||||
uint16_t turntilt_erpm_boost_end;
|
uint16_t turntilt_erpm_boost_end;
|
||||||
|
|
Loading…
Reference in New Issue