Перейти к содержанию
    

Вопрос по настройке работы с энкодером на STM32F407

Здравствуйте все.

1. В регистре TIMx_SMCR если в выборе режима SMS установлено значение 001 то счетчик считает верх\вниз по фронту TI2FP1, в зависимости от уровня на TI1FP2. Т.е. это означает, что один вход у нас как STEP, а другой как DIR ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да. Если судить по этому документу AN4013, то изменение в регистре счета будет по переднему и заднему фронту TI1. А бит DIR будет зависеть от уровня сигнала TI2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня энкодер работает следующим образом:

    // TIM3 SMCR -> SMS = 011
    // TIM3 CCER -> CC1P + CC2P
    TIM3->ARR = 402;
    TIM3->SMCR = (TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0);
    TIM3->CCER = (TIM_CCER_CC2P | TIM_CCER_CC1P);
    TIM3->CNT = 200;
    TIM3->CR1 = TIM_CR1_CEN;
	    EncVal = (TIM3->CNT >> 2);
	<...>
	    if (EncVal != (TIM3->CNT >> 2)) {
        if (EncVal < (TIM3->CNT >> 2)) {
            OnKeyDown(9); // ENC-
        } else {
            OnKeyDown(10); // ENC+
        };
        EncVal = (TIM3->CNT >> 2);
    };
	

В общем, мне попались энкодеры, которые за один клик дают фактически два импульса (фронт на первом канале и спад на втором). С одной стороны - хорошо, с другой - интересная особенность. Потому значение делится на два. Случай переполнения цинично игнорируется (код тестовый).

Изменено пользователем AlanDrakes

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Долго ломал голову почему энкодер выдает 2 тика на щелчок. Нашлись люди добрые, объяснили.

Есть энкодеры EC11 и E12 (мне попадались). Так вот, один из них выдает 2 тика на щелчок, другой тип - 1 тик на щелчок.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в своё время чтоб не мучаться и не гадать какой энкодер воткнут в систему прописал все случаи. пользователь выбирает свой и доволен жизнью.

void ENC_SetEncoderMode(uint32_t enc_num, uint32_t enc_mode)
{
    TIM_TypeDef * TIMx;
    //TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    
    switch (enc_num)
    {
        case ENC1: TIMx = TIM2; break;
        case ENC2: TIMx = ENC2_TIMER; break;
        case ENC3: TIMx = ENC3_TIMER; break;
    }
    
    TIMx->CR1 &= 0xFFFE;
    
    switch (enc_mode)
    {
        case ENC_MODE_A:
            //ENCA - falling edge
            TIM_TIxExternalClockConfig(TIMx, TIM_TIxExternalCLK1Source_TI1, TIM_ICPolarity_Falling, 0);
            //apply filter
            TIMx->CCMR1 |= TIM_CCMR1_IC1F;
        break;
        
        case ENC_MODE_AX2:
            //ENCA - both edges
            TIM_TIxExternalClockConfig(TIMx, TIM_TIxExternalCLK1Source_TI1, TIM_ICPolarity_BothEdge, 0);
            //apply filter
            TIMx->CCMR1 |= TIM_CCMR1_IC1F;
        break;
        
        case ENC_MODE_B:
            //ENCB - falling 
           TIM_TIxExternalClockConfig(TIMx, TIM_TIxExternalCLK1Source_TI2, TIM_ICPolarity_Falling, 0);
           //apply filter
           TIMx->CCMR1 |= TIM_CCMR1_IC2F;
        break;
        
        case ENC_MODE_BX2:
            //ENCB - both edges
            TIM_TIxExternalClockConfig(TIMx, TIM_TIxExternalCLK1Source_TI2, TIM_ICPolarity_BothEdge, 0);
            //apply filter
            TIMx->CCMR1 |= TIM_CCMR1_IC2F;
        break;
        
        case ENC_MODE_AB_1:
             TIM_EncoderInterfaceConfig(ENC1_TIMER, TIM_EncoderMode_TI1,
                                        TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
         break;
         
         case ENC_MODE_AB_2:
             TIM_EncoderInterfaceConfig(ENC1_TIMER, TIM_EncoderMode_TI2,
                                        TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
         break;
         
         case ENC_MODE_AB_3:
             TIM_EncoderInterfaceConfig(ENC1_TIMER, TIM_EncoderMode_TI12,
                                        TIM_ICPolarity_Falling, TIM_ICPolarity_Falling);
         break;
    }
    
    TIMx->CR1 |= 0x0001;  // enable counting 
   
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...