STM32F103C8 Regular simultaneous mod toplam 10 kanal olcum

Başlatan Zoroaster, 07 Kasım 2017, 07:28:23

Zoroaster

Bugune kadar projelerimde ADCyi dual mod injection modunda ve 8 kanal ADC olcumu yapacak sekilde yapilandiriyordum.

Yeni calismamda ise 10 kanalin olcumune ihtiyac olunca ilk kez regular modu kullanmaya karar verdim fakat bir turlu istegimi yerine getiremedim.

Amacim su;

Dual ADC modunda olayi software olarak tetikledigimde.

ADC1  Ch1 i cevirirken ADC2 ayni zamanda Ch2 yi cevirecek. Ardindan
ADC1  Ch3 u cevirirken ADC2 ayni zamanda Ch4 u cevirecek. Ardindan
ADC1  Ch5 i cevirirken ADC2 ayni zamanda Ch6 yi cevirecek. Ardindan
ADC1  Ch7 yi cevirirken ADC2 ayni zamanda Ch8 i cevirecek. Ardindan
ADC1  Ch9 u cevirirken ADC2 ayni zamanda Ch10 u cevirecek. Ardindan islem bitecek.

Register bazinda kodlama orneginiz varsa gorebilirmiyim?

Eger HAL vs ile kodlayabilirim diyorsaniz

Yazdiginiz kodu derleyip debug moduna gecip ADC1 ve ADC2 registerleri iki ayri memory windowsda gorunecek sekilde
ayarlama yapip init kodunu kosturup ADC donusumu baslatacak satirda islemciyi breakpoint ile durdurup ekrandaki memory windows degerleri gorunecek sekilde ekran goruntusunu resim formatinda kim yayinlayabilir?

Seytan deliginden kacti.

Zoroaster

Boyle bir uyari varmis daha yeni farkettim. DMA kullanmayacagim icin bu biti set etmiyordum.

In dual ADC mode, to read the slave converted data on the master data register, the DMA bit must be enabled even if it is not used to transfer converted regular channel data.
Seytan deliginden kacti.

Klein

Regular modda 10 kanalı DMA kullanmadan okuyamazsın zaten abi.  Interrupt ile denediğimde bile bazen üzerine yazma gerçekleşiyordu. ADC'den başka çalışacak kod yoksa belki. ama önermem.

Zoroaster

Kodlarimdan henuz emin degilim fakat gozlemlerime gore mevcut durumda 10 kanalin tamami cevrildikten sonra int uretiliyor gibi duruyor.

Her bir kanalin cevriminde malesef bana cevrim bitti gibi bir bilgi veren mekanizma yok.

Dolayisi ile yazilimla ya da int ile verileri yakalamanin yolu yok gorunuyor.  Dokumanin ADC bolumunde yazilimla datalari yakalamanin yoluna ait bilgi yok.

Fakat ADC her bir kanalin cevriminden sonra DMA unitesini durtebiliyorsa bundan bir sekilde yazilimla da haberdar olabilmek lazim. Sorgulama isini belki DMA registerleri tarafinda yapabilirim.

En son care DMA ile transfer yapmak.
Seytan deliginden kacti.

Klein

STM32F4 serisinde EOC kesmesinin ne zaman geleceğini seçebiliyorsunuz. Fakat 103 serisinde o bit yok. 
Neden ilk düşünmeniz gereken DMA seçeneğini son çare olarak görüyorsunuz ki?

Zoroaster

10 tanecik veri icin DMA'e gerek yok diyordum. Fakat her bir ADC cevriminden  DMA registerlerini gozleyerek haberdar olacaksak mecburen isi DMA'ye birakmak lazim.

Zaten bu regular moddan sogudum gene injection kanallarla devam edecegim.
10 kanali 8 kanal ve 2 kanal olmak uzere parcalamamda sakinca yok.
Seytan deliginden kacti.

Tagli

Konu eski ama forumda aratınca ilgili olarak bir bu başlığı buldum. Benim de ilgili bir sorum var: Regular Simultaneous Mode kullanırken DMA ne zaman tetikleniyor? RM'i tekrar tekrar okudum ama kafamda tam bir şey şekillenmedi. Gerçi ben F103 değil F407 kullanıyorum ama mantık az çok aynı olmalı sanırım. Gerçi F407'de 3 farklı DMA modu var, ama bunlardan biri sanırım F103'ün çalışma şekline denk geliyor.

Yapmaya çalıştığım şey @z 'nin ilk mesajında verdiği örnek gibi, kanalları çifter çifter okuyup bellekte bir yere atmak.

F407'de DMA, ortak bir register'dan - ki bu hem ADC1, hem de ADC2 sonucunu tutuyor - okuma yapacak şekilde ayarlanabiliyor. Ancak ADC1 ve ADC2 ayrı ayrı mı request atıyor? Request geldiğinde iki değer de güncel olur mu? Burada tabi kanal sayısı, bit sayısı ve sampling time falan da uyumlu olmalı. Kafamda daha bir dolu soru işareti var. RM maalesef ayrıntılı bir sequence diagram vermemiş.

Daha önce böyle bir dual ADC uygulaması yapan oldu mu? @z hocam, sen aradan geçen yıllar içinde bu olayı çözdün mü?
Gökçe Tağlıoğlu

z

Inan hatirlamiyorum. O zaman ADC ile DMA kullandiysam da artik hic kullanmiyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Cemre.

Her bir ADCx çevrebiriminin kendine ait DR Data Register'ı var. Regular Conv. bir kanal için tamamlandığında DMA req. oluşuyor ve ADCx->DR DMA transferinin source'u, memory'deki adresiniz ise destination'ı oluyor, veri bu iki adres arasında aktarılıyor. Eğer ADC1 ve ADC2 'aynı anda' trigger edilirse, çevrim sonunda DMA açısından öncelikli olan (DMA transfer kanalı numarasına göre) önce, diğeri sonra olacak şekilde veri yine ilgili destinasyonlara aktarılıyor. Burada iki ayrı DMA kanalı kullanıldığından veriler farklı destinasyonlara yazılarak override vb. durumlardan da kurtulmuş olursunuz.

Ben PWM ile senkron akım okuma gibi işleri Injected kanallarla yapmayı tercih ediyordum. Ancak bunun dışındaki harcıalem okumaları Continuous Regular Conversation yapıp DMA aktif ederek bir array'a sürekli taşıyordum, bu sayede sürekli güncel sonucu ilgili array'den okuyup kullanabiliyordum. Tabi burada senkronizasyon veya başka dertler yok.

Injected çevrimin en güzel yanı kendi data reg'inin olması. Regular'da ise DMA olmadan iş yapmak CPU yükünü çok artırıyor.

Tagli

@Cemre. 'nin ilk paragrafta anlattığı şey ADC'lerin bağımsız çalışması oluyor. Sonuçları tek bir bellek bölgesinde toplanmasını istersem bu durum işe yaramayacaktır. Ayrıca bazı durumlarda sadece hızı arttırmak için aynı kanalın birden fazla ADC ile okunması durumu da olabilir. Gerçi benim böyle bir ihtiyacım yok ancak donanım bu amaca yönelik olarak da tasarlanmış.
Gökçe Tağlıoğlu

Cemre.

Açıkçası böyle bir ihtiyacım olsaydı, yukarıda anlattığım şekilde çözmeyi denerdim. Dual mode gibi bir yapıya şimdiye kadar ihtiyaç duymadım, ama bir wattmetre yapacak olsam kesin kullanırdım :)
Herneyse, benim algılayabildiğim kadarıyla sonuçlar tek bir register'a yazılıyor ise bu yazma işlemi de tek seferde yapılıyor olmalı, yani RM tam olarak bu bilgiyi vermese de, EOC gerçekleştiğinde 32 bitlik değişkenin içerisinde ADC1 ve ADC2'nin ürettiği sonuçlar tek seferde yazılıyor olmalı. Aksi halde bu özellik, iki kanal verisini aynı anda elde etme amacını hakkıyla yerine getirmemiş olur, yani diğer daha temel ADC çözümlerinden farkı kalmaz.. diye düşünüyorum. Detaylı bilgi bulursanız bizimle de paylaşırsanız sevinirim.

https://www.st.com/resource/en/application_note/an3116-stm32s-adc-modes-and-their-applications-stmicroelectronics.pdf