STM32f4 Hal Adc Multichannel

Başlatan muhittin_kaplan, 06 Ocak 2017, 19:50:26

muhittin_kaplan

Cubemx kullanarak tek kanal okuma yaptim.
Dma kullanmadan  single conv, multichannel (cok kanal tek cevrim) yapamadim.

Nasil yapilir ?

fatal16

Hocam Stm8'lerde aşağıdaki gibi. Stm32'lerde de bu şekilde olabilir.

Alıntı yapılan: fatal16 - 18 Aralık 2016, 16:08:46
channel1 seçin, adc açın, çevrimi başlatın, okuma yapın, adc kapatın,
channel2 seçin, adc açın, çevrimi başlatın, okuma yapın, adc kapatın.
.
.
.

Klein

Çok kanallı okumada DMA kullanmayacaksan, çevrim hızını ve ADC saat hızını iyice düşürmen gerek. Aksi durumda üst üste yazma sorunu ortaya çıkıyor ve ADC hataya düşüyor.
STM32'de DMA'sız Çok kanal ADC okumayı önermem.

muhittin_kaplan

Hocam, iki kanal okuyacagim. Ama yapamadim. Problem hiz felan degil. Birturlu okuyamadim

Klein

#4
Alıntı yapılan: muhittin_kaplan - 07 Ocak 2017, 00:56:46
Hocam, iki kanal okuyacagim. Ama yapamadim. Problem hiz felan degil. Birturlu okuyamadim
Hiç mi okuyamıyorsun?
ilk kanalı bir kez okuyup ondan sonra bir daha okuyamıyor musun?
Şimdi SR registerindeki bitin  adını hatırlamıyorum ama OV yada OVR isimli bir bit olacaktı. Onu bi kontrol et. Override biti.

Hal kütüphanesini pek tanımıyorum ama, init kodlarını yayımlarsan, atladığın bir şey olup olmadığını kontrol etmeye çalışırım.

muhittin_kaplan

hallettim hocam. CubeMx ile hazırldıktan sonra aşağıdaki gibi çözdüm olayı.
  int readADC(char channel){
	  	  int adcTemp=0;
		ADC_ChannelConfTypeDef sConfig;
		sConfig.Channel = channel;
		sConfig.Rank = 1;
		sConfig.SamplingTime = ADC_SAMPLETIME_84CYCLES;
		if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
		{
		  Error_Handler();
		}

		HAL_ADC_Start(&hadc1);
		HAL_ADC_PollForConversion(&hadc1,50);
		adcTemp=(HAL_ADC_GetValue(&hadc1));
		HAL_ADC_Stop(&hadc1);
		return (adcTemp);


  }


  AdcValue1=readADC(ADC_CHANNEL_1);
	  AdcValue2=readADC(ADC_CHANNEL_2);

[/code]

muhittin_kaplan

Aslinda multichannel single conv. Olmuyor sanirim. Cunki her cevrimde tek kanal okuyorum.

Adc modlari nelerdir ? Nerelerde kullanirim ?

Klein

Aslında çok kanalı okuyorsun. Tek tek ama çok kanal.
Yapmak istediğin single conversion, scan mode, multichannel şeklinde okuma mı?
Çevirimi bir kez başlatmak ve  tüm kanallar okunana kadar çevirimi durdurmamak mı istiyorsun?

muhittin_kaplan

aynen hocam, ama bunu dma yada int kullanmadan yapmayı istedim (he mantıklımı belki değil)

http://www.st.com/content/ccc/resource/technical/document/application_note/c4/63/a9/f4/ae/f2/48/5d/CD00258017.pdf/files/CD00258017.pdf/jcr:content/translations/en.CD00258017.pdf

1.2 Multichannel (scan), single conversion mode vermiş. (muhtemelen EOC yi ayarlamam lazım. bunun içinde en iyi ihtimal int olur.)

Klein

Scan modda DMA ya da Interrupt kullanmamanın akıllıca olmadığını söylemem gerek. Çok başını ağrıtır. DMA kanalını başka iş için kullanıyorsan sözüm yok. Ama başka işe kullanmıyorsan, DMA kullanımından kaçmak çok anlamlı değil. Daha önceki denemelerimde, bazı durumlarda kesmede dahi sorun yaşadığım oldu. DMA harici kullanımı önermem.  4 kanala kadar kullanımda , regular kanallar yerine injected kanalları kullanabilirsin. Hem DMA'ya hem de kesmeye ihtiyacın olmaz.


Cemre.

Alıntı yapılan: Klein - 07 Ocak 2017, 18:51:18
Scan modda DMA ya da Interrupt kullanmamanın akıllıca olmadığını söylemem gerek. Çok başını ağrıtır. DMA kanalını başka iş için kullanıyorsan sözüm yok. Ama başka işe kullanmıyorsan, DMA kullanımından kaçmak çok anlamlı değil. Daha önceki denemelerimde, bazı durumlarda kesmede dahi sorun yaşadığım oldu. DMA harici kullanımı önermem.  4 kanala kadar kullanımda , regular kanallar yerine injected kanalları kullanabilirsin. Hem DMA'ya hem de kesmeye ihtiyacın olmaz.

injected mode ile ilgili daha fazla bilgi verebilir misiniz hocam? @Klein

Klein

Regular kanallarda ADC çevriminin sonucu hep aynı registere yazılır.
injected kanallarda ise her kanalın verisi kendi registerine yazılır. 4 kanal injected olarak kullanılabilir.
Ayarları regular kanal ayarlarından  çok farklı değil. 

muhittin_kaplan

Yukarda verdigim dokumanda hepsi geciyor @Cemre. Hocam

Cemre.

@Klein @muhittin_kaplan ayri ayri teşekkürler.

Dokümanda injected için olay tetiklemeli çevrim şeklinde bahsedilmiş @Klein hocam, farkli bir şeyden mi bahsediyoruz yoksa ayrıca bu özellik de mi var.