Тема изъезженная, но все же даже поиск по форуму не дал ответа...до этого все откладывал работу с энкодером, а теперь вот пришлось, давно с ними мучаюсь - самая главная проблема - дребезг, а если еще и частотник рядом фонит, вообще беда. Видел поведение даже на готовых приборах, когда например на дельтовских контролерах подаешь на один из входов "джиттер" (дребезг, меандр), а он берет и считает, а по идее интерфейс должен работать с самозащитой и не пропускать такое. По идее читая документацию на STM32 даже табличку такую видел, есть сигнал на входе измеряемом - считаем вверх при переднем фронте, и вниз при заднем, соответственно меняем направление счета только если между фронтами сменился сигнал на втором. Но вот то ли я не пойму, как настроить таймер, то ли чего, но вот считает он у меня по одному входу свободно вниз и все, а по идее должен "дрожжать" около одного значения, я ведь не с настоящим энкодером экспериментирую, один из входов меняю, второй нет. По идее режим, когда счет и по фронтам и по спадам да на обоих входах счетных не имеет защиты, хотя опять же читаю RM вижу волшебные графики типа Figure 93 и не особо верю, если конечно там не реализована защитная логика проверки прихода фронта с одного и только тогда зачитывается фронт на другом, а если спад пришел без смены на втором, значит не прибавляем а вычитаем, короче лишняя логика, которую должно что-то обрабатывать, а это сильно усложняет устройство. и сомневаюсь, что это реализовано. Еще не почему таймер загружает в CNT регистр ARR, по идее таймер без интерфейса энкодера считает с нуля и до ARR, а тут какая-то лажа, считает по одному входу и только вниз, хотя вроде как настройки UD/DOWN. Пробовал два варианта, может кто что подскажет?
вот код инициализации, сам код опроса прост как тапок - читаем TIM2->CNT:
Код: Выделить всё
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// Заполняем настройки по дефолту
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
// Clock prescaler 72M/1 Запускаем таймер на тактовой частоте 72 MHz
TIM_TimeBaseStructure.TIM_Prescaler= 1;
// Частоту дополнительно не делим TIM_CKD_DIV1=0
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
// Считаем вверх и вниз
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down | TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = 65536;
// Инициализируем TIM3
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// Clear overflow interrupt flag
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_ClearFlag(TIM3, TIM_FLAG_CC1);
// Disable interrupt for Update Event
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
TIM_ITConfig(TIM3,TIM_IT_CC1,DISABLE);
/* Считать будем все переходы лог. уровня с обоих каналов */
//TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge, TIM_ICPolarity_BothEdge);
TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI1, TIM_ICPolarity_BothEdge, TIM_ICPolarity_BothEdge);
TIM_Cmd(TIM3, ENABLE);
Интересует оба режима: двойной счет, когда как пишут в RM счет идет по одному сигналу и по фронтам и по спадам, и четверной, когда по обоим сигналам и по фронтам и спадам, интересует, как прошел опыт подачи меандра на один вход без изменения второго на обоих режимах (был ли счет или просто дребезг в районе одного значения, в оба ли направления счет).