Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Stm32f4 ADC DMA sorunu

Başlatan seyityildirim, 11 Ocak 2017, 15:05:22

seyityildirim

Merhaba arkadaşlar 4 kanal ADC okumaya çalışıyorum. Önce yazdığım kodu vereyim.
#include "stm32f4xx.h"                  // Device header


volatile  double ADC3ConvertedValue[4] = {0,0,0,0}; //Stores converted vals
volatile	double deger1;
volatile	double deger2;
volatile	double deger3;
volatile	double deger4;
	

	
	ADC_InitTypeDef       ADC_InitStruct;
	ADC_CommonInitTypeDef ADC_CommonInitStruct;
	DMA_InitTypeDef       DMA_InitStruct;
	GPIO_InitTypeDef      GPIO_InitStruct;

int main(void)
{
	SystemInit();

	/* Enable ADC3, DMA2 and GPIO clocks ****************************************/
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);//ADC3 is connected to the APB2 peripheral bus

	/* DMA2 Stream0 channel2 configuration **************************************/
	DMA_InitStruct.DMA_Channel            = DMA_Channel_2;
	DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&ADC3->DR;//ADC3's data register
	DMA_InitStruct.DMA_Memory0BaseAddr    = (uint32_t)&ADC3ConvertedValue;
	DMA_InitStruct.DMA_DIR                = DMA_DIR_PeripheralToMemory;
	DMA_InitStruct.DMA_BufferSize         = 4;
	DMA_InitStruct.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
	DMA_InitStruct.DMA_MemoryInc          = DMA_MemoryInc_Enable;
	DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//Reads 16 bit values
	DMA_InitStruct.DMA_MemoryDataSize     = DMA_MemoryDataSize_HalfWord;//Stores 16 bit values
	DMA_InitStruct.DMA_Mode               = DMA_Mode_Circular;
	DMA_InitStruct.DMA_Priority           = DMA_Priority_High;
	DMA_InitStruct.DMA_FIFOMode           = DMA_FIFOMode_Disable;
	DMA_InitStruct.DMA_FIFOThreshold      = DMA_FIFOThreshold_HalfFull;
	DMA_InitStruct.DMA_MemoryBurst        = DMA_MemoryBurst_Single;
	DMA_InitStruct.DMA_PeripheralBurst    = DMA_PeripheralBurst_Single;
	DMA_Init(DMA2_Stream0, &DMA_InitStruct);
	DMA_Cmd(DMA2_Stream0, ENABLE);

	/* Configure GPIO pins ******************************************************/
	GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;// PC0, PC1, PC2, PC3
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;//The pins are configured in analog mode
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;//We don't need any pull up or pull down
	GPIO_Init(GPIOA, &GPIO_InitStruct);//Initialize GPIOC pins with the configuration
	
	

	/* ADC Common Init **********************************************************/
	ADC_CommonInitStruct.ADC_Mode             = ADC_Mode_Independent;
	ADC_CommonInitStruct.ADC_Prescaler        = ADC_Prescaler_Div2;
	ADC_CommonInitStruct.ADC_DMAAccessMode    = ADC_DMAAccessMode_Disabled;
	ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
	ADC_CommonInit(&ADC_CommonInitStruct);

	/* ADC3 Init ****************************************************************/
	ADC_DeInit();
	ADC_InitStruct.ADC_Resolution           = ADC_Resolution_12b;//Input voltage is converted into a 12bit int (max 4095)
	ADC_InitStruct.ADC_ScanConvMode         = ENABLE;//The scan is configured in multiple channels
	ADC_InitStruct.ADC_ContinuousConvMode   = ENABLE;//Continuous conversion: input signal is sampled more than once
	ADC_InitStruct.ADC_ExternalTrigConv     = 0;
	ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
	ADC_InitStruct.ADC_DataAlign            = ADC_DataAlign_Right;//Data converted will be shifted to right
	ADC_InitStruct.ADC_NbrOfConversion      = 4;
	ADC_Init(ADC3, &ADC_InitStruct);//Initialize ADC with the configuration

	/* Select the channels to be read from **************************************/
	ADC_RegularChannelConfig(ADC3, ADC_Channel_10, 1, ADC_SampleTime_56Cycles);//PC0
	ADC_RegularChannelConfig(ADC3, ADC_Channel_11, 2, ADC_SampleTime_56Cycles);//PC1
	ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 3, ADC_SampleTime_56Cycles);//PC2
	ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 4, ADC_SampleTime_56Cycles);//PC3


	/* Enable DMA request after last transfer (Single-ADC mode) */
	ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);

	/* Enable ADC3 DMA */
	ADC_DMACmd(ADC3, ENABLE);

	/* Enable ADC3 */
	ADC_Cmd(ADC3, ENABLE);

	/* Start ADC3 Software Conversion */
	ADC_SoftwareStartConv(ADC3);


	while(1)
	{
			deger1=ADC3ConvertedValue[0];
			deger2=ADC3ConvertedValue[1];
			deger3=ADC3ConvertedValue[2];
			deger4=ADC3ConvertedValue[3];
			}

}


Sorunum şu : 4 adet pot değerini ölçmeye çalışıyorum. Potların hepsinde 1V-1,5V arasında gerilimler var. Bu 4 ADC değerini Debug yaparak Watch1 penceresinde görüntülemeye çalışıyorum. Sadece değer1 değişkeninde değerler değişiyor diğerleri hep 0 gösteriyor. Hiç değişmiyor. değer1 de anlamsız değerler gösteriyor. Öyleki potun değerini değiştirmem de bi fayda sağlamıyor. hatta Adc pinlerine giden kabloları çıkarsam da değer1 yine saçma değerler gösterirken diğerleri hep 0 gösteriyor.
Yardımcı olursanız sevinirim. 

seyityildirim

Sorunu bilen arkadaşlar var mı ?

Bertan

Adc değerlerini sakladığınız "ADC3ConvertedValue" dizisinin türünü "uint16_t" yapmayı dener misiniz.

DMA de "DMA_MemoryDataSize" 16 bit olarak ayarlanmış. Double veri hem 64 bitlik hemde floting point tipinde bir sayı. Bu yüzden veriler sadece "ADC3ConvertedValue" dizisinin 1. elemanında depolanıyor. Ayrıca Adc den okunan veriler "uint16_t" tipinde, bu verileri direkt floting point sayıya dönüştüremezsiniz. İlk önce verileri uint16_t tipinde bir diziye kaydedin, daha sonra double tipinde bir değişkene atayın.

seyityildirim

@bertan88 denedim oldu. Çok teşekkürler. Allah razı olsun