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

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

seyityildirim

Merhaba arkadaşlar,

ADC yi Timer ile tetikliyorum


 ADC_InitTypeDef ADC_InitStructure
;

  
ADC_InitStructure.ADC_ResolutionADC_Resolution_12b;
	
	
	
	
	
// 12 Bit Adc çözünürlügü
  
ADC_InitStructure.ADC_ScanConvModDISABLE;
	
	
	
	
	
	
	
// Tarama modu kapali
  
ADC_InitStructure.ADC_ContinuousConvModeENABLE;
	
	
	
	
	
	
// 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(ADC1ADC_Channel_101ADC_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(TIM3TIM_TRGOSource_Update);
TIM_Cmd(TIM3ENABLE);
	

}



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, 20: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, 03: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__);
  }