Merge remote-tracking branch 'upstream/dev_fw_5_00' into dev_fw_5_00

This commit is contained in:
Jeffrey M. Friesen 2020-03-20 10:36:27 -07:00
commit 558a92b6f9
10 changed files with 142 additions and 44 deletions

View File

@ -4,7 +4,12 @@
* Disable CC decoupling during flux linkage measurement.
* Balance app updates. See: https://github.com/vedderb/bldc/pull/141
* Observer gain calculation update.
* Better observer gain scaling. This has a large impact on some motors.
* Added test build flag, that is transmitted with the FW Version command.
* Detect all bug fix.
* Added COMM_SET_BATTERY_CUT command.
* Added CAN_PACKET_SHUTDOWN CAN-command.
* GPDRIVE output sample fix.
=== FW 4.02 ===
* Position PID fix (most notable on multiturn encoders).

View File

@ -36,6 +36,7 @@
#include "encoder.h"
#include "utils.h"
#include "mempools.h"
#include "shutdown.h"
// Settings
#define RX_FRAMES_SIZE 100
@ -606,6 +607,17 @@ void comm_can_detect_all_foc_res_clear(void) {
detect_all_foc_res_index = 0;
}
void comm_can_conf_battery_cut(uint8_t controller_id,
bool store, float start, float end) {
int32_t send_index = 0;
uint8_t buffer[8];
buffer_append_float32(buffer, start, 1e3, &send_index);
buffer_append_float32(buffer, end, 1e3, &send_index);
comm_can_transmit_eid(controller_id |
((uint32_t)(store ? CAN_PACKET_CONF_STORE_BATTERY_CUT :
CAN_PACKET_CONF_BATTERY_CUT) << 8), buffer, send_index);
}
/**
* Get status message by index.
*
@ -1189,10 +1201,6 @@ static void decode_msg(uint32_t eid, uint8_t *data8, int len, bool is_replaced)
case CAN_PACKET_CONF_CURRENT_LIMITS:
case CAN_PACKET_CONF_STORE_CURRENT_LIMITS: {
if (is_replaced) {
break;
}
ind = 0;
float min = buffer_get_float32(data8, 1e3, &ind);
float max = buffer_get_float32(data8, 1e3, &ind);
@ -1217,10 +1225,6 @@ static void decode_msg(uint32_t eid, uint8_t *data8, int len, bool is_replaced)
case CAN_PACKET_CONF_CURRENT_LIMITS_IN:
case CAN_PACKET_CONF_STORE_CURRENT_LIMITS_IN: {
if (is_replaced) {
break;
}
ind = 0;
float min = buffer_get_float32(data8, 1e3, &ind);
float max = buffer_get_float32(data8, 1e3, &ind);
@ -1245,10 +1249,6 @@ static void decode_msg(uint32_t eid, uint8_t *data8, int len, bool is_replaced)
case CAN_PACKET_CONF_FOC_ERPMS:
case CAN_PACKET_CONF_STORE_FOC_ERPMS: {
if (is_replaced) {
break;
}
ind = 0;
float foc_openloop_rpm = buffer_get_float32(data8, 1e3, &ind);
float foc_sl_erpm = buffer_get_float32(data8, 1e3, &ind);
@ -1278,6 +1278,44 @@ static void decode_msg(uint32_t eid, uint8_t *data8, int len, bool is_replaced)
encoder_ts5700n8501_get_raw_status(), 8);
} break;
case CAN_PACKET_CONF_BATTERY_CUT:
case CAN_PACKET_CONF_STORE_BATTERY_CUT: {
ind = 0;
float start = buffer_get_float32(data8, 1e3, &ind);
float end = buffer_get_float32(data8, 1e3, &ind);
mc_configuration *mcconf = mempools_alloc_mcconf();
*mcconf = *mc_interface_get_configuration();
if (mcconf->l_battery_cut_start != start || mcconf->l_battery_cut_end != end) {
mcconf->l_battery_cut_start = start;
mcconf->l_battery_cut_end = end;
if (cmd == CAN_PACKET_CONF_STORE_BATTERY_CUT) {
conf_general_store_mc_configuration(mcconf,
mc_interface_get_motor_thread() == 2);
}
mc_interface_set_configuration(mcconf);
}
mempools_free_mcconf(mcconf);
} break;
case CAN_PACKET_SHUTDOWN: {
#ifdef HW_SHUTDOWN_HOLD_ON
SHUTDOWN_SET_SAMPLING_DISABLED(true);
mc_interface_lock();
DISABLE_GATE();
HW_SHUTDOWN_HOLD_OFF();
chThdSleepMilliseconds(5000);
HW_SHUTDOWN_HOLD_ON();
ENABLE_GATE();
mc_interface_unlock();
SHUTDOWN_SET_SAMPLING_DISABLED(false);
#endif
} break;
default:
break;
}

View File

@ -24,7 +24,6 @@
#include "hal.h"
// Settings
#define CAN_STATUS_MSG_INT_MS 1
#define CAN_STATUS_MSGS_TO_STORE 10
// Functions
@ -54,6 +53,8 @@ void comm_can_conf_foc_erpms(uint8_t controller_id,
int comm_can_detect_all_foc_res(unsigned int index);
int comm_can_detect_all_foc_res_size(void);
void comm_can_detect_all_foc_res_clear(void);
void comm_can_conf_battery_cut(uint8_t controller_id,
bool store, float start, float end);
can_status_msg *comm_can_get_status_msg_index(int index);
can_status_msg *comm_can_get_status_msg_id(int id);
can_status_msg_2 *comm_can_get_status_msg_2_index(int index);

View File

@ -658,7 +658,7 @@ void commands_process_packet(unsigned char *data, unsigned int len,
case COMM_GPD_OUTPUT_SAMPLE: {
timeout_reset();
int32_t ind = 0;
gpdrive_add_buffer_sample(buffer_get_float32_auto(data, &ind));
gpdrive_output_sample(buffer_get_float32_auto(data, &ind));
} break;
case COMM_GPD_SET_MODE: {
@ -1020,6 +1020,41 @@ void commands_process_packet(unsigned char *data, unsigned int len,
}
} break;
case COMM_SET_BATTERY_CUT: {
int32_t ind = 0;
float start = buffer_get_float32(data, 1e3, &ind);
float end = buffer_get_float32(data, 1e3, &ind);
bool store = data[ind++];
bool fwd_can = data[ind++];
if (fwd_can) {
comm_can_conf_battery_cut(255, store, start, end);
}
mc_configuration *mcconf = mempools_alloc_mcconf();
*mcconf = *mc_interface_get_configuration();
if (mcconf->l_battery_cut_start != start || mcconf->l_battery_cut_end != end) {
mcconf->l_battery_cut_start = start;
mcconf->l_battery_cut_end = end;
if (store) {
conf_general_store_mc_configuration(mcconf,
mc_interface_get_motor_thread() == 2);
}
mc_interface_set_configuration(mcconf);
}
mempools_free_mcconf(mcconf);
// Send ack
ind = 0;
uint8_t send_buffer[50];
send_buffer[ind++] = packet_id;
reply_func(send_buffer, ind);
} break;
// Blocking commands. Only one of them runs at any given time, in their
// own thread. If other blocking commands come before the previous one has
// finished, they are discarded.
@ -1168,7 +1203,11 @@ void commands_apply_mcconf_hw_limits(mc_configuration *mcconf) {
//control loop executes twice per pwm cycle when sampling in v0 and v7
utils_truncate_number(&mcconf->foc_f_sw, HW_LIM_FOC_CTRL_LOOP_FREQ);
} else {
#ifdef HW_HAS_DUAL_MOTORS
utils_truncate_number(&mcconf->foc_f_sw, HW_LIM_FOC_CTRL_LOOP_FREQ);
#else
utils_truncate_number(&mcconf->foc_f_sw, HW_LIM_FOC_CTRL_LOOP_FREQ * 2.0);
#endif
}
#endif

View File

@ -1107,6 +1107,11 @@ static bool measure_r_l_imax(float current_min, float current_max,
current_start = current_min * 1.1;
}
mc_configuration *mcconf = mempools_alloc_mcconf();
*mcconf = *mc_interface_get_configuration();
const float res_old = mcconf->foc_motor_r;
float i_last = 0.0;
for (float i = current_start;i < current_max;i *= 1.5) {
float res_tmp = mcpwm_foc_measure_resistance(i, 5);
@ -1122,10 +1127,17 @@ static bool measure_r_l_imax(float current_min, float current_max,
}
*r = mcpwm_foc_measure_resistance(i_last, 100);
mcconf->foc_motor_r = *r;
mc_interface_set_configuration(mcconf);
*l = mcpwm_foc_measure_inductance_current(i_last, 100, 0, 0) * 1e-6;
*i_max = sqrtf(max_power_loss / *r);
utils_truncate_number(i_max, HW_LIM_CURRENT);
mcconf->foc_motor_r = res_old;
mc_interface_set_configuration(mcconf);
return true;
}

View File

@ -71,8 +71,8 @@
// Mark3 version of HW60 with power switch and separate NRF UART.
//#define HW60_IS_MK3
//#define HW_SOURCE "hw_60.c"
//#define HW_HEADER "hw_60.h"
#define HW_SOURCE "hw_60.c"
#define HW_HEADER "hw_60.h"
//#define HW_SOURCE "hw_r2.c"
//#define HW_HEADER "hw_r2.h"
@ -140,10 +140,8 @@
//#define HW_SOURCE "hw_stormcore_60d.c"
//#define HW_HEADER "hw_stormcore_60d.h"
#define HW_SOURCE "hw_stormcore_100s.c"
#define HW_HEADER "hw_stormcore_100s.h"
//#define HW_SOURCE "hw_stormcore_100s.c"
//#define HW_HEADER "hw_stormcore_100s.h"
#endif
#ifndef HW_SOURCE

View File

@ -762,7 +762,8 @@ typedef enum {
COMM_WRITE_NEW_APP_DATA_ALL_CAN_LZO,
COMM_BM_WRITE_FLASH_LZO,
COMM_SET_CURRENT_REL,
COMM_CAN_FWD_FRAME
COMM_CAN_FWD_FRAME,
COMM_SET_BATTERY_CUT
} COMM_PACKET_ID;
// CAN commands
@ -795,7 +796,10 @@ typedef enum {
CAN_PACKET_CONF_FOC_ERPMS,
CAN_PACKET_CONF_STORE_FOC_ERPMS,
CAN_PACKET_STATUS_5,
CAN_PACKET_POLL_TS5700N8501_STATUS
CAN_PACKET_POLL_TS5700N8501_STATUS,
CAN_PACKET_CONF_BATTERY_CUT,
CAN_PACKET_CONF_STORE_BATTERY_CUT,
CAN_PACKET_SHUTDOWN
} CAN_PACKET_ID;
// Logged fault data
@ -904,15 +908,15 @@ typedef enum {
typedef struct {
float v_in;
float temp_mos1;
float temp_mos2;
float temp_mos3;
float temp_mos4;
float temp_mos5;
float temp_mos6;
float temp_pcb;
float temp_mos;
float temp_mos_1;
float temp_mos_2;
float temp_mos_3;
float temp_motor;
float current_motor;
float current_in;
float id;
float iq;
float rpm;
float duty_now;
float amp_hours;
@ -921,7 +925,11 @@ typedef struct {
float watt_hours_charged;
int tachometer;
int tachometer_abs;
float position;
mc_fault_code fault_code;
int vesc_id;
float vd;
float vq;
} mc_values;
typedef enum {

View File

@ -322,6 +322,7 @@ void gpdrive_output_sample(float sample) {
case GPD_OUTPUT_MODE_CURRENT:
m_current_state.current_set = sample;
m_is_running = true;
break;
default:

View File

@ -261,7 +261,7 @@
#define MCCONF_FOC_OBSERVER_GAIN 9e7 // Can be something like 600 / L
#endif
#ifndef MCCONF_FOC_OBSERVER_GAIN_SLOW
#define MCCONF_FOC_OBSERVER_GAIN_SLOW 0.4 // Observer gain scale at minimum duty cycle
#define MCCONF_FOC_OBSERVER_GAIN_SLOW 0.05 // Observer gain scale at minimum duty cycle
#endif
#ifndef MCCONF_FOC_DUTY_DOWNRAMP_KP
#define MCCONF_FOC_DUTY_DOWNRAMP_KP 10.0 // PI controller for duty control when decreasing the duty

View File

@ -703,7 +703,7 @@ void mcpwm_foc_set_configuration(volatile mc_configuration *configuration) {
motor_now()->m_control_mode = CONTROL_MODE_NONE;
motor_now()->m_state = MC_STATE_OFF;
stop_pwm_hw(motor_now());
update_hfi_samples(m_motor_1.m_conf->foc_hfi_samples, &m_motor_1);
update_hfi_samples(motor_now()->m_conf->foc_hfi_samples, motor_now());
}
}
@ -1307,7 +1307,7 @@ void mcpwm_foc_get_current_offsets(
volatile int *curr2_offset,
bool is_second_motor) {
#ifdef HW_HAS_DUAL_MOTORS
volatile motor_all_state_t *motor = is_second_motor ? &m_motor_1 : &m_motor_2;
volatile motor_all_state_t *motor = is_second_motor ? &m_motor_2 : &m_motor_1;
#else
(void)is_second_motor;
volatile motor_all_state_t *motor = &m_motor_1;
@ -2727,19 +2727,15 @@ static void timer_update(volatile motor_all_state_t *motor, float dt) {
// motor->m_conf->foc_observer_gain);
// Observer gain scaling, based on bus voltage and duty cycle
//motor->m_gamma_now = utils_map(fabsf(motor->m_motor_state.duty_now),
// 0.0, 40.0 / motor->m_motor_state.v_bus,
// motor->m_conf->foc_observer_gain_slow * motor->m_conf->foc_observer_gain,
// motor->m_conf->foc_observer_gain);
float gamma_tmp = utils_map(fabsf(motor->m_motor_state.duty_now),
0.0, 15.0 / motor->m_motor_state.v_bus,
0,
motor->m_conf->foc_observer_gain);
if (gamma_tmp < (motor->m_conf->foc_observer_gain_slow * motor->m_conf->foc_observer_gain)) {
gamma_tmp = motor->m_conf->foc_observer_gain_slow * motor->m_conf->foc_observer_gain;
}
motor->m_gamma_now = gamma_tmp;
0.0, 40.0 / motor->m_motor_state.v_bus,
0,
motor->m_conf->foc_observer_gain);
if (gamma_tmp < (motor->m_conf->foc_observer_gain_slow * motor->m_conf->foc_observer_gain)) {
gamma_tmp = motor->m_conf->foc_observer_gain_slow * motor->m_conf->foc_observer_gain;
}
// 3.5 scaling is kind of arbitrary, but it should make configs from old VESC Tools more likely to work.
motor->m_gamma_now = gamma_tmp * 3.5;
}
static THD_FUNCTION(timer_thread, arg) {