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.
adc örneklemesi 3 cycle da oldugundan bir problem olabilir mi?
işlemci hangisi ?
bir de clockdivision 0 olması gerekmez mi ?
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ı
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ı.
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__);
}