mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-09 22:49:53 +08:00
[parrot] fix timeout for blocking i2c in bebop and disco actuators (#3573)
* fix timeout for blocking i2c in bebop and disco actuators * use correct settings for imu with 500Hz periodic freq for bebop and disco
This commit is contained in:
committed by
GitHub
parent
4560320201
commit
3f12cdebe0
@@ -54,6 +54,8 @@ static void send_bebop_actuators(struct transport_tx *trans, struct link_device
|
||||
}
|
||||
#endif
|
||||
|
||||
#define ACTUATORS_BEBOP_I2C_TIMEOUT 1.f
|
||||
|
||||
uint32_t led_hw_values;
|
||||
struct ActuatorsBebop actuators_bebop;
|
||||
static uint8_t actuators_bebop_checksum(uint8_t *bytes, uint8_t size);
|
||||
@@ -79,7 +81,7 @@ void actuators_bebop_commit(void)
|
||||
{
|
||||
// Receive the status
|
||||
actuators_bebop.i2c_trans.buf[0] = ACTUATORS_BEBOP_GET_OBS_DATA;
|
||||
i2c_blocking_transceive(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 1, 13, 0.5);
|
||||
i2c_blocking_transceive(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 1, 13, ACTUATORS_BEBOP_I2C_TIMEOUT);
|
||||
|
||||
// Update status
|
||||
electrical.vsupply = (float)(actuators_bebop.i2c_trans.buf[9] + (actuators_bebop.i2c_trans.buf[8] << 8)) / 1000.f;
|
||||
@@ -99,7 +101,7 @@ void actuators_bebop_commit(void)
|
||||
if (actuators_bebop.i2c_trans.buf[10] != 4 && actuators_bebop.i2c_trans.buf[10] != 2 && autopilot_get_motors_on()) {
|
||||
// Reset the error
|
||||
actuators_bebop.i2c_trans.buf[0] = ACTUATORS_BEBOP_CLEAR_ERROR;
|
||||
i2c_blocking_transmit(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 1, 0.5);
|
||||
i2c_blocking_transmit(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 1, ACTUATORS_BEBOP_I2C_TIMEOUT);
|
||||
|
||||
// Start the motors
|
||||
actuators_bebop.i2c_trans.buf[0] = ACTUATORS_BEBOP_START_PROP;
|
||||
@@ -109,12 +111,12 @@ void actuators_bebop_commit(void)
|
||||
#else
|
||||
actuators_bebop.i2c_trans.buf[1] = 0b00000101;
|
||||
#endif
|
||||
i2c_blocking_transmit(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 2, 0.5);
|
||||
i2c_blocking_transmit(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 2, ACTUATORS_BEBOP_I2C_TIMEOUT);
|
||||
}
|
||||
// Stop the motors
|
||||
else if (actuators_bebop.i2c_trans.buf[10] == 4 && !autopilot_get_motors_on()) {
|
||||
actuators_bebop.i2c_trans.buf[0] = ACTUATORS_BEBOP_STOP_PROP;
|
||||
i2c_blocking_transmit(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 1, 0.5);
|
||||
i2c_blocking_transmit(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 1, ACTUATORS_BEBOP_I2C_TIMEOUT);
|
||||
} else if (actuators_bebop.i2c_trans.buf[10] == 4 && autopilot_get_motors_on()) {
|
||||
// Send the commands
|
||||
actuators_bebop.i2c_trans.buf[0] = ACTUATORS_BEBOP_SET_REF_SPEED;
|
||||
@@ -131,18 +133,18 @@ void actuators_bebop_commit(void)
|
||||
#pragma GCC diagnostic ignored "-Wcast-qual"
|
||||
actuators_bebop.i2c_trans.buf[10] = actuators_bebop_checksum((uint8_t *)actuators_bebop.i2c_trans.buf, 9);
|
||||
#pragma GCC diagnostic pop
|
||||
i2c_blocking_transmit(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 11, 0.5);
|
||||
i2c_blocking_transmit(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 11, ACTUATORS_BEBOP_I2C_TIMEOUT);
|
||||
}
|
||||
|
||||
// Update the LEDs
|
||||
if (actuators_bebop.led != (led_hw_values & 0x3)) {
|
||||
actuators_bebop.i2c_trans.buf[0] = ACTUATORS_BEBOP_TOGGLE_GPIO;
|
||||
actuators_bebop.i2c_trans.buf[1] = (led_hw_values & 0x3);
|
||||
i2c_blocking_transmit(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 2, 0.5);
|
||||
i2c_blocking_transmit(&i2c1, &actuators_bebop.i2c_trans, actuators_bebop.i2c_trans.slave_addr, 2, ACTUATORS_BEBOP_I2C_TIMEOUT);
|
||||
|
||||
actuators_bebop.led = led_hw_values & 0x3;
|
||||
}
|
||||
|
||||
|
||||
// Send ABI message
|
||||
struct act_feedback_t feedback[4];
|
||||
for (int i=0;i<4;i++) {
|
||||
|
||||
@@ -45,6 +45,8 @@
|
||||
#warning "Disco actuators require a <servo name=MOTOR>"
|
||||
#endif
|
||||
|
||||
#define ACTUATORS_DISCO_I2C_TIMEOUT 1.f
|
||||
|
||||
/**
|
||||
* private observation structure
|
||||
*/
|
||||
@@ -119,7 +121,7 @@ void actuators_disco_commit(void)
|
||||
|
||||
// Receive the status
|
||||
actuators_disco.i2c_trans.buf[0] = ACTUATORS_DISCO_GET_OBS_DATA;
|
||||
i2c_blocking_transceive(&i2c1, &actuators_disco.i2c_trans, actuators_disco.i2c_trans.slave_addr, 1, sizeof(obs_data), 0.5);
|
||||
i2c_blocking_transceive(&i2c1, &actuators_disco.i2c_trans, actuators_disco.i2c_trans.slave_addr, 1, sizeof(obs_data), ACTUATORS_DISCO_I2C_TIMEOUT);
|
||||
// copy data from buffer
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wcast-qual"
|
||||
@@ -149,17 +151,17 @@ void actuators_disco_commit(void)
|
||||
actuators_disco.motor_rpm > DISCO_BLDC_START_MOTOR_THRESHOLD) {
|
||||
// Reset the error
|
||||
actuators_disco.i2c_trans.buf[0] = ACTUATORS_DISCO_CLEAR_ERROR;
|
||||
i2c_blocking_transmit(&i2c1, &actuators_disco.i2c_trans, actuators_disco.i2c_trans.slave_addr, 1, 0.5);
|
||||
i2c_blocking_transmit(&i2c1, &actuators_disco.i2c_trans, actuators_disco.i2c_trans.slave_addr, 1, ACTUATORS_DISCO_I2C_TIMEOUT);
|
||||
|
||||
// Start the motors
|
||||
actuators_disco.i2c_trans.buf[0] = ACTUATORS_DISCO_START_PROP;
|
||||
i2c_blocking_transmit(&i2c1, &actuators_disco.i2c_trans, actuators_disco.i2c_trans.slave_addr, 1, 0.5);
|
||||
i2c_blocking_transmit(&i2c1, &actuators_disco.i2c_trans, actuators_disco.i2c_trans.slave_addr, 1, ACTUATORS_DISCO_I2C_TIMEOUT);
|
||||
}
|
||||
// Stop the motors
|
||||
else if ((bldc_status == DISCO_BLDC_STATUS_RUNNING || bldc_status == DISCO_BLDC_STATUS_RAMPUP) &&
|
||||
actuators_disco.motor_rpm < DISCO_BLDC_START_MOTOR_THRESHOLD) {
|
||||
actuators_disco.i2c_trans.buf[0] = ACTUATORS_DISCO_STOP_PROP;
|
||||
i2c_blocking_transmit(&i2c1, &actuators_disco.i2c_trans, actuators_disco.i2c_trans.slave_addr, 1, 0.5);
|
||||
i2c_blocking_transmit(&i2c1, &actuators_disco.i2c_trans, actuators_disco.i2c_trans.slave_addr, 1, ACTUATORS_DISCO_I2C_TIMEOUT);
|
||||
} else if (bldc_status == DISCO_BLDC_STATUS_RUNNING) {
|
||||
// Send the commands
|
||||
actuators_disco.i2c_trans.buf[0] = ACTUATORS_DISCO_SET_REF_SPEED;
|
||||
@@ -170,7 +172,7 @@ void actuators_disco_commit(void)
|
||||
#pragma GCC diagnostic ignored "-Wcast-qual"
|
||||
actuators_disco.i2c_trans.buf[4] = actuators_disco_checksum((uint8_t *)actuators_disco.i2c_trans.buf, 3);
|
||||
#pragma GCC diagnostic pop
|
||||
i2c_blocking_transmit(&i2c1, &actuators_disco.i2c_trans, actuators_disco.i2c_trans.slave_addr, 11, 0.5);
|
||||
i2c_blocking_transmit(&i2c1, &actuators_disco.i2c_trans, actuators_disco.i2c_trans.slave_addr, 11, ACTUATORS_DISCO_I2C_TIMEOUT);
|
||||
}
|
||||
|
||||
// Send ABI message
|
||||
|
||||
@@ -50,7 +50,7 @@ PRINT_CONFIG_VAR(BEBOP_MPU_I2C_DEV)
|
||||
#define BEBOP_LOWPASS_FILTER MPU60X0_DLPF_42HZ
|
||||
#define BEBOP_SMPLRT_DIV 9
|
||||
PRINT_CONFIG_MSG("Gyro/Accel output rate is 100Hz at 1kHz internal sampling")
|
||||
#elif PERIODIC_FREQUENCY == 512
|
||||
#elif (PERIODIC_FREQUENCY == 512) || (PERIODIC_FREQUENCY == 500)
|
||||
/* Accelerometer: Bandwidth 260Hz, Delay 0ms
|
||||
* Gyroscope: Bandwidth 256Hz, Delay 0.98ms sampling 8kHz
|
||||
*/
|
||||
|
||||
@@ -49,7 +49,7 @@ PRINT_CONFIG_VAR(DISCO_MPU_I2C_DEV)
|
||||
#define DISCO_LOWPASS_FILTER MPU60X0_DLPF_42HZ
|
||||
#define DISCO_SMPLRT_DIV 9
|
||||
PRINT_CONFIG_MSG("Gyro/Accel output rate is 100Hz at 1kHz internal sampling")
|
||||
#elif PERIODIC_FREQUENCY == 512
|
||||
#elif (PERIODIC_FREQUENCY == 500) || (PERIODIC_FREQUENCY == 512)
|
||||
/* Accelerometer: Bandwidth 260Hz, Delay 0ms
|
||||
* Gyroscope: Bandwidth 256Hz, Delay 0.98ms sampling 8kHz
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user