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

Encoder на TIM3 на STM32F072RBT6

Теряю уже третий день над подключением энкодера к 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
}
 

post-29246-1481116531_thumb.png

post-29246-1481116593_thumb.png

Изменено пользователем haker_fox
Уточнил название темы, добавил теги, переместил в нужный раздел.

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


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

Я видел эту статью, я использую 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;
}
}

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

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


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

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

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

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

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

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

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

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

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

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