stm32f303 Adc problemi

Başlatan yamak, 14 Nisan 2014, 16:09:29

yamak

stm32f303'de adc yi kullanıyorum.3 kanaldan continuos modda okuma yapıyorum.Sonuçları da dma yardımı ile de bir diziye aktarıyorum.Daha sonra da dışarıdan spi'ile istediğim zamanda adc değerlerinin bulunduğu diziyi okuyorum.Fakat şöyle bir sorunum var.Kanal1 kanal2 yi de etkiliyo.Mesela kanal1 de 3.3 v kanal2 de 0 volt olsun.Kanal1 okuduğumda değer 4095 kanal2 yi okuduğumda değer 1525 çıkıyo.Kanal1deki gerilimi düşürdükçe kanal2 de düşüyor.Bu sorunun sebebi nedir acaba.
Adc init kodları:
void ADCInit(void)
{
		ADC1->CR=0;
		ADC1->CR&=~0x3000000;//ADC VOLTAGE REGULATOR ENABLE
		ADC1->CR|=0x10000000;
		Delay(1);//REGULATOR ACILANA KADAR BEKLE
		ADC1->CR&=~(0x4000000);//ADC CALIBRATION MODE=single ended inputs
		ADC1->CR|=0x80000000;//ADC CALIBRATION START
		while(((ADC1->CR&(0x80000000))>>31)==1);//ADC CALIBRASYON BITENE KADAR BEKLE
		ADC1_2->CCR=2<<8;;//2 SAMPLE ARASI SURE=Tadc*2
		ADC1->CFGR=(1<<13)|(1<<14);//Continuous Mode,Auto Delay Enable
		ADC1->SQR1|=0x03;//3 kanal okunacak
		ADC1->SQR1|=(0x01<<6)|(0x02<<12)|(0x08<<18);//1. oncelikle 1. Kanal okunacak
	  ADC1->CFGR|=0x03;//Dma request enable
	  ADC1_2->CCR|=1<<13;
		ADC1->SMPR1=0;//ADC hizi=19.5 ADC Clock
		ADC1->CR|=1;//ADC Enable

		while(!(ADC1->ISR&(0x01)));//ADC Enable olana kadar bekle
		//ADC1->IER|=1<<2;//ADC Kesmesi aktif.Her bir cevrim bitince kesme olusacak
	//	NVIC_EnableIRQ(ADC1_2_IRQn);
		ADC1->CR|=1<<2;

Dma init kodları:
void DMA_Config(void)
{
	DMA_InitTypeDef DMA_InitStructure;
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
	DMA_Cmd(DMA1_Channel1,DISABLE);
	DMA_DeInit(DMA1_Channel1);
	
	DMA_InitStructure.DMA_PeripheralBaseAddr=	(uint32_t)(&(ADC1->DR));
	DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)&ADC_Val;
	DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;
	DMA_InitStructure.DMA_BufferSize=8;
	DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
	DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
	DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
	DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
	DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
	DMA_InitStructure.DMA_Priority=DMA_Priority_High;
	DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
	DMA_Init(DMA1_Channel1,&DMA_InitStructure);
	DMA_Cmd(DMA1_Channel1,ENABLE);
}

sedronjames

sorunu çözebildiniz mi? nasıl çözdünüz?