From: LeonardoBizzoni Date: Wed, 28 Jan 2026 08:32:46 +0000 (+0100) Subject: Buzzer struct X-Git-Url: http://git.leonardobizzoni.com/?a=commitdiff_plain;h=b94d70dd9f8ac8c6e99c03e3a383531161f2e9fb;p=pioneer-stm32 Buzzer struct --- diff --git a/pioneer_controller/Core/Inc/firmware/fmw_core.h b/pioneer_controller/Core/Inc/firmware/fmw_core.h index f8132f1..5f1ac82 100644 --- a/pioneer_controller/Core/Inc/firmware/fmw_core.h +++ b/pioneer_controller/Core/Inc/firmware/fmw_core.h @@ -61,6 +61,11 @@ typedef struct { FMW_LedState state; } FMW_Led; +typedef struct FMW_Buzzer { + TIM_HandleTypeDef *const timer; + uint32_t timer_channel; +} FMW_Buzzer; + typedef void fmw_interrupt(void *user_data); void fmw_motor_init(FMW_Motor motors[], int32_t count) __attribute__((nonnull)); @@ -83,6 +88,8 @@ void fmw_odometry_setpoint_from_velocities(FMW_Odometry *odometry, void fmw_led_init(FMW_Led *led) __attribute__((nonnull)); void fmw_led_update(FMW_Led *led) __attribute__((nonnull)); +FMW_Result fmw_buzzer_set(FMW_Buzzer buzzer[], int32_t count, bool on) __attribute__((nonnull)); + void fmw_result_log_uart(UART_HandleTypeDef *huart, FMW_Result result, const char *filename, int16_t filename_length, int32_t line) __attribute__((nonnull)); diff --git a/pioneer_controller/Core/Inc/firmware/fmw_messages.h b/pioneer_controller/Core/Inc/firmware/fmw_messages.h index 13bd4cf..21a318d 100644 --- a/pioneer_controller/Core/Inc/firmware/fmw_messages.h +++ b/pioneer_controller/Core/Inc/firmware/fmw_messages.h @@ -1,30 +1,6 @@ #ifndef FMW_MESSAGE_H #define FMW_MESSAGE_H -// TODO(lb): fill with sensible values -#define FMW_MIN_ACCEPTABLE_TICKS_PER_REVOLUTION 1 -#define FMW_MAX_ACCEPTABLE_TICKS_PER_REVOLUTION 10000 - -// TODO(lb): fill with sensible values -#define FMW_MIN_ACCEPTABLE_PID_PROPORTIONAL -1.f -#define FMW_MAX_ACCEPTABLE_PID_PROPORTIONAL 1.f - -// TODO(lb): fill with sensible values -#define FMW_MIN_ACCEPTABLE_PID_INTEGRAL -1.f -#define FMW_MAX_ACCEPTABLE_PID_INTEGRAL 1.f - -// TODO(lb): fill with sensible values -#define FMW_MIN_ACCEPTABLE_PID_DERIVATIVE -1.f -#define FMW_MAX_ACCEPTABLE_PID_DERIVATIVE 1.f - -// TODO(lb): fill with sensible values -#define FMW_MIN_ACCEPTABLE_LED_VOLTAGE 0.f -#define FMW_MAX_ACCEPTABLE_LED_VOLTAGE 1.f - -// TODO(lb): fill with sensible values -#define FMW_MIN_ACCEPTABLE_LED_UPDATE_PERIOD 1 -#define FMW_MAX_ACCEPTABLE_LED_UPDATE_PERIOD 10000 - typedef union { struct { float proportional; @@ -75,6 +51,7 @@ enum { #define FMW_RESULT_VARIANTS(X) \ X(FMW_Result_Ok) \ + X(FMW_Result_Error_InvalidArguments) \ X(FMW_Result_Error_UART_Crc) \ X(FMW_Result_Error_UART_NegativeTimeout) \ X(FMW_Result_Error_UART_ReceiveTimeoutElapsed) \ @@ -82,6 +59,7 @@ enum { X(FMW_Result_Error_Encoder_NonPositiveTicksPerRevolution) \ X(FMW_Result_Error_Encoder_NonPositiveWheelCircumference) \ X(FMW_Result_Error_Encoder_GetTick) \ + X(FMW_Result_Error_Buzzer_Timer) \ X(FMW_Result_Error_MessageHandler_InvalidState) \ X(FMW_Result_Error_MessageHandler_Init_NonPositiveBaseline) \ X(FMW_Result_Error_MessageHandler_Init_NonPositiveWheelCircumference) \ diff --git a/pioneer_controller/Core/Src/firmware/fwm_core.c b/pioneer_controller/Core/Src/firmware/fwm_core.c index 7a24a26..0c0877a 100644 --- a/pioneer_controller/Core/Src/firmware/fwm_core.c +++ b/pioneer_controller/Core/Src/firmware/fwm_core.c @@ -40,7 +40,7 @@ void fmw_result_log_uart(UART_HandleTypeDef *huart, FMW_Result result, // ============================================================ // Motor controller void fmw_motor_init(FMW_Motor motors[], int32_t count) { - for (int32_t i = 0; i < count; ++ i) { + for (int32_t i = 0; i < count; ++i) { assert(motors[i].sleep_gpio_port); assert(motors[i].dir_gpio_port); assert(motors[i].pwm_timer); @@ -250,3 +250,21 @@ void fmw_led_update(FMW_Led *led) { __HAL_TIM_SET_COMPARE(led->timer, led->timer_channel, duty); } + +// ============================================================ +// Buzzers +FMW_Result fmw_buzzer_set(FMW_Buzzer buzzer[], int32_t count, bool on) { + if (count < 1) { return FMW_Result_Error_InvalidArguments; } + for (int32_t i = 0; i < count; ++i) { + HAL_StatusTypeDef res; + if (on) { + __HAL_TIM_SET_COMPARE(buzzer[i].timer, buzzer[i].timer_channel, + buzzer[i].timer->Init.Period / 2); + res = HAL_TIM_PWM_Start(buzzer[i].timer, buzzer[i].timer_channel); + } else { + res = HAL_TIM_PWM_Stop(buzzer[i].timer, buzzer[i].timer_channel); + } + if (res != HAL_OK) { return FMW_Result_Error_Buzzer_Timer; } + } + return FMW_Result_Ok; +} diff --git a/pioneer_controller/Core/Src/main.c b/pioneer_controller/Core/Src/main.c index 68c3e81..2db5cf4 100644 --- a/pioneer_controller/Core/Src/main.c +++ b/pioneer_controller/Core/Src/main.c @@ -150,6 +150,11 @@ FMW_Led pled = { .state = FMW_LedState_Red, }; +FMW_Buzzer buzzer = { + .timer = &htim1, + .timer_channel = TIM_CHANNEL_2, +}; + int32_t pid_max = 0; int32_t pid_min = 0; @@ -904,16 +909,6 @@ FMW_Result message_handler(FMW_Message *msg) { return FMW_Result_Ok; } -// TODO(lb): move to fmw. maybe create a FMW_Buzzer? -void buzzer_set(bool on) { - if (on) { - __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, htim1.Init.Period / 2); - HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); - } else { - HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2); - } -} - // TIMER 100Hz PID control void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { // NOTE(lb): metrics taken for transmission @@ -1020,14 +1015,14 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { fmw_motor_disable(&motors.left); fmw_motor_disable(&motors.right); HAL_GPIO_WritePin(SLED_GPIO_Port, SLED_Pin, GPIO_PIN_RESET); - buzzer_set(false); + fmw_buzzer_set(&buzzer, 1, false); /* char msg[] = "Motors OFF\r\n"; */ /* HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); */ } else { fmw_motor_enable(&motors.left); fmw_motor_enable(&motors.right); HAL_GPIO_WritePin(SLED_GPIO_Port, SLED_Pin, GPIO_PIN_SET); - buzzer_set(false); + fmw_buzzer_set(&buzzer, 1, false); /* char msg[] = "Motors ON\r\n"; */ /* HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); */ }