Merge pull request #291 from Mitchlol/balance_4.2

Balance 4.2
This commit is contained in:
Benjamin Vedder 2021-04-20 15:53:12 +02:00 committed by GitHub
commit 36d32ed96d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 37 additions and 32 deletions

View File

@ -400,20 +400,23 @@
#ifndef APPCONF_BALANCE_TORQUETILT_SPEED
#define APPCONF_BALANCE_TORQUETILT_SPEED 5
#endif
#ifndef APPCONF_BALANCE_TORQUETILT_POWER
#define APPCONF_BALANCE_TORQUETILT_POWER 0.0
#ifndef APPCONF_BALANCE_TORQUETILT_STRENGTH
#define APPCONF_BALANCE_TORQUETILT_STRENGTH 0.0
#endif
#ifndef APPCONF_BALANCE_TORQUETILT_FILTER
#define APPCONF_BALANCE_TORQUETILT_FILTER 0.95
#endif
#ifndef APPCONF_BALANCE_TURNTILT_POWER
#define APPCONF_BALANCE_TURNTILT_POWER 0
#ifndef APPCONF_BALANCE_TURNTILT_STRENGTH
#define APPCONF_BALANCE_TURNTILT_STRENGTH 0
#endif
#ifndef APPCONF_BALANCE_TURNTILT_ANGLE_LIMIT
#define APPCONF_BALANCE_TURNTILT_ANGLE_LIMIT 5
#endif
#ifndef APPCONF_BALANCE_TURNTILT_ANGLE_CUT
#define APPCONF_BALANCE_TURNTILT_ANGLE_CUT 1
#ifndef APPCONF_BALANCE_TURNTILT_START_ANGLE
#define APPCONF_BALANCE_TURNTILT_START_ANGLE 1
#endif
#ifndef APPCONF_BALANCE_TURNTILT_START_ERPM
#define APPCONF_BALANCE_TURNTILT_START_ERPM 100
#endif
#ifndef APPCONF_BALANCE_TURNTILT_SPEED
#define APPCONF_BALANCE_TURNTILT_SPEED 5

View File

@ -201,7 +201,7 @@ bool check_faults(bool ignoreTimers){
}
// 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){
state = FAULT_SWITCH_HALF;
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).
// 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
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){
torquetilt_interpolated = torquetilt_target;
@ -321,27 +321,25 @@ void apply_torquetilt(void){
void apply_turntilt(void){
// 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
if(abs_roll_angle < balance_conf.turntilt_angle_cut){
if(abs_roll_angle < balance_conf.turntilt_start_angle){
turntilt_target = 0;
}
// Disable at 0 speed otherwise add directionality
if(abs_erpm < 100){
// Disable below erpm threshold otherwise add directionality
if(abs_erpm < balance_conf.turntilt_start_erpm){
turntilt_target = 0;
}else {
turntilt_target *= SIGN(erpm);
}
// Apply speed scaling
if(balance_conf.turntilt_erpm_boost_end > 0){
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));
}else{
turntilt_target *= 1 + (balance_conf.turntilt_erpm_boost/100.0f);
}
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));
}else{
turntilt_target *= 1 + (balance_conf.turntilt_erpm_boost/100.0f);
}
// Limit angle to max angle
@ -536,7 +534,7 @@ static THD_FUNCTION(balance_thread, arg) {
abs_proportional = fabsf(proportional);
if(abs_proportional > balance_conf.booster_angle){
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{
pid_value += balance_conf.booster_current * SIGN(proportional);
}

View File

@ -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_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_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.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_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_uint16(buffer, conf->app_balance_conf.turntilt_erpm_boost, &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_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_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.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_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_erpm_boost = 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_angle_limit = APPCONF_BALANCE_TORQUETILT_ANGLE_LIMIT;
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.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_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_erpm_boost = APPCONF_BALANCE_TURNTILT_ERPM_BOOST;
conf->app_balance_conf.turntilt_erpm_boost_end = APPCONF_BALANCE_TURNTILT_ERPM_BOOST_END;

View File

@ -9,7 +9,7 @@
// Constants
#define MCCONF_SIGNATURE 857427939
#define APPCONF_SIGNATURE 3423413835
#define APPCONF_SIGNATURE 2721948964
// Functions
int32_t confgenerator_serialize_mcconf(uint8_t *buffer, const mc_configuration *conf);

View File

@ -714,11 +714,12 @@ typedef struct {
float torquetilt_start_current;
float torquetilt_angle_limit;
float torquetilt_speed;
float torquetilt_power;
float torquetilt_strength;
float torquetilt_filter;
float turntilt_power;
float turntilt_strength;
float turntilt_angle_limit;
float turntilt_angle_cut;
float turntilt_start_angle;
uint16_t turntilt_start_erpm;
float turntilt_speed;
uint16_t turntilt_erpm_boost;
uint16_t turntilt_erpm_boost_end;