Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: f15eagle - 24 Haziran 2016, 15:32:14

Başlık: Ynt: Hal Kütüphanesi İle Enkoder
Gönderen: f15eagle - 24 Haziran 2016, 15:32:14
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 (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();
  }

}


Başlık: Ynt: Ynt: Hal Kütüphanesi İle Enkoder
Gönderen: magnetron - 24 Haziran 2016, 18:28:12
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
Başlık: Ynt: Hal Kütüphanesi İle Enkoder
Gönderen: f15eagle - 29 Haziran 2016, 09:23:05
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.