Make PID position control direction consistent with other control modes when encoder is inverted

This commit is contained in:
Benjamin Vedder 2021-11-15 21:30:24 +01:00
parent fff18eb76b
commit fd48dc2644
2 changed files with 20 additions and 3 deletions

View File

@ -24,7 +24,7 @@
#define FW_VERSION_MAJOR 5 #define FW_VERSION_MAJOR 5
#define FW_VERSION_MINOR 03 #define FW_VERSION_MINOR 03
// Set to 0 for building a release and iterate during beta test builds // Set to 0 for building a release and iterate during beta test builds
#define FW_TEST_VERSION_NUMBER 64 #define FW_TEST_VERSION_NUMBER 65
#include "datatypes.h" #include "datatypes.h"

View File

@ -672,13 +672,22 @@ void mc_interface_set_pid_pos(float pos) {
return; return;
} }
volatile mc_configuration *conf = &motor_now()->m_conf;
motor_now()->m_position_set = pos; motor_now()->m_position_set = pos;
pos += motor_now()->m_conf.p_pid_offset; pos += motor_now()->m_conf.p_pid_offset;
pos *= DIR_MULT; pos *= DIR_MULT;
if (encoder_is_configured()) {
if (conf->foc_encoder_inverted) {
pos *= -1.0;
}
}
utils_norm_angle(&pos); utils_norm_angle(&pos);
switch (motor_now()->m_conf.motor_type) { switch (conf->motor_type) {
case MOTOR_TYPE_BLDC: case MOTOR_TYPE_BLDC:
case MOTOR_TYPE_DC: case MOTOR_TYPE_DC:
mcpwm_set_pid_pos(pos); mcpwm_set_pid_pos(pos);
@ -1364,7 +1373,9 @@ float mc_interface_get_pid_pos_set(void) {
float mc_interface_get_pid_pos_now(void) { float mc_interface_get_pid_pos_now(void) {
float ret = 0.0; float ret = 0.0;
switch (motor_now()->m_conf.motor_type) { volatile mc_configuration *conf = &motor_now()->m_conf;
switch (conf->motor_type) {
case MOTOR_TYPE_BLDC: case MOTOR_TYPE_BLDC:
case MOTOR_TYPE_DC: case MOTOR_TYPE_DC:
ret = encoder_read_deg(); ret = encoder_read_deg();
@ -1378,6 +1389,12 @@ float mc_interface_get_pid_pos_now(void) {
break; break;
} }
if (encoder_is_configured()) {
if (conf->foc_encoder_inverted) {
ret *= -1.0;
}
}
ret *= DIR_MULT; ret *= DIR_MULT;
ret -= motor_now()->m_conf.p_pid_offset; ret -= motor_now()->m_conf.p_pid_offset;
utils_norm_angle(&ret); utils_norm_angle(&ret);