]> git.leonardobizzoni.com Git - pioneer-stm32/commitdiff
Buzzer struct
authorLeonardoBizzoni <leo2002714@gmail.com>
Wed, 28 Jan 2026 08:32:46 +0000 (09:32 +0100)
committerLeonardoBizzoni <leo2002714@gmail.com>
Wed, 28 Jan 2026 08:32:46 +0000 (09:32 +0100)
pioneer_controller/Core/Inc/firmware/fmw_core.h
pioneer_controller/Core/Inc/firmware/fmw_messages.h
pioneer_controller/Core/Src/firmware/fwm_core.c
pioneer_controller/Core/Src/main.c

index f8132f1eaba30ea211535a221a6e57a130989e1f..5f1ac820fcaa15686d1f98d8ac9ed820e4df22f1 100644 (file)
@@ -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));
index 13bd4cfb269b135abbf43bab3fc931cc1c380a90..21a318de1adea12baa0edd3004fbe94859947077 100644 (file)
@@ -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)         \
index 7a24a2605abbd86b5342788b56af4a77e3723981..0c0877ad2af45c120d2c8e43e56f2532f85f5505 100644 (file)
@@ -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;
+}
index 68c3e810c78b1110d96d253d3fff3dad364d71b0..2db5cf4f337d94d59d835d37bcf53f3299159cda 100644 (file)
@@ -150,6 +150,11 @@ FMW_Led pled = {
   .state = FMW_LedState_Red,\r
 };\r
 \r
+FMW_Buzzer buzzer = {\r
+  .timer = &htim1,\r
+  .timer_channel = TIM_CHANNEL_2,\r
+};\r
+\r
 int32_t pid_max = 0;\r
 int32_t pid_min = 0;\r
 \r
@@ -904,16 +909,6 @@ FMW_Result message_handler(FMW_Message *msg) {
   return FMW_Result_Ok;\r
 }\r
 \r
-// TODO(lb): move to fmw. maybe create a FMW_Buzzer?\r
-void buzzer_set(bool on) {\r
-  if (on) {\r
-    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, htim1.Init.Period / 2);\r
-    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);\r
-  } else {\r
-    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);\r
-  }\r
-}\r
-\r
 // TIMER 100Hz PID control\r
 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {\r
   // NOTE(lb): metrics taken for transmission\r
@@ -1020,14 +1015,14 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
         fmw_motor_disable(&motors.left);\r
         fmw_motor_disable(&motors.right);\r
         HAL_GPIO_WritePin(SLED_GPIO_Port, SLED_Pin, GPIO_PIN_RESET);\r
-        buzzer_set(false);\r
+        fmw_buzzer_set(&buzzer, 1, false);\r
         /* char msg[] = "Motors OFF\r\n"; */\r
         /* HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); */\r
       } else {\r
         fmw_motor_enable(&motors.left);\r
         fmw_motor_enable(&motors.right);\r
         HAL_GPIO_WritePin(SLED_GPIO_Port, SLED_Pin, GPIO_PIN_SET);\r
-        buzzer_set(false);\r
+        fmw_buzzer_set(&buzzer, 1, false);\r
         /* char msg[] = "Motors ON\r\n"; */\r
         /* HAL_UART_Transmit(&huart3, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY); */\r
       }\r