mirror of
https://github.com/odriverobotics/ODrive.git
synced 2026-09-20 14:38:18 +08:00
Merge branch 'Wetmelon-feature/CPR_Check' into devel
This commit is contained in:
@@ -71,7 +71,7 @@ Motor_t motors[] = {
|
||||
.vel_limit = 20000.0f, // [counts/s]
|
||||
.current_setpoint = 0.0f, // [A]
|
||||
.calibration_current = 10.0f, // [A]
|
||||
.resistance_calib_max_voltage = 1.0f, // [V]
|
||||
.resistance_calib_max_voltage = 1.0f, // [V] - You may need to increase this if this voltage isn't sufficient to drive calibration_current through the motor.
|
||||
.phase_inductance = 0.0f, // to be set by measure_phase_inductance
|
||||
.phase_resistance = 0.0f, // to be set by measure_phase_resistance
|
||||
.motor_thread = 0,
|
||||
@@ -129,6 +129,7 @@ Motor_t motors[] = {
|
||||
.encoder_offset = 0,
|
||||
.encoder_state = 0,
|
||||
.motor_dir = 1, // 1 or -1
|
||||
.encoder_calib_range = 0.02,
|
||||
.phase = 0.0f, // [rad]
|
||||
.pll_pos = 0.0f, // [rad]
|
||||
.pll_vel = 0.0f, // [rad/s]
|
||||
@@ -176,7 +177,7 @@ Motor_t motors[] = {
|
||||
.vel_limit = 20000.0f, // [counts/s]
|
||||
.current_setpoint = 0.0f, // [A]
|
||||
.calibration_current = 10.0f, // [A]
|
||||
.resistance_calib_max_voltage = 1.0f, // [V]
|
||||
.resistance_calib_max_voltage = 1.0f, // [V] - You may need to increase this if this voltage isn't sufficient to drive calibration_current through the motor.
|
||||
.phase_inductance = 0.0f, // to be set by measure_phase_inductance
|
||||
.phase_resistance = 0.0f, // to be set by measure_phase_resistance
|
||||
.motor_thread = 0,
|
||||
@@ -231,6 +232,7 @@ Motor_t motors[] = {
|
||||
.encoder_offset = 0,
|
||||
.encoder_state = 0,
|
||||
.motor_dir = 1, // 1 or -1
|
||||
.encoder_calib_range = 0.02,
|
||||
.phase = 0.0f, // [rad]
|
||||
.pll_pos = 0.0f, // [rad]
|
||||
.pll_vel = 0.0f, // [rad/s]
|
||||
@@ -760,14 +762,11 @@ bool measure_phase_inductance(Motor_t* motor, float voltage_low, float voltage_h
|
||||
// TODO: add check_timing
|
||||
bool calib_enc_offset(Motor_t* motor, float voltage_magnitude) {
|
||||
static const float start_lock_duration = 1.0f;
|
||||
static const int num_steps = 1024;
|
||||
static const int num_steps = 1024*2;
|
||||
static const float dt_step = 1.0f / 500.0f;
|
||||
static const float scan_range = 4.0f * M_PI;
|
||||
static const float scan_range = 16.0f * M_PI;
|
||||
const float step_size = scan_range / (float)num_steps; // TODO handle const expressions better (maybe switch to C++ ?)
|
||||
|
||||
int32_t init_enc_val = (int16_t)motor->encoder.encoder_timer->Instance->CNT;
|
||||
int32_t encvaluesum = 0;
|
||||
|
||||
// go to motor zero phase for start_lock_duration to get ready to scan
|
||||
for (int i = 0; i < start_lock_duration * current_meas_hz; ++i) {
|
||||
if (osSignalWait(M_SIGNAL_PH_CURRENT_MEAS, PH_CURRENT_MEAS_TIMEOUT).status != osEventSignal) {
|
||||
@@ -776,6 +775,10 @@ bool calib_enc_offset(Motor_t* motor, float voltage_magnitude) {
|
||||
}
|
||||
queue_voltage_timings(motor, voltage_magnitude, 0.0f);
|
||||
}
|
||||
|
||||
int32_t init_enc_val = (int16_t)motor->encoder.encoder_timer->Instance->CNT;
|
||||
int32_t encvaluesum = 0;
|
||||
|
||||
// scan forwards
|
||||
for (float ph = -scan_range / 2.0f; ph < scan_range / 2.0f; ph += step_size) {
|
||||
for (int i = 0; i < dt_step * (float)current_meas_hz; ++i) {
|
||||
@@ -789,6 +792,14 @@ bool calib_enc_offset(Motor_t* motor, float voltage_magnitude) {
|
||||
}
|
||||
encvaluesum += (int16_t)motor->encoder.encoder_timer->Instance->CNT;
|
||||
}
|
||||
|
||||
float expected_encoder_delta = scan_range / elec_rad_per_enc;
|
||||
float actual_encoder_delta_abs = fabsf((int16_t)motor->encoder.encoder_timer->Instance->CNT-init_enc_val);
|
||||
if(fabsf(actual_encoder_delta_abs - expected_encoder_delta)/expected_encoder_delta > motor->encoder.encoder_calib_range)
|
||||
{
|
||||
motor->error = ERROR_ENCODER_CPR_OUT_OF_RANGE;
|
||||
return false;
|
||||
}
|
||||
// check direction
|
||||
if ((int16_t)motor->encoder.encoder_timer->Instance->CNT > init_enc_val + 8) {
|
||||
// motor same dir as encoder
|
||||
|
||||
@@ -50,6 +50,7 @@ typedef enum {
|
||||
ERROR_SPIN_UP_TIMEOUT,
|
||||
ERROR_DRV_FAULT,
|
||||
ERROR_NOT_IMPLEMENTED_MOTOR_TYPE,
|
||||
ERROR_ENCODER_CPR_OUT_OF_RANGE
|
||||
} Error_t;
|
||||
|
||||
// Note: these should be sorted from lowest level of control to
|
||||
@@ -119,6 +120,7 @@ typedef struct {
|
||||
int32_t encoder_offset;
|
||||
int32_t encoder_state;
|
||||
int32_t motor_dir; // 1/-1 for fwd/rev alignment to encoder.
|
||||
float encoder_calib_range;
|
||||
float phase;
|
||||
float pll_pos;
|
||||
float pll_vel;
|
||||
|
||||
@@ -26,8 +26,8 @@ by default while UART runs the stream based variant.
|
||||
|
||||
## Packet format ##
|
||||
We will call the ODrive "server" and the PC "client". A request is a message
|
||||
from the PC to the ODrive and a response is a message from the PC to the
|
||||
ODrive.
|
||||
from the PC to the ODrive and a response is a message from the ODrive to the
|
||||
PC.
|
||||
|
||||
Each request-response transaction corresponds to a single endpoint operation.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user