79 lines
2.4 KiB
C
79 lines
2.4 KiB
C
#include "Encoder.h"
|
||
|
||
void DS_EncoderInit(DS_Encoder *Encoder, GPIO_TypeDef *PortSignal1, uint16_t PinSignal1, GPIO_TypeDef *PortSignal2, uint16_t PinSignal2)
|
||
{
|
||
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)
|
||
{
|
||
int8_t ValueToReturn = Encoder->State;
|
||
Encoder->State = 0;
|
||
return ValueToReturn;
|
||
}
|