diff --git a/frtos/config/motor_config.h b/frtos/config/motor_config.h index 1deb183..f3b7873 100644 --- a/frtos/config/motor_config.h +++ b/frtos/config/motor_config.h @@ -43,8 +43,8 @@ typedef struct { float target_speed_cms; float current_speed_cms; uint16_t pwm_level; - SemaphoreHandle_t * p_sem; - uint * p_slice_num; + SemaphoreHandle_t sem; + uint slice_num; uint pwm_channel; } motor_speed_t; diff --git a/frtos/motor/motor_init.h b/frtos/motor/motor_init.h index 189a9ef..2ebdca3 100644 --- a/frtos/motor/motor_init.h +++ b/frtos/motor/motor_init.h @@ -19,30 +19,18 @@ #include "motor_config.h" -uint g_slice_num_left = 0U; -uint g_slice_num_right = 0U; +motor_speed_t g_motor_speed_left = { .pwm_level = 2500u, + .pwm_channel = PWM_CHAN_A }; -SemaphoreHandle_t g_wheel_speed_sem_left = NULL; -SemaphoreHandle_t g_wheel_speed_sem_right = NULL; - -motor_speed_t g_motor_speed_left = { .target_speed_cms = 0.0f, - .pwm_level = 2500u, - .p_sem = &g_wheel_speed_sem_left, - .p_slice_num = &g_slice_num_left, - .pwm_channel = PWM_CHAN_A }; - -motor_speed_t g_motor_speed_right = { .target_speed_cms = 0.0f, - .pwm_level = 2500u, - .p_sem = &g_wheel_speed_sem_right, - .p_slice_num = &g_slice_num_right, - .pwm_channel = PWM_CHAN_B }; +motor_speed_t g_motor_speed_right = { .pwm_level = 2500u, + .pwm_channel = PWM_CHAN_B }; void motor_init(void) { // Semaphore - g_wheel_speed_sem_left = xSemaphoreCreateBinary(); - g_wheel_speed_sem_right = xSemaphoreCreateBinary(); + g_motor_speed_left.sem = xSemaphoreCreateBinary(); + g_motor_speed_right.sem = xSemaphoreCreateBinary(); gpio_init(SPEED_PIN_RIGHT); gpio_init(SPEED_PIN_LEFT); @@ -64,21 +52,21 @@ motor_init(void) gpio_set_function(PWM_PIN_LEFT, GPIO_FUNC_PWM); gpio_set_function(PWM_PIN_RIGHT, GPIO_FUNC_PWM); - g_slice_num_left = pwm_gpio_to_slice_num(PWM_PIN_LEFT); - g_slice_num_right = pwm_gpio_to_slice_num(PWM_PIN_RIGHT); + g_motor_speed_left.slice_num = pwm_gpio_to_slice_num(PWM_PIN_LEFT); + g_motor_speed_right.slice_num = pwm_gpio_to_slice_num(PWM_PIN_RIGHT); // NOTE: PWM clock is 125MHz for raspberrypi pico w by default // 125MHz / 250 = 500kHz - pwm_set_clkdiv(g_slice_num_left, PWM_CLK_DIV); - pwm_set_clkdiv(g_slice_num_right, PWM_CLK_DIV); + pwm_set_clkdiv(g_motor_speed_left.slice_num, PWM_CLK_DIV); + pwm_set_clkdiv(g_motor_speed_right.slice_num, PWM_CLK_DIV); // have them to be 500kHz / 5000 = 100Hz - pwm_set_wrap(g_slice_num_left, (PWM_WRAP - 1U)); - pwm_set_wrap(g_slice_num_right, (PWM_WRAP - 1U)); + pwm_set_wrap(g_motor_speed_left.slice_num, (PWM_WRAP - 1U)); + pwm_set_wrap(g_motor_speed_right.slice_num, (PWM_WRAP - 1U)); - pwm_set_enabled(g_slice_num_left, true); - pwm_set_enabled(g_slice_num_right, true); + pwm_set_enabled(g_motor_speed_left.slice_num, true); + pwm_set_enabled(g_motor_speed_right.slice_num, true); } #endif /* MOTOR_INIT_H */ \ No newline at end of file diff --git a/frtos/motor/motor_pid.h b/frtos/motor/motor_pid.h index 34a446a..d924819 100644 --- a/frtos/motor/motor_pid.h +++ b/frtos/motor/motor_pid.h @@ -63,7 +63,7 @@ motor_pid_task(void *p_param) printf("control signal: %f\n", control_signal); printf("new pwm: %hu\n\n", p_motor_speed->pwm_level); - pwm_set_chan_level(*p_motor_speed->p_slice_num, + pwm_set_chan_level(p_motor_speed->slice_num, p_motor_speed->pwm_channel, p_motor_speed->pwm_level); diff --git a/frtos/motor/motor_speed.h b/frtos/motor/motor_speed.h index bb91ce7..2b49b82 100644 --- a/frtos/motor/motor_speed.h +++ b/frtos/motor/motor_speed.h @@ -17,7 +17,7 @@ h_wheel_sensor_isr_handler(void) gpio_acknowledge_irq(SPEED_PIN_LEFT, GPIO_IRQ_EDGE_FALL); BaseType_t xHigherPriorityTaskWoken = pdFALSE; - xSemaphoreGiveFromISR(g_wheel_speed_sem_left, + xSemaphoreGiveFromISR(g_motor_speed_left.sem, &xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } @@ -27,7 +27,7 @@ h_wheel_sensor_isr_handler(void) gpio_acknowledge_irq(SPEED_PIN_RIGHT, GPIO_IRQ_EDGE_FALL); BaseType_t xHigherPriorityTaskWoken = pdFALSE; - xSemaphoreGiveFromISR(g_wheel_speed_sem_right, + xSemaphoreGiveFromISR(g_motor_speed_right.sem, &xHigherPriorityTaskWoken); portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } @@ -51,7 +51,7 @@ monitor_wheel_speed_task(void *pvParameters) for (;;) { - if (xSemaphoreTake(*p_motor_speed->p_sem, pdMS_TO_TICKS(100)) + if (xSemaphoreTake(p_motor_speed->sem, pdMS_TO_TICKS(100)) == pdTRUE) { curr_time = time_us_64();