/** ************************************************************************** * @file general_encoder.h * @brief Заголовочный файл для работы с квадратурными энкодерами через GPIO. ************************************************************************** * @defgroup GENERAL_ENCODER Encoder Tools * @ingroup STM32_GENERAL * @brief Опрос GPIO и обработка шагов механического энкодера. * @details Порты и пины задаются при инициализации. Обработчик самостоятельно читает фазы A/B, учитывает направление, дребезг и число переходов на детент. *************************************************************************/ #ifndef __ENCODER_GENERAL_H_ #define __ENCODER_GENERAL_H_ #include "mylibs_config.h" /** Структура энкодера; каждый экземпляр имеет собственное состояние. */ typedef struct { GPIO_TypeDef *port_a; GPIO_TypeDef *port_b; uint16_t pin_a; uint16_t pin_b; uint8_t state; uint8_t detent_state; uint8_t steps_per_detent; int8_t partial_steps; uint32_t invalid_transitions; } Encoder_HandleTypeDef; /** Привязать GPIO A/B; detent_state задаёт фазу фиксации, не фазу включения. */ HAL_StatusTypeDef Encoder_Init(Encoder_HandleTypeDef *encoder, GPIO_TypeDef *port_a, uint16_t pin_a, GPIO_TypeDef *port_b, uint16_t pin_b, unsigned steps_per_detent, unsigned detent_state); /** Самостоятельно опросить GPIO, обработать фазы и вернуть -1, 0 или +1 детент. */ int Encoder_Update(Encoder_HandleTypeDef *encoder); #endif