Vitaliy_ARM 0 7 декабря, 2016 Опубликовано 7 декабря, 2016 (изменено) · Жалоба Теряю уже третий день над подключением энкодера к STM32F072RBT6. Проект был сгенерирован CubeMX и немного исправлена инициализация таймера 3 для режима энкодера. Энкодер припаян к PC6 и PC7. Импульсы на вход поступают (изменения отображаются в регистре IDR в режиме откладки), но в регистре CNT всегда 0. Я отладчиком записал туда значение 2, но это ни на что не влияет. Только показывает, что все записывается и таймер работает, но не считает импульсы. Подскажите, куда еще копать? Ниже привел код инициализации и дампы регистров таймера и GPIOC. Вот код инициализации Таймера. /* TIM3 init function */ void MX_TIM3_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOC_CLK_ENABLE(); __TIM3_CLK_ENABLE(); /*Configure GPIO pins : ENC0_I_Pin ENC0_Q_Pin */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; GPIO_InitStruct.Alternate = GPIO_AF1_TIM3; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); htim3.Instance = TIM3; htim3.Init.Prescaler = 0; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 0xFFFF; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; encoder.EncoderMode = TIM_ENCODERMODE_TI12; encoder.IC1Filter = 0x0f; encoder.IC1Polarity = TIM_INPUTCHANNELPOLARITY_RISING; encoder.IC1Prescaler = TIM_ICPSC_DIV4; encoder.IC1Selection = TIM_ICSELECTION_DIRECTTI; encoder.IC2Filter = 0x0f; encoder.IC2Polarity = TIM_INPUTCHANNELPOLARITY_FALLING; encoder.IC2Prescaler = TIM_ICPSC_DIV4; encoder.IC2Selection = TIM_ICSELECTION_DIRECTTI; HAL_TIM_Encoder_Init(&htim3, &encoder); HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_1); TIM3->CR1 = 1; // Enable the counter } Изменено 29 ноября, 2022 пользователем haker_fox Уточнил название темы, добавил теги, переместил в нужный раздел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 8 декабря, 2016 Опубликовано 8 декабря, 2016 · Жалоба Может это поможет http://electronix.ru/forum/index.php?showt...=134984&hl= Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 12 декабря, 2016 Опубликовано 12 декабря, 2016 (изменено) · Жалоба Может это поможет http://electronix.ru/forum/index.php?showt...=134984&hl= Я видел эту статью, я использую HAL и проект был сгенерирован при помощи CubeMX. Перечитал интернет и вроде бы все сделано правильно, но таймер не хочет считать ... До сих пор не работает. Временно сделал через poling, так все работает. В таком случае обычно спасает сравнение дамба регистров таймера с рабочим проектом. Если у кого-то работает таймер в режиме энкодера, можете ли вы дать дамп на регистры таймера и GPIO? void opticEnc::exe() { nextState = readPins(); switch(state) { case 0: if(nextState == 0x1) { val++; state = nextState; } else if(nextState == 0x2) { val--; state = nextState; } break; case 1: if(nextState == 0x3) { val++; state = nextState; } else if(nextState == 0x0) { val--; state = nextState; } break; case 2: if(nextState == 0x0) { val++; state = nextState; } else if(nextState == 0x3) { val--; state = nextState; } break; case 3: if(nextState == 0x2) { val++; state = nextState; } else if(nextState == 0x1) { val--; state = nextState; } break; default: break; } } Изменено 13 декабря, 2016 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться