khlenar 5 25 сентября, 2022 Опубликовано 25 сентября, 2022 · Жалоба Здравствуйте все. 1. В регистре TIMx_SMCR если в выборе режима SMS установлено значение 001 то счетчик считает верх\вниз по фронту TI2FP1, в зависимости от уровня на TI1FP2. Т.е. это означает, что один вход у нас как STEP, а другой как DIR ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sverchok 1 6 октября, 2022 Опубликовано 6 октября, 2022 · Жалоба Да. Если судить по этому документу AN4013, то изменение в регистре счета будет по переднему и заднему фронту TI1. А бит DIR будет зависеть от уровня сигнала TI2. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanDrakes 1 7 октября, 2022 Опубликовано 7 октября, 2022 (изменено) · Жалоба У меня энкодер работает следующим образом: // 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); }; В общем, мне попались энкодеры, которые за один клик дают фактически два импульса (фронт на первом канале и спад на втором). С одной стороны - хорошо, с другой - интересная особенность. Потому значение делится на два. Случай переполнения цинично игнорируется (код тестовый). Изменено 7 октября, 2022 пользователем AlanDrakes Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mihlit1 0 10 октября, 2022 Опубликовано 10 октября, 2022 · Жалоба Долго ломал голову почему энкодер выдает 2 тика на щелчок. Нашлись люди добрые, объяснили. Есть энкодеры EC11 и E12 (мне попадались). Так вот, один из них выдает 2 тика на щелчок, другой тип - 1 тик на щелчок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 13 октября, 2022 Опубликовано 13 октября, 2022 · Жалоба в своё время чтоб не мучаться и не гадать какой энкодер воткнут в систему прописал все случаи. пользователь выбирает свой и доволен жизнью. 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться