Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 1 addition & 13 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,6 @@ set(HALAL_CPP_NO_ETH
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Models/DMA/DMA2.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Models/PinModel/Pin.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Models/TimerDomain/TimerDomain.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Models/TimerPeripheral/TimerPeripheral.cpp
# ${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/ADC/ADC.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/CORDIC/CORDIC.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/Communication/FDCAN/FDCAN.cpp
Expand All @@ -282,20 +281,13 @@ set(HALAL_CPP_NO_ETH
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/DigitalInputService/DigitalInputService.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/DigitalOutputService/DigitalOutputService.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/EXTI/EXTI.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/Encoder/Encoder.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/FMAC/FMAC.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/Flash/Flash.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/Flash/FlashTests/Flash_Test.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/InfoWarning/InfoWarning.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/InputCapture/InputCapture.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/PWM/DualCenterPWM/DualCenterPWM.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/PWM/DualPWM/DualPWM.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/PWM/DualPhasedPWM/DualPhasedPWM.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/PWM/PWM/PWM.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/PWM/PhasedPWM/PhasedPWM.cpp
# ${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/InputCapture/InputCapture.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/Time/RTC.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/Time/Scheduler.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/Time/Time.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/HALAL/Services/Watchdog/Watchdog.cpp
)

Expand Down Expand Up @@ -363,18 +355,14 @@ set(STLIB_LOW_CPP_ETH
set(STLIB_LOW_C_NO_ETH)

set(STLIB_LOW_CPP_NO_ETH
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/Clocks/Counter.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/Clocks/Stopwatch.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/DigitalOutput/DigitalOutput.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/ErrorHandler/ErrorHandler.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/HalfBridge/HalfBridge.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/Math/Math.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/ST-LIB_LOW.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/Sd/Sd.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/Sensors/DigitalSensor/DigitalSensor.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/Sensors/LookupSensor/LookupSensor.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/Sensors/NTC/NTC.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/Sensors/Sensor/Sensor.cpp
${CMAKE_CURRENT_LIST_DIR}/Src/ST-LIB_LOW/Sensors/SensorInterrupt/SensorInterrupt.cpp
)

Expand Down
11 changes: 4 additions & 7 deletions Inc/HALAL/HALAL.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,9 @@

#include "HALAL/Services/ADC/NewADC.hpp"

#include "HALAL/Services/PWM/DualCenterPWM/DualCenterPWM.hpp"
#include "HALAL/Services/PWM/DualPWM/DualPWM.hpp"
#include "HALAL/Services/PWM/DualPhasedPWM/DualPhasedPWM.hpp"
#include "HALAL/Services/PWM/PWM/PWM.hpp"
#include "HALAL/Services/PWM/PhasedPWM/PhasedPWM.hpp"
// To be implemented
// #include "HALAL/Services/PWM/DualPhasedPWM/DualPhasedPWM.hpp"
// #include "HALAL/Services/PWM/PhasedPWM/PhasedPWM.hpp"

#include "HALAL/Services/PWM/DualPWM.hpp"
#include "HALAL/Services/PWM/PWM.hpp"
Expand All @@ -30,8 +28,7 @@
// #include "HALAL/Services/Encoder/Encoder.hpp"
#include "HALAL/Services/EXTI/EXTI.hpp"
#include "HALAL/Services/Encoder/Encoder.hpp"
#include "HALAL/Services/Encoder/NewEncoder.hpp"
#include "HALAL/Services/InputCapture/InputCapture.hpp"
// #include "HALAL/Services/InputCapture/InputCapture.hpp" // To be implemented

#include "HALAL/Services/Communication/FDCAN/FDCAN.hpp"
#include "HALAL/Services/Communication/I2C/I2C.hpp"
Expand Down
1 change: 0 additions & 1 deletion Inc/HALAL/Services/Communication/SNTP/SNTP.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@

#include "sntp.h"
#include "HALAL/Models/IPV4/IPV4.hpp"
#include "HALAL/Services/Time/Time.hpp"
#include "C++Utilities/CppUtils.hpp"

class SNTP {
Expand Down
2 changes: 1 addition & 1 deletion Inc/HALAL/Services/EXTI/EXTI.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,4 +149,4 @@ struct EXTIDomain {

} // namespace ST_LIB

#endif // EXTI_HPP
#endif // EXTI_HPP
198 changes: 114 additions & 84 deletions Inc/HALAL/Services/Encoder/Encoder.hpp
Original file line number Diff line number Diff line change
@@ -1,84 +1,114 @@
/*
* Encoder.hpp
*
* Created on: 27 oct. 2022
* Author: Pablo
*/

#pragma once

#include "HALAL/Models/PinModel/Pin.hpp"
#include "HALAL/Models/TimerPeripheral/TimerPeripheral.hpp"
#include "C++Utilities/CppUtils.hpp"
#include "ErrorHandler/ErrorHandler.hpp"

#define NANO_SECOND 1000000000.0
#define CLOCK_MAX_VALUE 4294967295 // here goes the tim23 counter period

#ifdef HAL_TIM_MODULE_ENABLED
/**
* @brief Encoder service class. Abstracts the use of the encoder with the HAL library.
*
*/
class Encoder {
public:
static uint8_t id_counter;
static map<pair<Pin, Pin>, TimerPeripheral*> pin_timer_map;
static map<uint8_t, pair<Pin, Pin>> registered_encoder;

/**
* @brief This method registers a new encoder
*
* @param pin1 First pin of the encoder
* @param pin2 Second pin of the encoder
*
* @retval uint8_t Id of the service
*/
static uint8_t inscribe(Pin& pin1, Pin& pin2);

static void start();

/**
* @brief Starts the timer of the encoder
*
* @param id Id of the encoder
*/
static void turn_on(uint8_t id);

/**
* @brief Stop the timer of the encoder
*
* @param id Id of the encoder
*/
static void turn_off(uint8_t id);

/**
* @brief Resets the encoder by setting the CNT register to 0
*
* @param id Id of the encoder
*/
static void reset(uint8_t id);

/**
* @brief Get the CNT value of the encoder
*
* @param id Id of the encoder
* @return uint32_t CNT value if the id is valid
*/
static uint32_t get_counter(uint8_t id);

/**
* @brief Get the encoder direction
*
* @param id Id
* @return bool Encoder direction if id is valid
*/
static bool get_direction(uint8_t id);

static void init(TimerPeripheral* encoder);

static uint32_t get_initial_counter_value(uint8_t id);

static int64_t get_delta_clock(uint64_t clock_time, uint64_t last_clock_time);
};
#endif
#pragma once

#include "HALAL/Models/TimerDomain/TimerDomain.hpp"

#ifdef HAL_TIM_MODULE_ENABLED

#define NANO_SECOND 1000000000.0
#define CLOCK_MAX_VALUE 4294967295 // here goes the tim23 counter period

namespace ST_LIB {

template <const TimerDomain::Timer& dev> struct TimerWrapper;

template <const TimerDomain::Timer& dev> class Encoder {
static_assert(
dev.e.pin_count == 2,
"Encoder must have exactly 2 encoder pins, as it uses the whole timer"
);
static_assert(dev.e.pins[0].af == TimerAF::Encoder, "Pin 0 must be declared as encoder");
static_assert(dev.e.pins[1].af == TimerAF::Encoder, "Pin 1 must be declared as encoder");
static_assert(
dev.e.pins[0].channel != dev.e.pins[1].channel,
"Pins must be of different channels"
);

inline static TimerWrapper<dev>* timer;
inline static bool is_on = false;

public:
Encoder(TimerWrapper<dev>* tim) {
if (timer == nullptr) {
init(tim);
}
}

static void init(TimerWrapper<dev>* tim) {
timer = tim;
TIM_Encoder_InitTypeDef sConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};

tim->instance->hal_tim->Init.Prescaler = 5;
tim->instance->hal_tim->Init.CounterMode = TIM_COUNTERMODE_UP;
tim->instance->hal_tim->Init.Period = 55000;
tim->instance->hal_tim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
tim->instance->hal_tim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
sConfig.IC1Filter = 0;
sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
sConfig.IC2Filter = 0;

if (HAL_TIM_Encoder_Init(tim->instance->hal_tim, &sConfig) != HAL_OK) {
ErrorHandler("Unable to init encoder");
}

sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(tim->instance->hal_tim, &sMasterConfig) !=
HAL_OK) {
ErrorHandler("Unable to config master synchronization in encoder");
}
}

static void turn_on() {
if (is_on)
return;

if (HAL_TIM_Encoder_GetState(timer->instance->hal_tim) == HAL_TIM_STATE_RESET) {
ErrorHandler("Unable to get state from encoder");
return;
}
if (HAL_TIM_Encoder_Start(timer->instance->hal_tim, TIM_CHANNEL_ALL) != HAL_OK) {
ErrorHandler("Unable to start encoder");
return;
}
is_on = true;
reset();
}

static void turn_off() {
if (!is_on)
return;
if (HAL_TIM_Encoder_Stop(timer->instance->hal_tim, TIM_CHANNEL_ALL) != HAL_OK) {
ErrorHandler("Unable to stop encoder");
}
is_on = false;
}

static inline void reset() { timer->instance->tim->CNT = UINT32_MAX / 2; }

static inline uint32_t get_counter() { return timer->instance->tim->CNT; }

static inline bool get_direction() { return ((timer->instance->tim->CR1 & 0b10000) >> 4); }

static inline uint32_t get_initial_counter_value() { return timer->instance->tim->ARR / 2; }

static int64_t get_delta_clock(uint64_t clock_time, uint64_t last_clock_time) {
int64_t delta_clock = clock_time - last_clock_time;
if (clock_time < last_clock_time) { // overflow handle
delta_clock = clock_time +
CLOCK_MAX_VALUE * NANO_SECOND / timer->get_clock_frequency() -
last_clock_time;
}
return delta_clock;
}
};

} // namespace ST_LIB
#endif
Loading