Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // encoder.c
- //
- #include "encoder.h"
- #include <stm32f4xx.h>
- // Энкодер цепляется на выводы PB6/PB7
- void enc_Init(void)
- {
- // Включить тактирование порта GPIOB
- RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
- // Включить тактирование модуля TIM4
- RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
- // Номер альтернативной функции: 2
- GPIOB->AFR[0] &= ~((0x0FUL << (6 * 4)) | (0x0FUL << (7 * 4))); // 6, 7 очистим
- GPIOB->AFR[0] |= (0x02UL << (6 * 4)) | (0x02UL << (7 * 4)); // В 6, 7 запишем 2
- // Режим: альтернативная функция
- GPIOB->MODER &= ~((0x03UL << (6 * 2)) | (0x03UL << (7 * 2))); // 6, 7 очистим
- GPIOB->MODER |= (0x02UL << (6 * 2)) | (0x02UL << (7 * 2)); // В 6, 7 запишем 2
- // Используем все 16 бит, что уж тут
- TIM4->ARR = 0xFFFF;
- // Предделитель: 1
- TIM4->PSC = 0;
- // Режим: Экнкодер 0b001, счт по первому сигналу только
- TIM4->SMCR &= ~(TIM_SMCR_SMS);
- TIM4->SMCR |= (TIM_SMCR_SMS_0);
- // Выключить каналы в любом случае
- TIM4->CCER &= ~(TIM_CCER_CC1E | TIM_CCER_CC2E);
- // Захват с соответствующих выводов: 0b01
- TIM4->CCMR1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S);
- TIM4->CCMR1 |= (TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0);
- // Включить каналы
- TIM4->CCER |= (TIM_CCER_CC1E | TIM_CCER_CC2E);
- // Сбросим счтчик
- TIM4->CNT = 0;
- // Включить таймер, энкодер теперь опрашивается
- TIM4->CR1 |= TIM_CR1_CEN;
- }
- // Посмотреть относительное перемещение (по сравнению с прошлым вызовом)
- int16_t enc_GetRelativeMove(void)
- {
- // Для хранения предыдущего значения счтчика
- static uint16_t CNT_last = 0;
- // Текущее значение, чтоб только один раз было запрошено
- uint16_t CNT_now = TIM4->CNT;
- // Посчитаем перемещение
- int16_t CNT_diff = (int16_t)(CNT_now - CNT_last);
- // Сохраним текущее значение как предыдущее
- CNT_last = CNT_now;
- // Вернм перемещение
- return CNT_diff;
- }
- // Посмотреть положение энкодера
- int16_t enc_GetPosition(void)
- {
- return (int16_t)TIM4->CNT;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement