From 6fc6bd447faa60dfa396d5dd871f8767f6c2db4c Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 25 May 2024 21:37:42 +0300 Subject: [PATCH] Added encoder operation via timer --- Inc/DS_Encoder.h | 8 +++++--- Src/DS_Encoder.c | 29 ++++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Inc/DS_Encoder.h b/Inc/DS_Encoder.h index 34aeb35..fa78b38 100644 --- a/Inc/DS_Encoder.h +++ b/Inc/DS_Encoder.h @@ -1,5 +1,5 @@ -#ifndef DS_ENCODER_H -#define DS_ENCODER_H +#ifndef ENCODER_H +#define ENCODER_H #ifdef STM32G030xx #include "stm32g0xx_hal.h" @@ -18,8 +18,10 @@ typedef struct DS_Encoder uint32_t PrevTick; uint8_t ValueSignal1, ValueSignal2; + TIM_HandleTypeDef *hTim; }DS_Encoder; +void DS_EncoderInitTim(DS_Encoder *Encoder, TIM_HandleTypeDef *hTim); void DS_EncoderInit(DS_Encoder *Encoder, GPIO_TypeDef* PortEncSignal1, uint16_t PinEncSignal1, GPIO_TypeDef* PortEncSignal2, uint16_t PinEncSignal2); @@ -27,4 +29,4 @@ void DS_EncoderUpdate(DS_Encoder *Encoder); int8_t DS_EncoderGetState(DS_Encoder *Encoder); -#endif //DS_ENCODER_H \ No newline at end of file +#endif //ENCODER_H \ No newline at end of file diff --git a/Src/DS_Encoder.c b/Src/DS_Encoder.c index d302ab9..bf07603 100644 --- a/Src/DS_Encoder.c +++ b/Src/DS_Encoder.c @@ -1,7 +1,16 @@ #include "Encoder.h" +void DS_EncoderInitTim(DS_Encoder *Encoder, TIM_HandleTypeDef *hTim) +{ + Encoder->hTim = hTim; + Encoder->State = 0; + HAL_TIM_Base_Start(hTim); + +} + void DS_EncoderInit(DS_Encoder *Encoder, GPIO_TypeDef *PortEncSignal1, uint16_t PinEncSignal1, GPIO_TypeDef *PortEncSignal2, uint16_t PinEncSignal2) { + Encoder->hTim = 0; Encoder->Direction = 0; Encoder->State = 0; Encoder->PrevTick = HAL_GetTick(); @@ -69,7 +78,21 @@ void DS_EncoderUpdate(DS_Encoder *Encoder) int8_t DS_EncoderGetState(DS_Encoder *Encoder) { - int8_t ValueToReturn = Encoder->State; - Encoder->State = 0; - return ValueToReturn; + if (Encoder->hTim != 0) + { + int8_t CurrentCounter = Encoder->hTim->Instance->CNT / 4; + int8_t ValueToReturn = CurrentCounter - Encoder->State; + Encoder->State = CurrentCounter; + + return ValueToReturn; + } + else + { + int8_t ValueToReturn = Encoder->State; + Encoder->State = 0; + return ValueToReturn; + } + + + }