Cubemx kullanarak tek kanal okuma yaptim.
Dma kullanmadan single conv, multichannel (cok kanal tek cevrim) yapamadim.
Nasil yapilir ?
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.
.
.
.
Ç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.
Hocam, iki kanal okuyacagim. Ama yapamadim. Problem hiz felan degil. Birturlu okuyamadim
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.
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]
Aslinda multichannel single conv. Olmuyor sanirim. Cunki her cevrimde tek kanal okuyorum.
Adc modlari nelerdir ? Nerelerde kullanirim ?
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?
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.)
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.
https://www.picproje.org/index.php/topic,68158.msg523949.html#msg523949
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
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.
Yukarda verdigim dokumanda hepsi geciyor
@Cemre. Hocam
@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.
ADC çevirimi bir çok şekilde tetiklenebiliyor. Injected kanalların çevirimi DMA ile tetiklenemiyor ( Emin değilim öyle hatırlıyorum). Olaylarla da tetikleniyor olabilir. Farklı şeylerden bahsettiğimiz sanmıyorum.