Ynt: Hal Kütüphanesi İle Enkoder

Başlatan f15eagle, 24 Haziran 2016, 15:32:14

f15eagle

Herkese merhaba,

stm32f429 discovery board + cubemx + Keil ile denemeler yapıyorum.

Amacım tim2 ve tim1'in enkoder modüllerini kullanmak. Temel olarak saydırma işlemlerini yaptım. 0'dan geriye doğru giderken eksiye gitmenin yolunu aradım fakat bulamadım. İkinci takıldığım nokta da enkoderin Z ucu ile sayacı sıfırlamak. Bunun için linkteki reference manueli inceledim.

http://www.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files/DM00031020.pdf/jcr:content/translations/en.DM00031020.pdf

dokümanın 553. sayfasında "The third encoder output which indicate the mechanical zero position, may be connected to an external interrupt input and trigger a counter reset." cümlesini buldum. Burada bahsettiği gibi enkoderi nasıl resetlerim bunu yapmayı bulamadım. Bu noktada ne yapmalıyım yardımcı olur musunuz ?

kodlarım;
main.c
...
 MX_TIM2_Init();
 MX_TIM1_Init();

 HAL_TIM_Encoder_Start(&htim2,TIM_CHANNEL_1);
 HAL_TIM_Encoder_Start(&htim1,TIM_CHANNEL_1);


  while (1)
  {
	tim1_Count = TIM1->CNT;
	tim2_Count = TIM2->CNT;
			
	sprintf(tim1_count_array,"CH1:%0#5d",tim1_Count);
	BSP_LCD_DisplayStringAtLine(3,(uint8_t*)tim1_count_array);
			
	sprintf(tim2_count_array,"CH2:%0#5d",tim2_Count);
	BSP_LCD_DisplayStringAtLine(4,(uint8_t*)tim2_count_array);
  }


timer ayar;
(tim1 ve tim2 aynı sadece period değerleri farklı)
static void MX_TIM1_Init(void)
{

  TIM_Encoder_InitTypeDef sConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 19999;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
  sConfig.IC1Polarity = TIM_ICPOLARITY_FALLING;
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC1Filter = 0;
  sConfig.IC2Polarity = TIM_ICPOLARITY_FALLING;
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC2Filter = 0;
  if (HAL_TIM_Encoder_Init(&htim1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}



magnetron

ingilizcesinde dediği gibi enkoderin Z ucunu
bir GPIO'ya girip onu external interrupt olarak tanımlıycaksın
interrupt rutini içinde de enkoderi bağladığın TIMX->CNT registerini sıfırlayacaksın

f15eagle

magnetron hocam cevabınız için teşekkürler.

İnterrupt ayarlayıp sıfırlama yapılması gerektiğini biliyordum ama register'a ne yazılacak nasıl yazılacak da sıfırlanacak bunu sormak istemiştim.

TIMX->EGR = TIM_EGR_UG;

ifadesini yazınca oldu.