float right_velocity = 0;\r
\r
//PID\r
-Pid left_pid(0, 0, 0);\r
-Pid right_pid(0, 0, 0);\r
-Pid cross_pid(0, 0, 0);\r
+int pid_min = 0;\r
+int pid_max = 0;\r
+\r
+Pid left_pid(0, 0, 0, pid_min, pid_max);\r
+Pid right_pid(0, 0, 0, pid_min, pid_max);\r
+Pid cross_pid(0, 0, 0, pid_min, pid_max);\r
float left_setpoint;\r
float right_setpoint;\r
float cross_setpoint;\r
sleep1_Pin,\r
dir1_GPIO_Port,\r
dir1_Pin,\r
- &htim4,\r
- TIM_CHANNEL_4);\r
+ &htim4, TIM_CHANNEL_4);\r
MotorController left_motor(sleep2_GPIO_Port,\r
sleep2_Pin,\r
dir2_GPIO_Port,\r
dir2_Pin,\r
- &htim4,\r
- TIM_CHANNEL_3);\r
+ &htim4, TIM_CHANNEL_3);\r
\r
//Communication\r
uint8_t *tx_buffer;\r
/* USER CODE END 0 */\r
\r
/**\r
- * @brief The application entry point.\r
- * @retval int\r
- */\r
-int main(void)\r
-{\r
+ * @brief The application entry point.\r
+ * @retval int\r
+ */\r
+int main(void) {\r
/* USER CODE BEGIN 1 */\r
/* USER CODE END 1 */\r
- \r
\r
/* MCU Configuration--------------------------------------------------------*/\r
\r
left_motor.setup();\r
right_motor.setup();\r
\r
+ pid_min = - left_motor.max_dutycycle_;\r
+ pid_max = left_motor.max_dutycycle_;\r
+\r
left_motor.coast();\r
right_motor.coast();\r
\r
}\r
\r
/**\r
- * @brief System Clock Configuration\r
- * @retval None\r
- */\r
-void SystemClock_Config(void)\r
-{\r
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};\r
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\r
- RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\r
+ * @brief System Clock Configuration\r
+ * @retval None\r
+ */\r
+void SystemClock_Config(void) {\r
+ RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\r
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\r
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };\r
\r
/** Configure the main internal regulator output voltage \r
- */\r
+ */\r
__HAL_RCC_PWR_CLK_ENABLE();\r
- __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);\r
- /** Initializes the CPU, AHB and APB busses clocks \r
- */\r
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);/** Initializes the CPU, AHB and APB busses clocks\r
+ */\r
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;\r
RCC_OscInitStruct.HSIState = RCC_HSI_ON;\r
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\r
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;\r
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)\r
- {\r
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\r
Error_Handler();\r
}\r
/** Initializes the CPU, AHB and APB busses clocks \r
- */\r
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\r
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;\r
+ */\r
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK\r
+ | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;\r
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;\r
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\r
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\r
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\r
\r
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)\r
- {\r
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {\r
Error_Handler();\r
}\r
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART6;\r
PeriphClkInitStruct.Usart6ClockSelection = RCC_USART6CLKSOURCE_PCLK2;\r
- if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)\r
- {\r
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {\r
Error_Handler();\r
}\r
}\r
\r
/**\r
- * @brief NVIC Configuration.\r
- * @retval None\r
- */\r
-static void MX_NVIC_Init(void)\r
-{\r
+ * @brief NVIC Configuration.\r
+ * @retval None\r
+ */\r
+static void MX_NVIC_Init(void) {\r
/* TIM3_IRQn interrupt configuration */\r
HAL_NVIC_SetPriority(TIM3_IRQn, 2, 1);\r
- HAL_NVIC_EnableIRQ(TIM3_IRQn);\r
+ HAL_NVIC_EnableIRQ (TIM3_IRQn);\r
/* TIM6_DAC_IRQn interrupt configuration */\r
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 2, 2);\r
- HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);\r
+ HAL_NVIC_EnableIRQ (TIM6_DAC_IRQn);\r
/* USART6_IRQn interrupt configuration */\r
HAL_NVIC_SetPriority(USART6_IRQn, 2, 0);\r
- HAL_NVIC_EnableIRQ(USART6_IRQn);\r
+ HAL_NVIC_EnableIRQ (USART6_IRQn);\r
}\r
\r
/**\r
- * @brief TIM2 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
-static void MX_TIM2_Init(void)\r
-{\r
+ * @brief TIM2 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
+static void MX_TIM2_Init(void) {\r
\r
/* USER CODE BEGIN TIM2_Init 0 */\r
\r
/* USER CODE END TIM2_Init 0 */\r
\r
- TIM_Encoder_InitTypeDef sConfig = {0};\r
- TIM_MasterConfigTypeDef sMasterConfig = {0};\r
+ TIM_Encoder_InitTypeDef sConfig = { 0 };\r
+ TIM_MasterConfigTypeDef sMasterConfig = { 0 };\r
\r
/* USER CODE BEGIN TIM2_Init 1 */\r
\r
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;\r
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;\r
sConfig.IC2Filter = 0;\r
- if (HAL_TIM_Encoder_Init(&htim2, &sConfig) != HAL_OK)\r
- {\r
+ if (HAL_TIM_Encoder_Init(&htim2, &sConfig) != HAL_OK) {\r
Error_Handler();\r
}\r
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\r
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\r
- if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)\r
- {\r
+ if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) {\r
Error_Handler();\r
}\r
/* USER CODE BEGIN TIM2_Init 2 */\r
}\r
\r
/**\r
- * @brief TIM3 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
-static void MX_TIM3_Init(void)\r
-{\r
+ * @brief TIM3 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
+static void MX_TIM3_Init(void) {\r
\r
/* USER CODE BEGIN TIM3_Init 0 */\r
\r
/* USER CODE END TIM3_Init 0 */\r
\r
- TIM_ClockConfigTypeDef sClockSourceConfig = {0};\r
- TIM_MasterConfigTypeDef sMasterConfig = {0};\r
+ TIM_ClockConfigTypeDef sClockSourceConfig = { 0 };\r
+ TIM_MasterConfigTypeDef sMasterConfig = { 0 };\r
\r
/* USER CODE BEGIN TIM3_Init 1 */\r
\r
htim3.Init.Period = 159;\r
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;\r
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;\r
- if (HAL_TIM_Base_Init(&htim3) != HAL_OK)\r
- {\r
+ if (HAL_TIM_Base_Init(&htim3) != HAL_OK) {\r
Error_Handler();\r
}\r
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;\r
- if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)\r
- {\r
+ if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) {\r
Error_Handler();\r
}\r
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\r
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\r
- if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)\r
- {\r
+ if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) {\r
Error_Handler();\r
}\r
/* USER CODE BEGIN TIM3_Init 2 */\r
}\r
\r
/**\r
- * @brief TIM4 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
-static void MX_TIM4_Init(void)\r
-{\r
+ * @brief TIM4 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
+static void MX_TIM4_Init(void) {\r
\r
/* USER CODE BEGIN TIM4_Init 0 */\r
\r
/* USER CODE END TIM4_Init 0 */\r
\r
- TIM_ClockConfigTypeDef sClockSourceConfig = {0};\r
- TIM_MasterConfigTypeDef sMasterConfig = {0};\r
- TIM_OC_InitTypeDef sConfigOC = {0};\r
+ TIM_ClockConfigTypeDef sClockSourceConfig = { 0 };\r
+ TIM_MasterConfigTypeDef sMasterConfig = { 0 };\r
+ TIM_OC_InitTypeDef sConfigOC = { 0 };\r
\r
/* USER CODE BEGIN TIM4_Init 1 */\r
\r
htim4.Init.Period = 799;\r
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;\r
htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;\r
- if (HAL_TIM_Base_Init(&htim4) != HAL_OK)\r
- {\r
+ if (HAL_TIM_Base_Init(&htim4) != HAL_OK) {\r
Error_Handler();\r
}\r
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;\r
- if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)\r
- {\r
+ if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) {\r
Error_Handler();\r
}\r
- if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)\r
- {\r
+ if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) {\r
Error_Handler();\r
}\r
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\r
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\r
- if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)\r
- {\r
+ if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) {\r
Error_Handler();\r
}\r
sConfigOC.OCMode = TIM_OCMODE_PWM1;\r
sConfigOC.Pulse = 0;\r
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;\r
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;\r
- if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)\r
- {\r
+ if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) {\r
Error_Handler();\r
}\r
- if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)\r
- {\r
+ if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) {\r
Error_Handler();\r
}\r
/* USER CODE BEGIN TIM4_Init 2 */\r
}\r
\r
/**\r
- * @brief TIM5 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
-static void MX_TIM5_Init(void)\r
-{\r
+ * @brief TIM5 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
+static void MX_TIM5_Init(void) {\r
\r
/* USER CODE BEGIN TIM5_Init 0 */\r
\r
/* USER CODE END TIM5_Init 0 */\r
\r
- TIM_Encoder_InitTypeDef sConfig = {0};\r
- TIM_MasterConfigTypeDef sMasterConfig = {0};\r
+ TIM_Encoder_InitTypeDef sConfig = { 0 };\r
+ TIM_MasterConfigTypeDef sMasterConfig = { 0 };\r
\r
/* USER CODE BEGIN TIM5_Init 1 */\r
\r
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;\r
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;\r
sConfig.IC2Filter = 0;\r
- if (HAL_TIM_Encoder_Init(&htim5, &sConfig) != HAL_OK)\r
- {\r
+ if (HAL_TIM_Encoder_Init(&htim5, &sConfig) != HAL_OK) {\r
Error_Handler();\r
}\r
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\r
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\r
- if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK)\r
- {\r
+ if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) {\r
Error_Handler();\r
}\r
/* USER CODE BEGIN TIM5_Init 2 */\r
}\r
\r
/**\r
- * @brief TIM6 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
-static void MX_TIM6_Init(void)\r
-{\r
+ * @brief TIM6 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
+static void MX_TIM6_Init(void) {\r
\r
/* USER CODE BEGIN TIM6_Init 0 */\r
\r
/* USER CODE END TIM6_Init 0 */\r
\r
- TIM_MasterConfigTypeDef sMasterConfig = {0};\r
+ TIM_MasterConfigTypeDef sMasterConfig = { 0 };\r
\r
/* USER CODE BEGIN TIM6_Init 1 */\r
\r
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;\r
htim6.Init.Period = 799;\r
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;\r
- if (HAL_TIM_Base_Init(&htim6) != HAL_OK)\r
- {\r
+ if (HAL_TIM_Base_Init(&htim6) != HAL_OK) {\r
Error_Handler();\r
}\r
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\r
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\r
- if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)\r
- {\r
+ if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) {\r
Error_Handler();\r
}\r
/* USER CODE BEGIN TIM6_Init 2 */\r
}\r
\r
/**\r
- * @brief USART6 Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
-static void MX_USART6_UART_Init(void)\r
-{\r
+ * @brief USART6 Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
+static void MX_USART6_UART_Init(void) {\r
\r
/* USER CODE BEGIN USART6_Init 0 */\r
\r
huart6.Init.OverSampling = UART_OVERSAMPLING_16;\r
huart6.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;\r
huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;\r
- if (HAL_UART_Init(&huart6) != HAL_OK)\r
- {\r
+ if (HAL_UART_Init(&huart6) != HAL_OK) {\r
Error_Handler();\r
}\r
/* USER CODE BEGIN USART6_Init 2 */\r
}\r
\r
/**\r
- * @brief GPIO Initialization Function\r
- * @param None\r
- * @retval None\r
- */\r
-static void MX_GPIO_Init(void)\r
-{\r
- GPIO_InitTypeDef GPIO_InitStruct = {0};\r
+ * @brief GPIO Initialization Function\r
+ * @param None\r
+ * @retval None\r
+ */\r
+static void MX_GPIO_Init(void) {\r
+ GPIO_InitTypeDef GPIO_InitStruct = { 0 };\r
\r
/* GPIO Ports Clock Enable */\r
__HAL_RCC_GPIOC_CLK_ENABLE();\r
__HAL_RCC_GPIOB_CLK_ENABLE();\r
\r
/*Configure GPIO pin Output Level */\r
- HAL_GPIO_WritePin(GPIOF, dir2_Pin|dir1_Pin, GPIO_PIN_RESET);\r
+ HAL_GPIO_WritePin(GPIOF, dir2_Pin | dir1_Pin, GPIO_PIN_RESET);\r
\r
/*Configure GPIO pin Output Level */\r
- HAL_GPIO_WritePin(GPIOF, sleep2_Pin|sleep1_Pin, GPIO_PIN_SET);\r
+ HAL_GPIO_WritePin(GPIOF, sleep2_Pin | sleep1_Pin, GPIO_PIN_SET);\r
\r
/*Configure GPIO pin : user_button_Pin */\r
GPIO_InitStruct.Pin = user_button_Pin;\r
HAL_GPIO_Init(fault2_GPIO_Port, &GPIO_InitStruct);\r
\r
/*Configure GPIO pins : dir2_Pin dir1_Pin */\r
- GPIO_InitStruct.Pin = dir2_Pin|dir1_Pin;\r
+ GPIO_InitStruct.Pin = dir2_Pin | dir1_Pin;\r
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\r
GPIO_InitStruct.Pull = GPIO_NOPULL;\r
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;\r
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);\r
\r
/*Configure GPIO pins : sleep2_Pin sleep1_Pin */\r
- GPIO_InitStruct.Pin = sleep2_Pin|sleep1_Pin;\r
+ GPIO_InitStruct.Pin = sleep2_Pin | sleep1_Pin;\r
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\r
GPIO_InitStruct.Pull = GPIO_PULLUP;\r
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;\r
\r
/* EXTI interrupt init*/\r
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);\r
- HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);\r
+ HAL_NVIC_EnableIRQ (EXTI15_10_IRQn);\r
\r
}\r
\r
\r
if (input_msg.pid_select == 1) {\r
\r
- left_pid.config(input_msg.pid_kp, input_msg.pid_ki, input_msg.pid_kd);\r
+ left_pid.config(input_msg.pid_kp, input_msg.pid_ki, input_msg.pid_kd,\r
+ pid_min, pid_max);\r
left_pid.set(input_msg.pid_setpoint_fixed);\r
\r
} else if (input_msg.pid_select == 2) {\r
- right_pid.config(input_msg.pid_kp, input_msg.pid_ki, input_msg.pid_kd);\r
+ right_pid.config(input_msg.pid_kp, input_msg.pid_ki, input_msg.pid_kd,\r
+ pid_min, pid_max);\r
right_pid.set(input_msg.pid_setpoint_fixed);\r
\r
} else if (input_msg.pid_select == 3) {\r
- left_pid.config(180, 200, 0);\r
- right_pid.config(185, 195, 0);\r
+ left_pid.config(180, 200, 0, pid_min, pid_max);\r
+ right_pid.config(185, 195, 0, pid_min, pid_max);\r
\r
- cross_pid.config(input_msg.pid_kp, input_msg.pid_ki, input_msg.pid_kd);\r
+ cross_pid.config(input_msg.pid_kp, input_msg.pid_ki, input_msg.pid_kd,\r
+ pid_min, pid_max);\r
\r
odom.UpdateValues(input_msg.pid_setpoint_lin, input_msg.pid_setpoint_ang);\r
\r
/* USER CODE END 4 */\r
\r
/**\r
- * @brief This function is executed in case of error occurrence.\r
- * @retval None\r
- */\r
-void Error_Handler(void)\r
-{\r
+ * @brief This function is executed in case of error occurrence.\r
+ * @retval None\r
+ */\r
+void Error_Handler(void) {\r
/* USER CODE BEGIN Error_Handler_Debug */\r
/* User can add his own implementation to report the HAL error return state */\r
\r