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 #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

View File

@ -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);
} }

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_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;

View File

@ -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);

View File

@ -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;