From: Xavier L. <Ba...@us...> - 2011-04-02 16:03:23
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "krobot". The branch, master has been updated via cdde1ef37393f7bd15d0fd5038c197b8a0e2d421 (commit) from 275e297d6df8697614623704b7f136683ea71af1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit cdde1ef37393f7bd15d0fd5038c197b8a0e2d421 Author: Xavier Lagorce <Xav...@cr...> Date: Sat Apr 2 18:02:55 2011 +0200 [Controller_Motor_STM32] Fixed bug in callback generation with differential drive ----------------------------------------------------------------------- Changes: diff --git a/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.c b/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.c index ac57d5d..264cf7d 100644 --- a/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.c +++ b/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.c @@ -42,13 +42,17 @@ command_generator_t* new_ramp2_generator(command_generator_t *generator, float s } command_generator_t* new_dd_generator(command_generator_t *generator, + command_generator_t *linear_pos, command_generator_t *linear_speed, + command_generator_t *rotational_pos, command_generator_t *rotational_speed, float wheel_radius, float shaft_width, uint8_t type) { generator->type.t = (type == 1) ? GEN_DD_RIGHT : GEN_DD_LEFT; generator->type.callback.type = GEN_CALLBACK_NONE; + generator->dd.linear_pos = linear_pos; generator->dd.linear_speed = linear_speed; + generator->dd.rotational_pos = rotational_pos; generator->dd.rotational_speed = rotational_speed; generator->dd.wheel_radius = wheel_radius; generator->dd.shaft_width = shaft_width; @@ -138,11 +142,19 @@ float get_output_value(command_generator_t *generator) { generator->ramp2.last_time = cur_time; break; case GEN_DD_RIGHT: + // Update position generators to allow callbacks + get_output_value(generator->dd.linear_pos); + get_output_value(generator->dd.rotational_pos); + // Compute output u1 = get_output_value(generator->dd.linear_speed); u2 = get_output_value(generator->dd.rotational_speed); generator->type.last_output = (4.0*u1+u2*generator->dd.shaft_width) / (4.0 * generator->dd.wheel_radius); break; case GEN_DD_LEFT: + // Update position generators to allow callbacks + get_output_value(generator->dd.linear_pos); + get_output_value(generator->dd.rotational_pos); + // Compute output u1 = get_output_value(generator->dd.linear_speed); u2 = get_output_value(generator->dd.rotational_speed); generator->type.last_output = (4.0*u1-u2*generator->dd.shaft_width) / (4.0 * generator->dd.wheel_radius); diff --git a/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.h b/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.h index 38d4a00..6d888d6 100644 --- a/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.h +++ b/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/command_generator.h @@ -71,7 +71,9 @@ typedef struct { typedef struct { placeholder_generator_t gen; + command_generator_t *linear_pos; command_generator_t *linear_speed; + command_generator_t *rotational_pos; command_generator_t *rotational_speed; float wheel_radius; float shaft_width; @@ -112,14 +114,22 @@ command_generator_t* new_ramp2_generator(command_generator_t *generator, /* Initializes a new Differential Drive generator. * - generator : pointer to the generator to initialize + * - linear_pos : pointer to the generator giving the integrates of linear_speed. This + * generator will be called at each computation to allow update in parallel + * with linear_speed. * - linear_speed : pointer to the generator giving the linear speed of the drive + * - rotational_pos : pointer to the generator giving the integrates of rotational_speed. This + * generator will be called at each computation to allow update in parallel + * with rotational_speed. * - rotational_speed : pointer to the generator giving the rotational speed of the drive * - wheel_radius : radius of the wheels * - shaft_width : width of the propulsion shaft * - type : 1 for the right_wheel, -1 for the left_wheel */ command_generator_t* new_dd_generator(command_generator_t *generator, + command_generator_t *linear_pos, command_generator_t *linear_speed, + command_generator_t *rotational_pos, command_generator_t *rotational_speed, float wheel_radius, float shaft_width, uint8_t type); diff --git a/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/differential_drive.c b/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/differential_drive.c index ccf28e7..3e43444 100644 --- a/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/differential_drive.c +++ b/elec/boards/Controller_Motor_STM32/Firmware/controller_motor_stm32/differential_drive.c @@ -28,12 +28,16 @@ void dd_start(float wheel_radius, float shaft_width) { tc_new_controller(DD_LINEAR_SPEED_TC); tc_new_controller(DD_ROTATIONAL_SPEED_TC); new_dd_generator(¶ms.left_wheel_speed, + tc_get_position_generator(DD_LINEAR_SPEED_TC), tc_get_speed_generator(DD_LINEAR_SPEED_TC), + tc_get_position_generator(DD_ROTATIONAL_SPEED_TC), tc_get_speed_generator(DD_ROTATIONAL_SPEED_TC), wheel_radius, shaft_width, -1); new_dd_generator(¶ms.right_wheel_speed, + tc_get_position_generator(DD_LINEAR_SPEED_TC), tc_get_speed_generator(DD_LINEAR_SPEED_TC), + tc_get_position_generator(DD_ROTATIONAL_SPEED_TC), tc_get_speed_generator(DD_ROTATIONAL_SPEED_TC), wheel_radius, shaft_width, 1); @@ -92,6 +96,9 @@ void dd_move(float distance, float speed, float acceleration) { } void dd_turn(float angle, float speed, float acceleration) { + if (angle > 1.0) + LED2_ON(); + if (params.enabled) { params.last_rot_acceleration = acceleration; tc_goto(DD_ROTATIONAL_SPEED_TC, angle, speed, params.last_rot_acceleration); hooks/post-receive -- krobot |