STM32F103 Maksimum enkoder frekansı hakkında

Başlatan kaftaraco, 03 Mayıs 2018, 22:13:06

kaftaraco

   Arkadaşlar merhaba size bir sorum olacak STM32F103 te maksimum okuyabileceğim enkoder frekansı nedir? Timer4  encoder girişi olarak ayarladığımda 2Khz den daha fazla bir frekanslı encoder palslerini okuyamıyorum

Erol YILMAZ

Sinyalinizin mcu ya ulasan seklini skopla kontrol edermisiniz?

Tagli

2 kHz'in sorun çıkarmaması lazım. Ben counter modunda 300 kHz civarına sorunsuz çıkmıştım. Bence MHz mertebesine de erişebiliyor olmalı. Allegro'nın da dediği gibi, giren sinyale bir bakmakta fayda var.

Bu arada gözlemin nedir tam olarak? Yani TIM4 hiç mi çalışmıyor, yoksa okuduğu değer mi az? TIM4'ü ne şekilde kuruyorsun? O kısmın kodunu eklersen iyi olur.
Gökçe Tağlıoğlu

Mucit23

Encoderin A-B ve Z pinleri ile GND arasında Paralel 100pF kondansatör bağlayın. Bu oldukça gerekli

kaftaraco

#4
Encoder sinyallerini opto ile izole ettim. Osilaskop ile baktığımda ise 2Khz sinyalden sonrasında hizlı sayıcımın saymadığını gördüm. Kare dalgalarda herhangi bir bozulma olmuyor Doanım ayarları ile ilgili bir sıkıntı mı var onu anlyamadım
/* TIM4 init function */
static void MX_TIM4_Init(void)
{

  TIM_Encoder_InitTypeDef sConfig;
  TIM_MasterConfigTypeDef sMasterConfig;

  htim4.Instance = TIM4;
  htim4.Init.Prescaler = 0;
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim4.Init.Period = 65535;
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  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(&htim4, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}


void TIM4_IRQHandler(void)
{
  /* USER CODE BEGIN TIM4_IRQn 0 */
	  if (~TIM4->SR & TIM_SR_UIF)
	    return;

	  if ((TIM4->CNT == 65535) && (TIM4->CR1 & TIM_CR1_DIR))
	  {
	    Encoder_Position_Offset += 32769;
	    TIM4->CNT = 32768;
	  }
	  else if ((TIM4->CNT == 0) && (~TIM4->CR1 & TIM_CR1_DIR))
	  {
	    Encoder_Position_Offset -= 32768;
	    TIM4->CNT = 32768;
	  }
	  TIM4->SR = ~TIM_SR_UIF;

  /* USER CODE END TIM4_IRQn 0 */
  HAL_TIM_IRQHandler(&htim4);
  /* USER CODE BEGIN TIM4_IRQn 1 */

  /* USER CODE END TIM4_IRQn 1 */
}

Zoroaster

Alıntı yapılan: Mucit23 - 04 Mayıs 2018, 09:07:02Encoderin A-B ve Z pinleri ile GND arasında Paralel 100pF kondansatör bağlayın. Bu oldukça gerekli

Dokumanlarda bununla ilgili bir dip not gördünmü? Zamanında aynı sorunu ben de yaşadım. Dokümanlarda uyarı da göremeyince aynen dediğin gibi kapasitör ekleyip sorunu çözmüştüm fakat bu durumdan hep rahatsız oldum. TI çiplerde böyle bir kapasite eklentisine gerek kalmıyordu.
Seytan deliginden kacti.

Mucit23

Dokümanlarda böyle açıklama okumadım. Görmedim henüz. Fakat incelediğim şemalarda hep bağlanıyor. Ek olarak STM32 de bende benzer sıkıntı yaşadım. Timer saçma sapan artıyordu. Yanlış sayıyordu yani. Sorunu 100pf kapasite ile çözdüm.

Zoroaster

Bununla ilgili rahatsizlik duyuyorum cunku encoder girislerinde digital filitreler var. Acaba registerleri init ederken bunlari mi secemiyorum diye hala kafamda soru isareti var.

Normalde O filitreler bu tip isler icin ekleniyor.
Seytan deliginden kacti.

kaftaraco

Öncelikle hepimize teşekkür etmek isterim 100pf bir kondansatör takıldığında bu sıkıntı bir nebze çözüm için yeterli olarak gözüküyor. Aynı durum işlemcinin clock girişlerindeki kristalde de açıklıyor eklenmesi gereken kondansatörler. Şu an benim asıl aklımı kurcalayan işlem ben 72 MHz olarak ayarladığı clock time ile maksimum kaç Hz ilk bir sinyal okuyabileceğim bu işlemin bir matematiksel hesabı var mı?
Durumu şöyle açıklayayım 6000d/dak olan motora 4096 pulselik bir enkoder bağladığımda 409.6Khz lik bir sinyal oluyor tabibi bu devrin PID oturma kısmı var rampası ve sayre.

Yabancı kaynaklara da baktım ama bununla ilgili bir şey bulamadım.

Benim öncelikli olarak ilk amacım sistemin matamatiğini oluşturmak

Örneğin PWM kullanacaksan Osilatörüne göre çıkabileceğin maksimum frekans nedir hesabını yapabiliyorsun ve uygulamaya da geçince çok ufak hatalar ile sistemi çalıştırabiliyorsun.

Aynı durum giriş için bu işlemin belirli bir matematiği var mı?

Şimdiden bütün meslektaşlarıma teşekkür ederim