ADC ayarlanan örnekleme frekansı ile çalışmıyor ?

Başlatan seyityildirim, 24 Şubat 2017, 12:39:15

seyityildirim

Merhaba arkadaşlar,

ADC yi Timer ile tetikliyorum
ADC_InitTypeDef ADC_InitStructure;

  ADC_InitStructure.ADC_Resolution= ADC_Resolution_12b;					// 12 Bit Adc çözünürlügü
  ADC_InitStructure.ADC_ScanConvMod= DISABLE;							// Tarama modu kapali
  ADC_InitStructure.ADC_ContinuousConvMode= ENABLE;						// Sürekli çevrim modu açik
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;// Timer3 yükselen kenar tetigi	
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;		// Timer 3 ile tetiklenecek
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;					// Datalar saga dayali biçimde dizilecek
  ADC_InitStructure.ADC_NbrOfConversion  = 1;        							// Adc1'de 1 adet kanal kullanilacak
  ADC_Init(ADC1, &ADC_InitStructure);

  /* ADC1 regular channels 10 configuration */ 
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);			// Örnekleme süresi de belirtildi


Tİmer 10 KHz

static void TIM3_Config(void)
{

	TIM_TimeBaseInitTypeDef TIM_BaseStruct;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,  ENABLE);

	/*

    
    timer_tick_frequency = Timer_default_frequency / (prescaller_set + 1)        

    timer_tick_frequency = 84000000 / (0 + 1) = 84000000

    TIM_Period = 84000000 / 10000 - 1 = 8399

  */

TIM_BaseStruct.TIM_Prescaler           = 0;
TIM_BaseStruct.TIM_CounterMode    = TIM_CounterMode_Up;
TIM_BaseStruct.TIM_Period               = 8399; /* 10kHz */
TIM_BaseStruct.TIM_ClockDivision    = TIM_CKD_DIV1;
TIM_BaseStruct.TIM_RepetitionCounter = 0;
	
TIM_TimeBaseInit(TIM3, &TIM_BaseStruct);
		
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
TIM_Cmd(TIM3, ENABLE);
	
}


50 Hz Lik sinyali 10 KHz de örneklersem bir periyotta 200 örnek alırım.

ADC değerlerini tuttuğum 200 boyutlu bir dizim var.

Bu diziyi debug yaparken izliyorum. Sinüs sinyalinin yarım periyodu ancak sığıyor diziye.
 
Timer ayarlarını ne kadar değiştirsem de bir türlü bir periyodu örnekleyemedim.

Timer ın 10 KHz de çalıştığını eminim. Çünkü aynı timer kodunu osiloskopta görüntülemiştim .

Sanki timer ile adc arasında bir pislik var gibi.  Ama sorunu anlayamadım.

Yardımlarınız için teşekkürler.

Not: Kodları buraya yazınca sağa sola kayıyor. çirkin bir görüntü oluyor.

okg

adc örneklemesi 3 cycle da oldugundan bir problem olabilir mi?
KTU Elektronik Haberleşme - YTÜ Haberşelme YL - GTU Haberleşme YL

magnetron

işlemci hangisi ?

bir de clockdivision 0 olması gerekmez mi ?

seyityildirim

Alıntı yapılan: magnetron - 26 Şubat 2017, 17:09:37
işlemci hangisi ?

bir de clockdivision 0 olması gerekmez mi ?
clockdivision 0 tanımlı değil. 1 e bölmeniz demek zaten sinyalin kendisini almak demek.

Stm32f4 discovery kartı kullanıyorum.


Alıntı yapılan: okg - 26 Şubat 2017, 00:26:32
adc örneklemesi 3 cycle da oldugundan bir problem olabilir mi?

Adc örneklemesi 3 cycle demek adc çevriminin 3 cycle da bitmesi demek. Başlayacağı süreyi timer belirliyor.

Ben bir yerde hata buldum sonradan. Yakın zamanda deneyeceğim. Bakalım olacak mı

seyityildirim

Tekrar Merhaba arkadaşlar,

Yukarıda bahsettiğim sorunun çözümünü buldum.

Adc eğer timer ile tetiklenecekse Adc ayarındaki sürekli çevrimin aşağıdaki gibi kapalı olması gerekiyor.
  ADC_InitStructure.ADC_ContinuousConvMode   = DISABLE;

Eğer sürekli çevrim olursa timer'ı dinlemiyor kendi ADC frekansında çalışıyor. Bu satırı düzelttikten sonra gayet güzel çalıştı.

neccarzade

Merhabalar,

Konu daha önceden açıldığından tekrardan yeni başlık açmadan buradan sormak istedim.
12 adet ADC kanalından okuduğum dataları 20ms'de 400 örnek alacak şekilde dma + adc + timer ile yapmak istiyorum. Ayarlarımda herhangi bir sorun yok çünkü 20ms'de 200 örnek almakta herhangi bir sorun yaşamıyorum. Ne kadar hızlı timer trigger yapsam da en fazla 54us'nin altına inemiyorum. Bu kadar çok datayı aynı anda almak için zaman mı yetersiz kalıyor acaba?

adc ayar kısmı aşağıdaki gibidir.
hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = ENABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T2_TRGO;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 12;
  hadc1.Init.DMAContinuousRequests = ENABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
 sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }