Advertisement
teplofizik

encoder.c

Apr 3rd, 2013
1,126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.67 KB | None | 0 0
  1. //
  2. // encoder.c
  3. //
  4.  
  5. #include "encoder.h"
  6. #include <stm32f4xx.h>
  7.  
  8. // Энкодер цепляется на выводы PB6/PB7
  9.  
  10. void enc_Init(void)
  11. {
  12.     // Включить тактирование порта GPIOB
  13.     RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN;
  14.    
  15.     // Включить тактирование модуля TIM4
  16.     RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
  17.    
  18.     // Номер альтернативной функции: 2
  19.     GPIOB->AFR[0] &= ~((0x0FUL << (6 * 4)) | (0x0FUL << (7 * 4))); // 6, 7 очистим
  20.     GPIOB->AFR[0] |=  (0x02UL << (6 * 4)) | (0x02UL << (7 * 4)); // В 6, 7 запишем 2
  21.    
  22.     // Режим: альтернативная функция
  23.     GPIOB->MODER &= ~((0x03UL << (6 * 2)) | (0x03UL << (7 * 2)));  // 6, 7 очистим
  24.     GPIOB->MODER |=  (0x02UL << (6 * 2)) | (0x02UL << (7 * 2));  // В 6, 7 запишем 2
  25.    
  26.     // Используем все 16 бит, что уж тут
  27.     TIM4->ARR = 0xFFFF;
  28.    
  29.     // Предделитель: 1
  30.     TIM4->PSC = 0;
  31.    
  32.     // Режим: Экнкодер 0b001, счт по первому сигналу только
  33.     TIM4->SMCR &= ~(TIM_SMCR_SMS);
  34.     TIM4->SMCR |= (TIM_SMCR_SMS_0);
  35.    
  36.     // Выключить каналы в любом случае
  37.     TIM4->CCER &= ~(TIM_CCER_CC1E | TIM_CCER_CC2E);
  38.    
  39.     // Захват с соответствующих выводов: 0b01
  40.     TIM4->CCMR1 &= ~(TIM_CCMR1_CC1S | TIM_CCMR1_CC2S);
  41.     TIM4->CCMR1 |= (TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0);
  42.    
  43.     // Включить каналы
  44.     TIM4->CCER |= (TIM_CCER_CC1E | TIM_CCER_CC2E);
  45.    
  46.     // Сбросим счтчик
  47.     TIM4->CNT = 0;
  48.    
  49.     // Включить таймер, энкодер теперь опрашивается
  50.     TIM4->CR1 |= TIM_CR1_CEN;
  51. }
  52.  
  53. // Посмотреть относительное перемещение (по сравнению с прошлым вызовом)
  54. int16_t enc_GetRelativeMove(void)
  55. {
  56.     // Для хранения предыдущего значения счтчика
  57.     static uint16_t CNT_last = 0;
  58.    
  59.     // Текущее значение, чтоб только один раз было запрошено
  60.     uint16_t CNT_now = TIM4->CNT;
  61.    
  62.     // Посчитаем перемещение
  63.     int16_t  CNT_diff = (int16_t)(CNT_now - CNT_last);
  64.    
  65.     // Сохраним текущее значение как предыдущее
  66.     CNT_last = CNT_now;
  67.    
  68.     // Вернм перемещение
  69.     return CNT_diff;
  70. }
  71.  
  72. // Посмотреть положение энкодера
  73. int16_t enc_GetPosition(void)
  74. {
  75.     return (int16_t)TIM4->CNT;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement