LPC1768 ADC Hızı

Başlatan yamak, 04 Ekim 2011, 13:22:16

yamak

Merhaba arkadaşlar lpc1768 adc hızının kaç sps olduğunu bilen var mı? Benim ölçümümde saniyede 187500 örnek alabildim acaba en fazla bu kadar mı örnek alınabiliiyo?Bu arada adc hızım 12.5 mhz idi.

GreeN

Terörü Lanetliyoruz.

-Hasan-

Alıntı yapılan: gerbay - 04 Ekim 2011, 14:11:41
DMA kullanmıyorsanız bir de DMA kullanarak deneyin

Hocam nedir bu DMA? ne işe yarar?

yamak

Acilimi direct memory access. Yani bellege direkt olarak erisime  yariyo. Mesela adc olcumunden alina sonucu control unitesine hic ugramadan okunabiliyo. Bu da programin calismasini hizlandiriyo. Genelde sinyal isleme gibi uygulamalarda fazla kullaniyo.

z

ADC continuous run modunda çalışmıyorsa hızınızı düşüren faktör ADC ye start veren kod ile sonuçları okuyan kod parçacıkları olacaktır.
Varsa FIFO'lardan yararlanarak okuma süresini kaldırabilirsiniz fakat start etme işleminden zaman kaybediyor olabilirsiniz.

 
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Alıntı YapADC continuous run modunda çalışmıyorsa hızınızı düşüren faktör ADC ye start veren kod ile sonuçları okuyan kod parçacıkları olacaktır.
Varsa FIFO'lardan yararlanarak okuma süresini kaldırabilirsiniz fakat start etme işleminden zaman kaybediyor olabilirsiniz.
Hocam adc nin kendine ait fifo su yok ama lpc1768 gpdma sı adc birimi destekliyo.Dma kullanabilirim.

z

Dene tabiki. Ben ADC ile ilgili kodlarini merak ettim. Beli sorunun kaynagi orasidir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

#7
Hocam kodlar bunlar:
#include <lpc17xx.h>
#include "lpc_glcd.h"
#include <stdio.h>
#include <yusuf_lpc17xx_delay.h>
uint32_t sonuc,i=0,j=0,k;
unsigned char f[]=" ";
uint32_t g[3000];
uint32_t sonuc_al(void);
void pll_hazirla(void)
{

    LPC_SC->SCS=0x20;
	LPC_SC->CLKSRCSEL=0x01;
	LPC_SC->CCLKCFG=0x02;
	LPC_SC->PLL0CON=0x01;
	LPC_SC->PLL0CFG=0xb;
	LPC_SC->PLL0FEED=0xAA;
    LPC_SC->PLL0FEED=0x55;
	while(!(LPC_SC->PLL0STAT&(1<<26)));
	LPC_SC->PLL0CON=0x07;
	LPC_SC->PLL0FEED=0xAA;
    LPC_SC->PLL0FEED=0x55;
	LPC_SC->PCLKSEL0=0;
}
void adc_init(void)
{
	LPC_PINCON->PINSEL3 &= ~(3UL<<30);
	LPC_PINCON->PINSEL3 |=(3UL<<30);
	LPC_PINCON->PINMODE3=2;
	LPC_SC->PCONP |=1<<12;
	LPC_ADC->ADCR=1<<5|1<<8|1<<21;
	
}
uint32_t adc_hesapla(void)
{
	while(!(LPC_ADC->ADDR5&(1UL<<31)));
	  j++;
	sonuc=LPC_ADC->ADDR5;
	return((sonuc>>4)&0xFFF);
}
void adc_start(void)
{
	LPC_ADC->ADCR |=(1<<16);
}
void adc_stop(void)
{
	LPC_ADC->ADCR &=~(1<<16);
}
uint32_t sonuc_al(void)
{
	uint32_t i,hesap,kusurat,tam;
	adc_start();
	hesap =adc_hesapla();
	adc_stop();
	hesap=((hesap*3300)/(4096));

	return(hesap);
}
void TIMER1_IRQHandler(void)
{
  	int k=0;
	LPC_TIM1->IR=0xFF;
	LPC_TIM1->TCR=0;
	sprintf(f,"%d\n\r",i);
	send_string_uart0(f);
	DelayMs(0,1000);
	for(k=0;k<=i;k++)
	{
  	sprintf(f,"%d->%d \n\r",k,g[k]);
	send_string_uart0(f);
	}
}
void timer_init(void)
{
	LPC_TIM1->TCR=0x02;//reset timer
    LPC_TIM1->IR=0xFF;//tüm kesmeleri restle
    LPC_TIM1->MR1=10*24000;
    LPC_TIM1->MCR=24;
    LPC_TIM1->TCR=0x01;//start timer
    LPC_TIM1->PR=0x00;//prescalar deger.Örnegin 2 oldugun her 3 tick de bir sayar.
	NVIC_EnableIRQ(TIMER1_IRQn);
}
int main(void)
{
    pll_hazirla();
   	LPC_GPIO2->FIODIR=0XFF;
	LPC_GPIO2->FIOCLR=0XFF;
	adc_init();
	glcd_init();
	uart0_init();
	timer_init();
	i=0;
	while (1)
	{
	 i++;
	 g[i]=sonuc_al(); 
	}

}

z

#8
Sen ADCyi baslatiyor ardindan durduruyor veri uzerinde islem yapiyor ve sonucu rama tasiyorsun tekrar ADC yi baslatiyorsun.
Uretici firma reklam amacli max hizdan bahsederken boyle yapmaz.

Cipini hic tanimiyorum fakat, ADC hizini anlamak icin  Burst bitini set eder ve bir daha dokunmazdim. ADC Kanallari sira ile olcerdi. Ancak bu modda en buyuk donusum hizina cikabilirsin. (Zaten senin bulacagin deger de clklar duzgun set edildi ise 13Mhz icin cevrim hizi 200khz olacaktir)

-----------

Kodunu detayli incelemedim ama i nin alip basini gitmesini engelleyen bir kontrol yok gibi.

i=0;
while (1)
{
i++;
g =sonuc_al();
}

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

yamak

Hocam cevabınız için teşekkür ederim. Program 10 ms saniye boyunca çalışıp sonra timer kesmesi içinde verileri uarttan gönderiyo ve timerı kapatıyorum bu yüzden ben sadece 10 ms de ölçtügü değerleri görüyorum.Bu arada zaten şimdilik bu hız benim için fazlasıyla yeterli.Yapmak istediğim şey ses sinyalini örneklemekti.Zaten ses için saniye de yaklaşık 10000 örnek alsam da yeterli.Sadece merak ettiğim için bi deneyeyim dedim.