Merge branch 'L4ncelot-R:main' into main
This commit is contained in:
commit
f78fb7973d
|
@ -18,6 +18,11 @@
|
||||||
#define DIRECTION_LEFT_FORWARD (1U << DIRECTION_PIN_LEFT_IN4)
|
#define DIRECTION_LEFT_FORWARD (1U << DIRECTION_PIN_LEFT_IN4)
|
||||||
#define DIRECTION_LEFT_BACKWARD (1U << DIRECTION_PIN_LEFT_IN3)
|
#define DIRECTION_LEFT_BACKWARD (1U << DIRECTION_PIN_LEFT_IN3)
|
||||||
|
|
||||||
|
#define DIRECTION_FORWARD (DIRECTION_LEFT_FORWARD | DIRECTION_RIGHT_FORWARD)
|
||||||
|
#define DIRECTION_BACKWARD (DIRECTION_LEFT_BACKWARD | DIRECTION_RIGHT_BACKWARD)
|
||||||
|
|
||||||
|
#define DIRECTION_MASK (DIRECTION_FORWARD | DIRECTION_BACKWARD)
|
||||||
|
|
||||||
#define SPEED_PIN_RIGHT 15U
|
#define SPEED_PIN_RIGHT 15U
|
||||||
#define SPEED_PIN_LEFT 16U
|
#define SPEED_PIN_LEFT 16U
|
||||||
|
|
||||||
|
|
|
@ -80,80 +80,80 @@ turn_right_90()
|
||||||
g_motor_right.speed.distance_cm = initial;
|
g_motor_right.speed.distance_cm = initial;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
//void
|
||||||
spin_left_90()
|
//spin_left_90()
|
||||||
{
|
//{
|
||||||
set_wheel_direction(DIRECTION_LEFT);
|
// set_wheel_direction(DIRECTION_LEFT);
|
||||||
|
//
|
||||||
|
// set_wheel_speed_synced(90u);
|
||||||
|
//
|
||||||
|
// float initial = g_motor_left.speed.distance_cm;
|
||||||
|
// for (;;)
|
||||||
|
// {
|
||||||
|
// if (g_motor_left.speed.distance_cm - initial >= 7.5f)
|
||||||
|
// {
|
||||||
|
// set_wheel_speed_synced(0u);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// vTaskDelay(pdMS_TO_TICKS(5));
|
||||||
|
// }
|
||||||
|
// vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
// g_motor_left.speed.distance_cm = initial;
|
||||||
|
// g_motor_right.speed.distance_cm = initial;
|
||||||
|
//}
|
||||||
|
|
||||||
set_wheel_speed_synced(90u);
|
//void
|
||||||
|
//spin_right_90()
|
||||||
|
//{
|
||||||
|
// set_wheel_direction(DIRECTION_RIGHT);
|
||||||
|
//
|
||||||
|
// set_wheel_speed_synced(90u);
|
||||||
|
//
|
||||||
|
// float initial = g_motor_right.speed.distance_cm;
|
||||||
|
// for (;;)
|
||||||
|
// {
|
||||||
|
// if (g_motor_right.speed.distance_cm - initial >= 7.5f)
|
||||||
|
// {
|
||||||
|
// set_wheel_speed_synced(0u);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// vTaskDelay(pdMS_TO_TICKS(5));
|
||||||
|
// }
|
||||||
|
// vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
// g_motor_right.speed.distance_cm = initial;
|
||||||
|
// g_motor_left.speed.distance_cm = initial;
|
||||||
|
//}
|
||||||
|
|
||||||
float initial = g_motor_left.speed.distance_cm;
|
//void
|
||||||
for (;;)
|
//spin_to_yaw(float target_yaw)
|
||||||
{
|
//{
|
||||||
if (g_motor_left.speed.distance_cm - initial >= 7.5f)
|
// float initial_yaw = g_direction.yaw;
|
||||||
{
|
//
|
||||||
set_wheel_speed_synced(0u);
|
// // if it will to turn more than 180 degrees, turn the other way
|
||||||
break;
|
// if ((target_yaw > initial_yaw) && (target_yaw - initial_yaw < 180.f)
|
||||||
}
|
// || ((target_yaw < initial_yaw) && (initial_yaw - target_yaw >= 180.f)))
|
||||||
vTaskDelay(pdMS_TO_TICKS(5));
|
// {
|
||||||
}
|
// set_wheel_direction(DIRECTION_LEFT);
|
||||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
// }
|
||||||
g_motor_left.speed.distance_cm = initial;
|
// else if ((target_yaw > initial_yaw) && (target_yaw - initial_yaw >= 180.f)
|
||||||
g_motor_right.speed.distance_cm = initial;
|
// || ((target_yaw < initial_yaw)
|
||||||
}
|
// && (initial_yaw - target_yaw < 180.f)))
|
||||||
|
// {
|
||||||
void
|
// set_wheel_direction(DIRECTION_RIGHT);
|
||||||
spin_right_90()
|
// }
|
||||||
{
|
//
|
||||||
set_wheel_direction(DIRECTION_RIGHT);
|
// set_wheel_speed_synced(90u);
|
||||||
|
//
|
||||||
set_wheel_speed_synced(90u);
|
// g_use_pid = false;
|
||||||
|
//
|
||||||
float initial = g_motor_right.speed.distance_cm;
|
// for (;;)
|
||||||
for (;;)
|
// {
|
||||||
{
|
// if (initial_yaw == target_yaw)
|
||||||
if (g_motor_right.speed.distance_cm - initial >= 7.5f)
|
// {
|
||||||
{
|
// set_wheel_speed_synced(0u);
|
||||||
set_wheel_speed_synced(0u);
|
// break;
|
||||||
break;
|
// }
|
||||||
}
|
// vTaskDelay(pdMS_TO_TICKS(5));
|
||||||
vTaskDelay(pdMS_TO_TICKS(5));
|
// }
|
||||||
}
|
// g_use_pid = true;
|
||||||
vTaskDelay(pdMS_TO_TICKS(1000));
|
//}
|
||||||
g_motor_right.speed.distance_cm = initial;
|
|
||||||
g_motor_left.speed.distance_cm = initial;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
spin_to_yaw(float target_yaw)
|
|
||||||
{
|
|
||||||
float initial_yaw = g_direction.yaw;
|
|
||||||
|
|
||||||
// if it will to turn more than 180 degrees, turn the other way
|
|
||||||
if ((target_yaw > initial_yaw) && (target_yaw - initial_yaw < 180.f)
|
|
||||||
|| ((target_yaw < initial_yaw) && (initial_yaw - target_yaw >= 180.f)))
|
|
||||||
{
|
|
||||||
set_wheel_direction(DIRECTION_LEFT);
|
|
||||||
}
|
|
||||||
else if ((target_yaw > initial_yaw) && (target_yaw - initial_yaw >= 180.f)
|
|
||||||
|| ((target_yaw < initial_yaw)
|
|
||||||
&& (initial_yaw - target_yaw < 180.f)))
|
|
||||||
{
|
|
||||||
set_wheel_direction(DIRECTION_RIGHT);
|
|
||||||
}
|
|
||||||
|
|
||||||
set_wheel_speed_synced(90u);
|
|
||||||
|
|
||||||
g_use_pid = false;
|
|
||||||
|
|
||||||
for (;;)
|
|
||||||
{
|
|
||||||
if (initial_yaw == target_yaw)
|
|
||||||
{
|
|
||||||
set_wheel_speed_synced(0u);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(5));
|
|
||||||
}
|
|
||||||
g_use_pid = true;
|
|
||||||
}
|
|
|
@ -36,6 +36,19 @@ compute_pid(float *integral, float *prev_error)
|
||||||
return control_signal;
|
return control_signal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
compute_i_controller(float *integral)
|
||||||
|
{
|
||||||
|
float error
|
||||||
|
= g_motor_left.speed.distance_cm - g_motor_right.speed.distance_cm;
|
||||||
|
|
||||||
|
printf("%f\n", error);
|
||||||
|
|
||||||
|
*integral += error;
|
||||||
|
|
||||||
|
return g_motor_right.pid.ki_value * (*integral);
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
repeating_pid_handler(__unused struct repeating_timer *t)
|
repeating_pid_handler(__unused struct repeating_timer *t)
|
||||||
{
|
{
|
||||||
|
@ -71,3 +84,33 @@ repeating_pid_handler(__unused struct repeating_timer *t)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
repeating_i_handler(__unused struct repeating_timer *t)
|
||||||
|
{
|
||||||
|
static float integral = 0.0f;
|
||||||
|
|
||||||
|
if (!g_use_pid)
|
||||||
|
{
|
||||||
|
integral = 0.0f; // reset once disabled
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
float control_signal = compute_i_controller(&integral);
|
||||||
|
|
||||||
|
float temp = (float)g_motor_right.pwm.level + control_signal * 0.05f;
|
||||||
|
|
||||||
|
if (temp > MAX_PWM_LEVEL)
|
||||||
|
{
|
||||||
|
temp = MAX_PWM_LEVEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (temp <= MIN_PWM_LEVEL)
|
||||||
|
{
|
||||||
|
temp = MIN_PWM_LEVEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
set_wheel_speed((uint32_t)temp, &g_motor_right);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
|
@ -73,3 +73,52 @@ monitor_wheel_speed_task(void *pvParameters)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
set_wheel_speed(uint32_t pwm_level, motor_t * motor)
|
||||||
|
{
|
||||||
|
motor->pwm.level = pwm_level;
|
||||||
|
|
||||||
|
pwm_set_chan_level(motor->pwm.slice_num,
|
||||||
|
motor->pwm.channel,
|
||||||
|
motor->pwm.level);
|
||||||
|
}
|
||||||
|
|
||||||
|
///*!
|
||||||
|
// * @brief Set the speed of the wheels
|
||||||
|
// * @param pwm_level The pwm_level of the wheels, from 0 to 99
|
||||||
|
// */
|
||||||
|
//void
|
||||||
|
//set_wheel_speed_synced(uint32_t pwm_level)
|
||||||
|
//{
|
||||||
|
// if (pwm_level > MAX_PWM_LEVEL)
|
||||||
|
// {
|
||||||
|
// pwm_level = MAX_PWM_LEVEL;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// set_wheel_speed(pwm_level, &g_motor_left);
|
||||||
|
// set_wheel_speed(pwm_level, &g_motor_right);
|
||||||
|
//}
|
||||||
|
|
||||||
|
///*!
|
||||||
|
// * @brief Set the distance to travel before stopping, must be called after
|
||||||
|
// * setting the speed and direction.
|
||||||
|
// * @param distance_cm distance to travel in cm
|
||||||
|
// */
|
||||||
|
//void
|
||||||
|
//distance_to_stop(float distance_cm)
|
||||||
|
//{
|
||||||
|
// float initial = g_motor_right.speed.distance_cm;
|
||||||
|
//
|
||||||
|
// for (;;)
|
||||||
|
// {
|
||||||
|
// if (g_motor_right.speed.distance_cm - initial >= distance_cm)
|
||||||
|
// {
|
||||||
|
// set_wheel_speed_synced(0u);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// vTaskDelay(pdMS_TO_TICKS(10));
|
||||||
|
// }
|
||||||
|
// vTaskDelay(pdMS_TO_TICKS(1000));
|
||||||
|
// g_motor_right.speed.distance_cm = g_motor_left.speed.distance_cm;
|
||||||
|
//}
|
||||||
|
|
|
@ -10,12 +10,14 @@ motor_control_task(__unused void *params)
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
set_wheel_direction(DIRECTION_FORWARD);
|
set_wheel_direction(DIRECTION_FORWARD);
|
||||||
set_wheel_speed_synced(90);
|
set_wheel_speed(90u, &g_motor_left);
|
||||||
|
set_wheel_speed(90u, &g_motor_right);
|
||||||
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(10000));
|
vTaskDelay(pdMS_TO_TICKS(10000));
|
||||||
|
|
||||||
revert_wheel_direction();
|
revert_wheel_direction();
|
||||||
set_wheel_speed_synced(90);
|
set_wheel_speed(90u, &g_motor_left);
|
||||||
|
set_wheel_speed(90u, &g_motor_right);
|
||||||
|
|
||||||
vTaskDelay(pdMS_TO_TICKS(10000));
|
vTaskDelay(pdMS_TO_TICKS(10000));
|
||||||
}
|
}
|
||||||
|
@ -37,6 +39,7 @@ launch()
|
||||||
// PID timer
|
// PID timer
|
||||||
struct repeating_timer pid_timer;
|
struct repeating_timer pid_timer;
|
||||||
add_repeating_timer_ms(-50, repeating_pid_handler, NULL, &pid_timer);
|
add_repeating_timer_ms(-50, repeating_pid_handler, NULL, &pid_timer);
|
||||||
|
// add_repeating_timer_ms(-50, repeating_pid_handler, NULL, &pid_timer);
|
||||||
|
|
||||||
// Left wheel
|
// Left wheel
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue