Информационный портал MSEVM






Главная > STM32 > Подключение инкриментального энкодера к stm32


Описание энкодера: http://msevm.com/2020/37sk/37/index.htm



На следующей картинке показано, что происходит на выходах энкодера, после вращения ручки энкодера.



Этой картинки достаточно, чтобы работать с энкодером, подключаем его к stm32 и настраиваем пины к которым вы его подключили на вход (GPIO_INPUT), так же для индикации подключаем два светодиода и настраиваем пины для них на выход (GPIO_OUTPUT).
Схема:



Код в котором при вращении энкодера по часовой стрелке мигнет один светодиод, а против часовой, другой:
    while (1)
    {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        if (HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin) == 0 && HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin) == 1) {
    	    while(HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin) == 0 && HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin) == 1) {}
    	    while(HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin) == 0 && HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin) == 0) {}
    	    while(HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin) == 1 && HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin) == 0) {}
            HAL_Delay(10);
            HAL_GPIO_WritePin(RL_GPIO_Port, RL_Pin, 1);
		    HAL_Delay(10);
		    HAL_GPIO_WritePin(RL_GPIO_Port, RL_Pin, 0);
        }
        else if (HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin) == 1 && HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin) == 0) {
        	while(HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin) == 1 && HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin) == 0) {}
    	    while(HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin) == 0 && HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin) == 0) {}
    	    while(HAL_GPIO_ReadPin(A_GPIO_Port, A_Pin) == 0 && HAL_GPIO_ReadPin(B_GPIO_Port, B_Pin) == 1) {}
            HAL_Delay(10);
            HAL_GPIO_WritePin(GL_GPIO_Port, GL_Pin, 1);
		    HAL_Delay(10);
		    HAL_GPIO_WritePin(GL_GPIO_Port, GL_Pin, 0);
        }
    }
Для упрощения работы с энкодером я написал простенькую библиотеку, ссылка на которую будет внизу статьи. В ней реализованы некотрые функции, для удобной работы с энкодером, а именно:
  • 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, и найти там такой код:
    #define A_Pin               GPIO_PIN_11
    #define A_GPIO_Port         GPIOC
    #define B_Pin               GPIO_PIN_2
    #define B_GPIO_Port         GPIOD
Вместо тех пинов, которые написаны, напишите те, которые используются у вас. Теперь можно использовать функции библиотеки. Тот же самый код, который писали ранее, только с использованием библиотеки:
    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);
	    }
    }


Библиотека

Обсуждение: http://msevm.com/forum/index.php?topic=9456





e-mail рассылки
Радиолюбитель
Подписаться письмом

















afb44aa5




Яндекс цитирования Rambler's Top100