Files
Encoder/Core/Src/Encoder.c
2024-05-25 22:54:22 +03:00

100 lines
2.9 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "Encoder.h"
void DS_EncoderInitTim(DS_Encoder *Encoder, TIM_HandleTypeDef *hTim)
{
Encoder->hTim = hTim;
Encoder->State = 0;
HAL_TIM_Base_Start(Encoder->hTim);
}
void DS_EncoderInit(DS_Encoder *Encoder, GPIO_TypeDef *PortSignal1, uint16_t PinSignal1, GPIO_TypeDef *PortSignal2, uint16_t PinSignal2)
{
Encoder->hTim = 0;
Encoder->Direction = 0;
Encoder->State = 0;
Encoder->PrevTick = HAL_GetTick();
Encoder->PortEncSignal1 = PortSignal1;
Encoder->PortEncSignal2 = PortSignal2;
Encoder->PinEncSignal1 = PinSignal1;
Encoder->PinEncSignal2 = PinSignal2;
Encoder->ValueSignal1 = 0;
Encoder->ValueSignal2 = 0;
}
void DS_EncoderUpdate(DS_Encoder *Encoder)
{
uint32_t CurrentTick = HAL_GetTick();
if((CurrentTick - Encoder->PrevTick) < 1)
return;
Encoder->PrevTick = CurrentTick;
//Обновим состояние первой сигнальной линии
GPIO_PinState Pin1State = HAL_GPIO_ReadPin(Encoder->PortEncSignal1, Encoder->PinEncSignal1);
if(Pin1State == GPIO_PIN_SET)
{
Encoder->ValueSignal1 = 1;
}
else
{
Encoder->ValueSignal1 = 0;
}
//Обновим состояние второй сигнальной линн
GPIO_PinState Pin2State = HAL_GPIO_ReadPin(Encoder->PortEncSignal2, Encoder->PinEncSignal2);
if(Pin2State == GPIO_PIN_SET)
{
Encoder->ValueSignal2 = 1;
}
else
{
Encoder->ValueSignal2 = 0;
}
//Рассчитываем в какую сторону повернули энкодер
//Если на первой высокий уровень, а на второй низкий - то в одну сторону
if (Encoder->ValueSignal1 == 1 && Encoder->ValueSignal2 == 0)
{
Encoder->Direction = 1;
}
//Если на первой низкий, а на второй высокий - то в другую
if (Encoder->ValueSignal1 == 0 && Encoder->ValueSignal2 == 1)
{
Encoder->Direction = -1;
}
//Как определились с направлением - ждём когда оба сигнала поднимутся в высокий уровень, фиксируем шаг, и сбрасываем флаг направления
if (Encoder->Direction != 0 && Encoder->ValueSignal1 == 1 && Encoder->ValueSignal2 == 1)
{
Encoder->State = Encoder->State + Encoder->Direction;
Encoder->Direction = 0;
}
}
int8_t DS_EncoderGetState(DS_Encoder *Encoder)
{
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;
}
}