Фаза фиксации передаётся в Encoder_Init явно и не зависит от положения контактов при включении. Для режимов с двумя и четырьмя переходами детент завершается только на заданных границах; повреждённый остаток сбрасывается при возвращении к ним. Сохранён счётчик недопустимых переходов. Проверены старт во всех фазах, дребезг, реверсы и восстановление после пропуска переходов в host-тестах основного проекта; измерения установленного энкодера не выполнялись.
41 lines
1.9 KiB
C
41 lines
1.9 KiB
C
/**
|
|
**************************************************************************
|
|
* @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
|