STM32F030 ADC + DMA + PWM ile ilgili bir soru

Başlatan justice_for_all, 17 Haziran 2015, 12:46:08

justice_for_all

Merhaba arkadaslar ADC nin iki kanalından ölçülen değeri DMA ile  iki pwme ayrı ayrı atmanın bir yolu varmı? ben suan ADC -> DMA -> PWM tekli olarak yapabiliyorum ama bana

ADC 1. kanal -> DMA -> PWM kanal1 duty
ADC 2. kanal -> DMA -> PWM kanal2 duty

yapmak istiyorum.Hiç Çalışsan oldumu bu konu ile ilgili.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrDarK

Aynı anda yapmak yerine 1.nin işi bittikten sonra 2.ye kaydırıp atamaz mısın ?
Picproje Eğitim Gönüllüleri ~ MrDarK

justice_for_all

#2
Benim maksadım ben programda CPU ya iş yüklememek. DMA halletsin o işi istiyorum.

mesaj birleştirme:: 17 Haziran 2015, 13:43:06

Galiba şu şekilde olabilir duty 1 ve duty 2 register adreslerine baktım ardışık (aradaki fark 32 bit).DMA ile peripheral increment yaparsam data size 32 bit yaparsam şu şekilde olur.

DMA ADC kanal 1. okudu duty1 e aktardı sonra peripheral adresi 1 arttırdı.artık yazılacak adres duty2 nin adresi oldu .
DMA ADC kanal 2 yi okudu duty2 ye aktardı işlemi bitirdi.

Siz ne düşünüyorsunuz bu konuda?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrDarK

Olması lazım söylediğiniz gibi. Denemek lazım.
Picproje Eğitim Gönüllüleri ~ MrDarK

justice_for_all

Ben şuan işyerinde olduğum için deneyemiyorum akşam denerim artık hocam.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

CLR

Alıntı yapılan: justice_for_all - 17 Haziran 2015, 12:51:22
Benim maksadım ben programda CPU ya iş yüklememek. DMA halletsin o işi istiyorum.

Bu söylediğin kısmen doğru, dma işi halleder ama cpu'nun zamanından çalarak halleder, yani dma'nın kendine ait bus'ı olmadığı için cpu ve dma aynı bus'ı kullanır. Dma sadece seni periyodik iş yükünden kurtarır.
Knowledge and Experience are Power

z

Emin olarak mı konuşuyorsun?

Dediğin olabilir de olmayabilir de. ARM işlemcilerde araştırmadım ve dediğin gibi olacağını sanmıyorum. Daha doğrusu ARM işlemciye bunu yakıştıramam.

DMA donanım tasarımında bir kaç yol var.

Birincisi dediğin gibi DMA aktifleştiğinde işlemciyi susturmak.

Diğeri Bus'ın aktif olmadığı anlarda DMA transferi yapmak.

CPU atıyorum CLK=1 iken bus'ı kullanırken DMA de CLK=0 iken bası kullanması gibi.

Neye dayanarak söyledin bunu?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

Emin olarak konuşuyorum tabii ki,  işlemleri "tam olarak" paralel yapmıyorlar, aynı data bus'ı kullanan dma ve cpu  görev paylaşımlı çalışır daha doğrusu round robin algoritmasına göre çalışırlar ama dma daha önceliklidir.
Aşağıda açıklıyor.

When the DMA is transferring the data. the main CPU is free to do the work for some other process.
This forms the basis of multiprogramming. But there is a hitch in this scheme. Exactly at the time when
the DMA is using the data bus. the CPU cannot execute any instruction such as LOAD or STORE which
has to use the data bus. In fact. if the DMA and the CPU both request the data bus at the same time, it is
the DMA which is given the priority. In this case. the DMA 'steals' the cycle from the CPU. keeping it
waiting. This is why it is called cycle stealing. The CPU. however. can continue to execute the
instructions which involve various registers and the ALU while the DMA is going on.


Knowledge and Experience are Power

z

Nadiren DMA kullansam da ARM'a yakıştıramadım.

Halbuki aynı zamanda bus'ı kullanabilen yapılar mevcut. Belki mimariden kaynaklanıyordur.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

DMA'nın özel bus'ı varsa öyledir, . Daha farklı birşey söylüyeyim.

iki dma'yı aynı anda kullanırsan(dma1 ve dma2) ayrıca cpu (hepsi anda bus isteği yaparsa)  bu durumda hangi dma diğerine göre öncelikli ise(DMA1) o burst modunda çalışır yani diğer dma2 ve cpu bekler, sonra iş bitince, dma1 susar, diğerleri(cpu ve dma2) bus stealing modunda çalışır(önceki mesajımdaki gibi).
Knowledge and Experience are Power

Karamel

Hocam oyleyse code lari dma ile calistirmak ile normal calistirmak arasinda pekte fark yok?

CLR

Arkadaşın konusu dağıldı kusura bakmasın.

Var, mesle st işlemcilerde çok kanal adc okuma var, hatta her okuduğun kanalın data buffer'ı var, mesela 4 kanal okusan 4 data buffer olsa toplam 16byte data yapar, bu okumaları continuous modda yaparsan, dataları manuel bir yere transfer etmeye kalkarsan yetiştiremezsin, yeni datalar öncekilerin üzerine yazılır ama dma ile yaparsan yetişir, 

adc veya diğer modülleri dma'yı birkez ilişkilendirisen sürekli çalışır, manuel yapmaya çalışırsan çok iş yükü olur ve manuel yaparak çok cycle kaybedilir.
Knowledge and Experience are Power

z

Bus ile alakalı değil. İki bus olsa bu kez Ramın da çift portlu olması lazım.

Daha önceki mesajımda dediğim gibi system clogun 1 ve 0 ında sıra ile kullanan MCU lar var. Fakat demekki ARM da bu mümkün değil.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

Arm'da bus'la alakalı, merak edip diğer işlemcileri veya yüksek seviyeli işlemcileri incelemedim ama mesela stm32f4'de cpu/dma/ethernet/dma1-2 controller'lar aynı databus'ı kullanıyor ama onda "multilayer bus matrix" denilen bir sistem var, bus switching yapıyor. Yani controller'dan cpu veya diğer controller'a yol verilirken bekleme süreleri var.   
Knowledge and Experience are Power

z

Demek istediğim Ram ile bağlantılı DMA işlemi yapılacaksa ikinci bir bus avantaj getirmiyor.

DMA ve CPUnun rama erişmek istemeleri durumunda ikinci bus tek başına yeterli değil Ramin da çift kapılı olması lazım. Bu da astarı yüzünden pahalı olur.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com