STM32103C8T6 Capture Sorunu ?

Başlatan eeburakdemir, 24 Eylül 2017, 15:35:40

eeburakdemir

Merhaba,
STM32103 ile capture ile frekans ölçümü yapıyorum. Giriş sinyalim 1KHz altına düştüğünde okuduğum değer çok farklı oluyor.  1KHz den 15KHz e kadar sorunsuz ölçüyorum. Gözden kaçırdığım kısım neresidir acaba ? Daha düşük frekansları da ölçmek istediğim için merak ettiğim kısım nerede hata yaptığım.
Not ! : 15 KHz yukarısı denenmemiştir.

GPIO_Init
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure);


TIM3-CH4_Init
    NVIC_InitTypeDef NVIC_InitStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;

    /* Enable the TIM3 global Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0x0;

    TIM_ICInit(TIM3, &TIM_ICInitStructure);

    /* TIM enable counter */
    TIM_Cmd(TIM3, ENABLE);

    /* Enable the CC2 Interrupt Request */
    TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);


TIM3_IRQHandler
  if(TIM_GetITStatus(TIM3, TIM_IT_CC4) == SET)
  {
    /* Clear TIM3 Capture compare interrupt pending bit */
    TIM_ClearITPendingBit(TIM3, TIM_IT_CC4);
    if(CaptureNumber == 0)
    {
      /* Get the Input Capture value */
      IC3ReadValue1 = TIM_GetCapture4(TIM3);
      CaptureNumber = 1;
    }
    else if(CaptureNumber == 1)
    {
      /* Get the Input Capture value */
      IC3ReadValue2 = TIM_GetCapture4(TIM3);

      /* Capture computation */
      if (IC3ReadValue2 > IC3ReadValue1)
      {
        Capture = (IC3ReadValue2 - IC3ReadValue1);
      }
      else
      {
        Capture = (uint32_t)((0xFFFF - IC3ReadValue1) + IC3ReadValue2);
      }
      /* Frequency computation */
      TIM3Freq = (uint32_t) SystemCoreClock / Capture;
      CaptureNumber = 0;
    }
  }
Asla pes etme...

Klein

TimeBase ayarlarınızı göremedim.
Timer ön bölücünüzün değeri nedir? Eğer bölücü değeri 1 ise  1Khz altında timer taşabilir.

eeburakdemir

@Klein Hocam o kısmı unutmuşum şimdi düzenledim kodlarım şu şekilde
void TIM3_Config(void)
{
    TIM_ICInitTypeDef   TIM_ICInitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    NVIC_InitTypeDef    NVIC_InitStructure;

    NVIC_InitStructure.NVIC_IRQChannel                      = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority    = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority           = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd                   = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    TIM_TimeBaseStructure.TIM_Period        = 7199;
    TIM_TimeBaseStructure.TIM_Prescaler     = 1;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

    TIM_ICInitStructure.TIM_Channel     = TIM_Channel_4;
    TIM_ICInitStructure.TIM_ICPolarity  = TIM_ICPolarity_Rising;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter    = 0;
    TIM_ICInit(TIM3, &TIM_ICInitStructure);
    TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE);

    TIM_Cmd(TIM3, ENABLE);
}
Asla pes etme...

Klein

Prescaler 1 olduğu için timer taşıyor.
Timer 72MHz'de çalışıyor.  Saniyede 72M sayıyor.
1Khz periyodu 1ms.  1ms içinde timet 72000 kez sayar.
Timer 16 bit.  65536  olunca taşar.

Prescaler değerini yükseltin ya da 32bit (TIM1)  timer kullanın.

Zoroaster

Ya da taşmaları bir yerde sayın.
Seytan deliginden kacti.

eeburakdemir

Hocam teşekkür ederim @Klein deneyince sonuçtan haberdar ederim. :) @Zoroaster hocam o yöntem daha bi değişik oldu , onu da denemeye calisirim :)
Asla pes etme...