Calculate temperatur-compensated parameters in one place

This commit is contained in:
Benjamin Vedder 2022-04-06 18:40:34 +02:00
parent 83139c0d75
commit 31ef08609d
3 changed files with 22 additions and 14 deletions

View File

@ -23,8 +23,7 @@
// See http://cas.ensmp.fr/~praly/Telechargement/Journaux/2010-IEEE_TPEL-Lee-Hong-Nam-Ortega-Praly-Astolfi.pdf
void foc_observer_update(float v_alpha, float v_beta, float i_alpha, float i_beta,
float motor_temp, float dt, float *x1, float *x2,
float *phase, motor_all_state_t *motor) {
float dt, float *x1, float *x2, float *phase, motor_all_state_t *motor) {
mc_configuration *conf_now = motor->m_conf;
@ -38,8 +37,8 @@ void foc_observer_update(float v_alpha, float v_beta, float i_alpha, float i_bet
lambda -= lambda * comp_fact;
// Temperature compensation
if (conf_now->foc_temp_comp && motor_temp > -30.0) {
R += R * 0.00386 * (motor_temp - conf_now->foc_temp_comp_base_temp);
if (conf_now->foc_temp_comp) {
R = motor->m_res_temp_comp;
}
float ld_lq_diff = conf_now->foc_motor_ld_lq_diff;

View File

@ -183,12 +183,15 @@ typedef struct {
// Resistance observer
float m_r_est;
float m_r_est_state;
// Temperature-compensated parameters
float m_res_temp_comp;
float m_current_ki_temp_comp;
} motor_all_state_t;
// Functions
void foc_observer_update(float v_alpha, float v_beta, float i_alpha, float i_beta,
float motor_temp, float dt, float *x1, float *x2,
float *phase, motor_all_state_t *motor);
float dt, float *x1, float *x2, float *phase, motor_all_state_t *motor);
void foc_pll_run(float phase, float dt, float *phase_var,
float *speed_var, mc_configuration *conf);
void foc_svm(float alpha, float beta, uint32_t PWMFullDutyCycle,

View File

@ -2693,8 +2693,7 @@ void mcpwm_foc_adc_int_handler(void *p, uint32_t flags) {
if (!motor_now->m_phase_override) {
foc_observer_update(motor_now->m_motor_state.v_alpha, motor_now->m_motor_state.v_beta,
motor_now->m_motor_state.i_alpha, motor_now->m_motor_state.i_beta,
mc_interface_temp_motor_filtered(), dt, &motor_now->m_observer_x1,
&motor_now->m_observer_x2, &motor_now->m_phase_now_observer, motor_now);
dt, &motor_now->m_observer_x1, &motor_now->m_observer_x2, &motor_now->m_phase_now_observer, motor_now);
// Compensate from the phase lag caused by the switching frequency. This is important for motors
// that run on high ERPM compared to the switching frequency.
@ -2880,8 +2879,7 @@ void mcpwm_foc_adc_int_handler(void *p, uint32_t flags) {
// Run observer
foc_observer_update(motor_now->m_motor_state.v_alpha, motor_now->m_motor_state.v_beta,
motor_now->m_motor_state.i_alpha, motor_now->m_motor_state.i_beta,
mc_interface_temp_motor_filtered(), dt, &motor_now->m_observer_x1,
&motor_now->m_observer_x2, 0, motor_now);
dt, &motor_now->m_observer_x1, &motor_now->m_observer_x2, 0, motor_now);
motor_now->m_phase_now_observer = utils_fast_atan2(motor_now->m_x2_prev + motor_now->m_observer_x2,
motor_now->m_x1_prev + motor_now->m_observer_x1);
@ -3080,6 +3078,16 @@ void mcpwm_foc_adc_int_handler(void *p, uint32_t flags) {
static void timer_update(motor_all_state_t *motor, float dt) {
foc_run_fw(motor, dt);
// Calculate temperature-compensated parameters here
if (mc_interface_temp_motor_filtered() > -30.0) {
float comp_fact = 1.0 + 0.00386 * (mc_interface_temp_motor_filtered() - motor->m_conf->foc_temp_comp_base_temp);
motor->m_res_temp_comp = motor->m_conf->foc_motor_r * comp_fact;
motor->m_current_ki_temp_comp = motor->m_conf->foc_current_ki * comp_fact;
} else {
motor->m_res_temp_comp = motor->m_conf->foc_motor_r;
motor->m_current_ki_temp_comp = motor->m_conf->foc_current_ki;
}
// Check if it is time to stop the modulation. Notice that modulation is kept on as long as there is
// field weakening current.
utils_sys_lock_cnt();
@ -3717,11 +3725,9 @@ static void control_current(motor_all_state_t *motor, float dt) {
state_m->vd = state_m->vd_int + Ierr_d * conf_now->foc_current_kp * d_gain_scale; //Feedback (PI controller). No D action needed because the plant is a first order system (tf = 1/(Ls+R))
state_m->vq = state_m->vq_int + Ierr_q * conf_now->foc_current_kp;
// Temperature compensation
const float t = mc_interface_temp_motor_filtered();
float ki = conf_now->foc_current_ki;
if (conf_now->foc_temp_comp && t > -30.0) {
ki += ki * 0.00386 * (t - conf_now->foc_temp_comp_base_temp);
if (conf_now->foc_temp_comp) {
ki = motor->m_current_ki_temp_comp;
}
state_m->vd_int += Ierr_d * (ki * d_gain_scale * dt);