На следующей картинке показано, что происходит на выходах энкодера, после вращения ручки энкодера.
Этой картинки достаточно, чтобы работать с энкодером, подключаем его к stm32 и настраиваем пины к которым вы его подключили на вход (GPIO_INPUT), так же для индикации подключаем два светодиода и настраиваем пины для них на выход (GPIO_OUTPUT).
Схема:
Код в котором при вращении энкодера по часовой стрелке мигнет один светодиод, а против часовой, другой:
Для упрощения работы с энкодером я написал простенькую библиотеку, ссылка на которую будет внизу статьи. В ней реализованы некотрые функции, для удобной работы с энкодером, а именно:
ENC_PinInit() - инициализация пинов для энкодера
ENC_read() - чтение состояния энкодера (должна постоянно вызываться)
ENC_ROTATE_LEFT() - проверка. Возвращает 1, если энкодер был повернут против часовой стрелки
ENC_ROTATE_RIGHT() - проверка. Возвращает 1, если энкодер был повернут по часовой стрелки
Чтобы использовать библиотеку необходимо файл encoder.h поместить в в ваш проект в папку Inc, а файл encoder.c в папку Src. После этого в файле main.c подключить библиотеку (#include "encoder.h"). теперь можно использовать функции библиотеки.
Теперь нужно настроить библиотеку, для этого нужно открыть файл encoder.h и найти эту строку:
#include "stm32f0xx_hal.h"
В этой строке подключается библиотека микроконтроллера, она у каждого микроконтроллера она своя, поэтому нужно заменить ее на вашу (посмотреть ее можно в файле main.h вашего проекта).
После этого нужно настроить пины, обратите внимание, что при использовании библиотеки пины настраивать нужно в самой библиотеке, а не в проекте. Для этого нужно открыть файл encoder.h, и найти там такой код:
Вместо тех пинов, которые написаны, напишите те, которые используются у вас. Теперь можно использовать функции библиотеки. Тот же самый код, который писали ранее, только с использованием библиотеки:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
ENC_read();
if (ENC_ROTATE_LEFT() == 1) {
HAL_GPIO_WritePin(RL_GPIO_Port, RL_Pin, 1);
HAL_Delay(10);
HAL_GPIO_WritePin(RL_GPIO_Port, RL_Pin, 0);
} else if (ENC_ROTATE_RIGHT() == 1) {
HAL_GPIO_WritePin(GL_GPIO_Port, GL_Pin, 1);
HAL_Delay(10);
HAL_GPIO_WritePin(GL_GPIO_Port, GL_Pin, 0);
}
}