Added foc_beep command to lisp

This commit is contained in:
Benjamin Vedder 2022-06-17 10:43:19 +02:00
parent 0ee01ef34c
commit 7982a32916
5 changed files with 79 additions and 2 deletions

View File

@ -24,7 +24,7 @@
#define FW_VERSION_MAJOR 6 #define FW_VERSION_MAJOR 6
#define FW_VERSION_MINOR 00 #define FW_VERSION_MINOR 00
// 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 51 #define FW_TEST_VERSION_NUMBER 52
#include "datatypes.h" #include "datatypes.h"

View File

@ -388,6 +388,13 @@ Position control. Set motor position in degrees, range 0.0 to 360.0.
Run FOC in open loop. Useful to test thermal properties of motors and power stages. Run FOC in open loop. Useful to test thermal properties of motors and power stages.
#### foc-beep
```clj
(foc-beep freq time voltage)
```
Use the motor to play a beep sound at frequency freq for time seconds using voltage excitation voltage. The frequency can be set between 380 Hz and 3700 Hz.
### Motor Get Commands ### Motor Get Commands
#### get-current #### get-current

View File

@ -1056,6 +1056,13 @@ static lbm_value ext_foc_openloop(lbm_value *args, lbm_uint argn) {
return lbm_enc_sym(SYM_TRUE); return lbm_enc_sym(SYM_TRUE);
} }
static lbm_value ext_foc_beep(lbm_value *args, lbm_uint argn) {
CHECK_ARGN_NUMBER(3);
timeout_reset();
mcpwm_foc_beep(lbm_dec_as_float(args[0]), lbm_dec_as_float(args[1]), lbm_dec_as_float(args[2]));
return lbm_enc_sym(SYM_TRUE);
}
// Motor get commands // Motor get commands
static lbm_value ext_get_current(lbm_value *args, lbm_uint argn) { static lbm_value ext_get_current(lbm_value *args, lbm_uint argn) {
@ -3296,7 +3303,7 @@ void lispif_load_vesc_extensions(void) {
lbm_add_extension("eeprom-read-i", ext_eeprom_read_i); lbm_add_extension("eeprom-read-i", ext_eeprom_read_i);
lbm_add_extension("sysinfo", ext_sysinfo); lbm_add_extension("sysinfo", ext_sysinfo);
//APP commands // APP commands
lbm_add_extension("app-adc-detach", ext_app_adc_detach); lbm_add_extension("app-adc-detach", ext_app_adc_detach);
lbm_add_extension("app-adc-override", ext_app_adc_override); lbm_add_extension("app-adc-override", ext_app_adc_override);
@ -3311,6 +3318,7 @@ void lispif_load_vesc_extensions(void) {
lbm_add_extension("set-rpm", ext_set_rpm); lbm_add_extension("set-rpm", ext_set_rpm);
lbm_add_extension("set-pos", ext_set_pos); lbm_add_extension("set-pos", ext_set_pos);
lbm_add_extension("foc-openloop", ext_foc_openloop); lbm_add_extension("foc-openloop", ext_foc_openloop);
lbm_add_extension("foc-beep", ext_foc_beep);
// Motor get commands // Motor get commands
lbm_add_extension("get-current", ext_get_current); lbm_add_extension("get-current", ext_get_current);

View File

@ -1916,6 +1916,67 @@ float mcpwm_foc_measure_inductance_current(float curr_goal, int samples, float *
return ind; return ind;
} }
bool mcpwm_foc_beep(float freq, float time, float voltage) {
volatile motor_all_state_t *motor = get_motor_now();
mc_foc_sensor_mode sensor_mode_old = motor->m_conf->foc_sensor_mode;
float f_zv_old = motor->m_conf->foc_f_zv;
float hfi_voltage_start_old = motor->m_conf->foc_hfi_voltage_start;
float hfi_voltage_run_old = motor->m_conf->foc_hfi_voltage_run;
float hfi_voltage_max_old = motor->m_conf->foc_hfi_voltage_max;
float sl_erpm_hfi_old = motor->m_conf->foc_sl_erpm_hfi;
bool sample_v0_v7_old = motor->m_conf->foc_sample_v0_v7;
foc_hfi_samples samples_old = motor->m_conf->foc_hfi_samples;
uint16_t start_samples_old = motor->m_conf->foc_hfi_start_samples;
mc_interface_lock();
motor->m_control_mode = CONTROL_MODE_NONE;
motor->m_state = MC_STATE_OFF;
stop_pwm_hw((motor_all_state_t*)motor);
motor->m_conf->foc_sensor_mode = FOC_SENSOR_MODE_HFI;
motor->m_conf->foc_hfi_voltage_start = voltage;
motor->m_conf->foc_hfi_voltage_run = voltage;
motor->m_conf->foc_hfi_voltage_max = voltage;
motor->m_conf->foc_sl_erpm_hfi = 20000.0;
motor->m_conf->foc_sample_v0_v7 = false;
motor->m_conf->foc_hfi_samples = HFI_SAMPLES_8;
motor->m_conf->foc_hfi_start_samples = 10;
motor->m_conf->foc_f_zv = freq * 8.0;
utils_truncate_number(&motor->m_conf->foc_f_zv, 3.0e3, 30.0e3);
mcpwm_foc_set_configuration(motor->m_conf);
chThdSleepMilliseconds(1);
timeout_reset();
mcpwm_foc_set_duty(0.0);
int ms_sleep = (time * 1000.0) - 1;
if (ms_sleep > 0) {
chThdSleepMilliseconds(ms_sleep);
}
mcpwm_foc_set_current(0.0);
motor->m_conf->foc_sensor_mode = sensor_mode_old;
motor->m_conf->foc_f_zv = f_zv_old;
motor->m_conf->foc_hfi_voltage_start = hfi_voltage_start_old;
motor->m_conf->foc_hfi_voltage_run = hfi_voltage_run_old;
motor->m_conf->foc_hfi_voltage_max = hfi_voltage_max_old;
motor->m_conf->foc_sl_erpm_hfi = sl_erpm_hfi_old;
motor->m_conf->foc_sample_v0_v7 = sample_v0_v7_old;
motor->m_conf->foc_hfi_samples = samples_old;
motor->m_conf->foc_hfi_start_samples = start_samples_old;
mcpwm_foc_set_configuration(motor->m_conf);
mc_interface_unlock();
return true;
}
/** /**
* Automatically measure the resistance and inductance of the motor with small steps. * Automatically measure the resistance and inductance of the motor with small steps.
* *

View File

@ -83,6 +83,7 @@ void mcpwm_foc_encoder_detect(float current, bool print, float *offset, float *r
float mcpwm_foc_measure_resistance(float current, int samples, bool stop_after); float mcpwm_foc_measure_resistance(float current, int samples, bool stop_after);
float mcpwm_foc_measure_inductance(float duty, int samples, float *curr, float *ld_lq_diff); float mcpwm_foc_measure_inductance(float duty, int samples, float *curr, float *ld_lq_diff);
float mcpwm_foc_measure_inductance_current(float curr_goal, int samples, float *curr, float *ld_lq_diff); float mcpwm_foc_measure_inductance_current(float curr_goal, int samples, float *curr, float *ld_lq_diff);
bool mcpwm_foc_beep(float freq, float time, float voltage);
bool mcpwm_foc_measure_res_ind(float *res, float *ind, float *ld_lq_diff); bool mcpwm_foc_measure_res_ind(float *res, float *ind, float *ld_lq_diff);
bool mcpwm_foc_hall_detect(float current, uint8_t *hall_table); bool mcpwm_foc_hall_detect(float current, uint8_t *hall_table);
int mcpwm_foc_dc_cal(bool cal_undriven); int mcpwm_foc_dc_cal(bool cal_undriven);