#define ENCODER_H
#include "main.h"
-#include "constants.h"
class Encoder {
public:
uint32_t current_millis_;
int32_t ticks_; //if negative the wheel is going backwards
float wheel_circumference_;
+ int ticks_per_revolution_;
Encoder() {
timer_ = NULL;
wheel_circumference_ = 0;
+ ticks_per_revolution_ = 0;
}
- Encoder(TIM_HandleTypeDef *timer, float wheel_circ) {
- timer_ = timer;
- wheel_circumference_ = wheel_circ;
+ Encoder(TIM_HandleTypeDef *timer, float wheel_circ,
+ int ticks_per_revolution) {
+ timer_ = timer;
+ wheel_circumference_ = wheel_circ;
+ ticks_per_revolution_ = ticks_per_revolution;
}
float GetMeters() {
float meters = ((float) this->ticks_ * this->wheel_circumference_)
- / TICKS_PER_REVOLUTION;
+ / ticks_per_revolution_;
return meters;
}
#define MOTOR_CONTROLLER_H
#include "main.h"
-#include "constants.h"
class MotorController {
public:
uint16_t dir_pin_;
TIM_HandleTypeDef *pwm_timer_;
uint32_t pwm_channel_;
+ int32_t max_dutycycle_;
MotorController(GPIO_TypeDef *sleep_gpio_port, uint16_t sleep_pin,
GPIO_TypeDef *dir_gpio_port, uint16_t dir_pin,
this->dir_pin_ = dir_pin;
this->pwm_timer_ = pwm_timer;
this->pwm_channel_ = pwm_channel;
+ this->max_dutycycle_ = pwm_timer->Instance->ARR;
}
void setup() {
HAL_GPIO_WritePin(dir_gpio_port_, dir_pin_, GPIO_PIN_SET);
//check if duty_cycle exceeds maximum
- if (duty_cycle > MAX_DUTY_CYCLE)
- __HAL_TIM_SET_COMPARE(pwm_timer_, pwm_channel_, MAX_DUTY_CYCLE);
+ if (duty_cycle > max_dutycycle_)
+ __HAL_TIM_SET_COMPARE(pwm_timer_, pwm_channel_, max_dutycycle_);
else
__HAL_TIM_SET_COMPARE(pwm_timer_, pwm_channel_, duty_cycle);
HAL_GPIO_WritePin(dir_gpio_port_, dir_pin_, GPIO_PIN_RESET);
//check if duty_cycle is lower than minimum
- if (duty_cycle < -MAX_DUTY_CYCLE)
- __HAL_TIM_SET_COMPARE(pwm_timer_, pwm_channel_, MAX_DUTY_CYCLE);
+ if (duty_cycle < -max_dutycycle_)
+ __HAL_TIM_SET_COMPARE(pwm_timer_, pwm_channel_, max_dutycycle_);
else
//invert sign to make duty_cycle positive
__HAL_TIM_SET_COMPARE(pwm_timer_, pwm_channel_, -duty_cycle);
\r
/* USER CODE BEGIN PV */\r
\r
+//Parameters\r
+float baseline = 0.3;\r
+int ticks_per_revolution = 148000; //x4 resolution\r
+float right_wheel_circumference = 0.783; //in meters\r
+float left_wheel_circumference = 0.789; //in meters\r
+\r
//Odometry\r
-Encoder right_encoder = Encoder(&htim5, RIGHT_WHEEL_CIRCUMFERENCE);\r
-Encoder left_encoder = Encoder(&htim2, LEFT_WHEEL_CIRCUMFERENCE);\r
-Odometry odom = Odometry();\r
+Encoder right_encoder = Encoder(&htim5, right_wheel_circumference,\r
+ ticks_per_revolution);\r
+Encoder left_encoder = Encoder(&htim2, left_wheel_circumference,\r
+ ticks_per_revolution);\r
+Odometry odom = Odometry(baseline);\r
\r
float left_velocity;\r
float right_velocity;\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
}\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
+ */\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
/* 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