ADC DMA PWM Uygulama Tekniği

Başlatan fractal, 26 Mart 2013, 13:01:34

fractal

işlemciden işlemciye göre değişebilir ama ben bu üç modülü birine bağlayarak işi donanıma yıkabilirmiyim.bu mümkünmüdür?
1.)pwm dma yı  ve adc yi tetiklesin
2.)dma güncel darbe genişliklerini adc den okuyup pwm yazssın.
3.)bu adc değerlerini işlemek mümkünmüdür?

4.)böyle bir yapı 3ü bir arada olmassa  2si bir arada kullanılacak ikili hangisidir?neden?
5.)nette adc-dma uygulamları var.tama olarak bu ne için kullanılıyor?
Restantum cogniscutur Quantum deligutur

iyildirim

İşlemciye bağlı olarak mümkün olabilir. Ama 3 işi birden DMA kullanarak otomatikleştirince oluşan döngü adeta voltaj follower gibi birşey olmaz mı. İşlemci yerine opamp daha iyi bir çözüm olurdu.

Kullandığım işlemci de PWM ile ADC tetiklemek mümkün. İkinci bir PWM tetiği ile ADC çevrimi de sonlandırılabiliyor. Yada DMA ile RAM'e yazılmış ADC sonuçlarını değerlendirmek için sonlandırmayı PWM kesmesi içinde yapıp ortalama almak, bir sonraki PWM duty si vs. hesabı yapmak mümkün.

Eğer kapalı çevrimde akım voltaj vs kontrol edilecekse direkt adc den pwm güncellemek, yani 2. madde çok anlamlı değil. Hesap kitap gerekir. Kontrol açık çevrimse de niye ADC ile uğraşalım. Wav player yapmıyorsak DMA ile PWM bana biraz ters geliyor.

ADC ile DMA niye kullanılıra gelirsek; İşlemciye bağlı olarak örneğin tek bir ADC bufferı varsa ve okunmadığında ADC değeri kaybedilecekse ve birden fazla kanal okunacaksa yada ortalama almak için örneğin 16 ADC değerini tek seferde değerlendirmek istiyorsak, habire kesmeye girmek yerine DMA güzel bir çözüm olur.  İşlemciye ve uygulamaya bağlı. Gereklilik, performans yada keyfiyet.

fractal

anladığım kadarıyla bu noktada udma benim kurtarıcım değil.ama şunlar yapılabilirmi en azından bilmiyorum.pwm her zero tetiklmesinde adc derki git 64 değer oku bunu bir tabloya yaz.tabloya yazma işlemi olunca.irms hesaplansın.sonra içlerinden en büyük 8 tansesi bulunsun ve i peak rms hesaplansın.sonra ilk pwm load kesmesi oluştuğunda sinüs tablosu bu adc değerine göre ve pid hesaplarına göre güncellensin.sanrı  80mhz ile bile bunları yapmak sıkıntı olabilir.kaldıki daha bir çok işten bile bahsetmedik.haberleşme ve diğer cevre birimlerinin kontrolü..üstelik bunca bir iş 2.ci peryot güncellemesi gelmeden yapılmalı.olmadı ozaman 3.olucak olmadı dördündü olucak.zaten pwm deki değişiklik hemen akıma etki etmemesi lazım...
işte tüm bu noktada kendime bir algoritma kurabilmiş değilim.pwm adc dma arasında gidip geliyorum..
Restantum cogniscutur Quantum deligutur

iyildirim

DMA iletişim vs. gibi konularda kurtarıcı olabiliyor ama PWM ADC gibi konularda ancak yardımcı olur.

Kontrol frekanslarını vs. abartmazsan dediklerinin çoğu bence yapılabilir. Hesap kitabı uzun işlerden kaçmak, işlemcin destekliyorsa dsp komutları-kütüphaneleri  kullanmak, birşeyleri oranlamak için kayar noktalı yerine sabit noktalı sayı kullanmak, bölme yerine çarpma kaydırma gibi teknikler gerekir.

80 mips az bir değer değil.  40 mips işlemci, 3 motorun toplam 6 sargısını kontrol için 48-64khz arası pwm kullanıp, her bir pwm darbesinde pid de çalıştırmaya, iletişim vs. ye yetmişti.

Sanırım inverter yada motor gibi birşeyle uğraşıyordun. Uygulamana göre gerekecek kontrol çevrimi süreleri vs belli olduktan sonra  tam hesap kitap ortaya çıkar. Yetmediği yerde dac, pwm-dac, komparator vs den de yardım almak mümkün. Örneğin, geliştirme aşamasında pid hatalı-agresif olurda duty fazla kaçar mos patlar gibi şeylerde pwm sonlandırması için referansını %10-20 fazla verdiğim extra komparator kullanıyordum.  İşlemcini, modüllerini ne kadar iyi tanırsan o kadar rahat karar verebilirsin.

fractal

#4
yazınıdan sanki assembly daha hakimsiniz gibi geldi.bahsettiğini noktalı sayı ve bölge algoritmalarını oluşturmak için assamlye de çalışmak gerekir.şimdi benim kullandığım işlemcide fpu var.floting point unit.klasik olarak kayan noktalı daha yavaş ama gerçek sayılarla çalışma imkanı verirken aynı bitle daha cok tanım yapılabiliyor.sabit noktalıda tam tersi.ama bana söylenen bu fpu daha hızlı noktalı sayı işlemek için gerçekleştirilen bir ünite olduğu.
neyse şöyle basit bir hesaplama yapalım.
sinozidal ile h köprü sürücem.yük indiktif.pid akım kontrolü olucak.ayrıca diğer cevre birimleri kontrolü.örneğin dc bara gerilimi ölçümü,faz kontrol,ısı ölçümü...
max çıkış frekansımız 500hz olsun.T=2ms yapar.T/2=1ms.dinamik sinüs tablosu kullanıcam 2 adet.aşağıdaki gibi.birisi birinci alternans diğer diğer alternans.

tablo1:xxxxxxxxxxxxxxxxxxxx00000000000000000000000----pwm1
tablo2:000000000000000000xxxxxxxxxxxxxxxxxxxxxxxxxx---pwm2

eğer 1.derecelik çözünürlük istersem:1ms=1000us /180derece=5.5 us.yani her 5.5us de bir pwm güncellersem 1 derecelik çözünürlük ile ilk alternansı üretmiş olurum.böyle olunca anahtarlama 180khz oluyor.genelde 4-10-20khz diyorlar ama bu 50hz için bildiğim kadarıyla.
hadi biz çzönürlüğü 6 derecede bir yapalım yani 1000us/6 derece=30us anahrtlarma frekansı 6khz olur.burdan yola çıkarak
ilk alternans için 30us bir pwm güncelleme sonra diğer alternans için 30 us bir pwm  güncellme şeklinde gidecek.
bu 30us de pwm conter yüklendiğinde kesme ile adc tetiklensin 64 örnek alsın.diğer güncelleme kesmesi geldiğinde pid hesabı yapılsın ona göre yeni güncelleme değerleri ortaya çıksın.

bunlar olurken.irms hesaplansın,64 adet örneğin en büyük 8 değeri bulunup ipeakrms hesaplansın.aynı zamanda dc bara gerilimi hesaplansın  ve soğutu ısı ölçülsün.ve aynı zamanda igbt driver hata kesmesi kontrol edilsin.ve birkaç dijital girişe bakılsın.

işlemcim 100mips adc saniyede 1 milyon örnek alabiliyor. 1us zaten bir tane örnek olabilir.30us de 30 tane.ozaman 64 örnekte alamam.

illa ilk periyotta hesaplanıp hemen diğer periyottamı güncelleme olucak.daha önce 2. yada 3. periyotta da olabilir ama akım regülasyon bant genişliği artar denilmişti..



tüm bunlar bunlardan ne kadarı bu 30us içine sığar.ben lm3s serisini kullanıyorum.lm4f serisi dsp komutlarını destekliyor.lm3s desteklemiyor.ama motor kontrolve motion kontrol yapabiliyormuş.benim hesaplar çok sınır değerlerde kalıyor gibi.yada algoritmayı henüz otuttamadım.80 mhz ile 4 adc okuma hesaplama 2 pwm modül  kontrol çokta zor olmasa gerek...

Restantum cogniscutur Quantum deligutur

iyildirim

Asm çok gerekmedikçe pek kullanmam. Bahsettiğim proje de pid için microchip'in hazır dsp kütüphanelerini kullanmıştım. PID fonksiyonu call return dahil 30 clock harcıyor. 40 mips de 750ns.

FPU varsa iyi tabii. Ama sabit noktalı sayı yeterli oluyorsa dsp daha verimli. Örneğin 64 lük ADC sonuçlarının karelerini toplama işi dsp kullanırsanız init kısmı dahil 67-69 clock tutar.  80 mips de 1us nin altında.

500 Hz lik sinüs tamam ama bu bir motor içinse size 500hz kadar 100 veya 0.1 hz de lazım olabilir. Zaman kalırsa frekans hesabını osilatör clock'u frekansa bölerek yaparsınız. Üstelik hızlanma gibi şeyler varsa istenen hıza ulaşıncaya kadar bu hesabı sürekli yaparsınız.
Yada hesap kitabı işlerini  olabildiğince design-time da önceden yapıp look-up tabloları hazırlamak run-time da hazır değerleri kullanmak da mümkün.

Öte yandan omik olsa tamam ama endüktif bir yükte 500hz gibi bir frekansta oluşacak faz kaymasına rağmen 1 derecelik hassasiyeti tutturmak da zor iş. Yani analog tarafta da zorluklar olacak. Hele de bu bir motorsa değişken yük altında ise ve devirle birlikte endüktansda değişecekse.
Abartmak dediğim yerler sinüsü 1 derece hassasiyette istemek, ADC yi 64 örnek almak gibi şeyler. İşlemci 80 mips olsa da sınırsız değil.  Makul hedeflerle başlayıp elde kalana göre karar vermek gerek. 

Herşeyi işlemci içinde yapmak zorunda da değiliz. 64 ADC okuması yerine uygun bir filtre kapasitörü ve makul sayıda ADC çevrimi neden olmasın ki.
Yada istediğimiz uygun gerilim veya akım akmasını sağlamak ise çoğu hazır motor sürücü chip'in yaptığını yapıp chopping gibi birşeyler de  yapılabilir. Bu durumda komparator için DAC, PWM-DAC gibi birşeyle referans oluşturup, duty'yi %100 verip komparator çıkışını PWM FAULT girişlerine girip ADC ile uğraşmak bile gerekmeyebilir. 

Konu detaylı ve uzun. Genel sorulara verilebilecek cevaplar için sayfalarca yazılabilir. Tabii o kadar vakti olan yazar. 
Önerim makul hedeflerle çalışmaya başlaman. İşlemcini tanıdıkça konuya hakim oldukça sorularda cevaplarda netleşir.

fractal

#6
aşağıdaki gibi bir tablo hazırlarsam.anahtarlama freknasını hiç değiştirmeden.50hz ile 600hz arasında çalışabilirim sanırım.çünkü bana hesaplama için yaklaşık olarak 55us zaman kalıyor periyot başına.ve şöyle düşündüm 500hz ile 400hz arasını 36 adet güncelleme 400hz ile 300hz arasını 45 güncelleme.daha sonra şöyle bir soru aklıma geldi..ben alternans üretmek için şunu uygulayacaktım:örneğin 500hz ile 400 hz arasında güncelleme adeti 36 ise pwm peryot yenileme kesmelerini sayacaktım kesme 18 olduğunda h-köprünün diğer 2 ucunu tetikleyecektim.ve bu böyle sürüp gidecekti.
şimdi 45 adet olunca sayı çift olmuyor.onu 44 yada 46 kabul ededip aynısını uygulayacaktım.
böyle bir düşünce gerçekte iş görürmü.

55us çalışma süresiinde çok sayıdada iş yapılabileceğini düşünüyorum.adc 1 us de 8 örneğin ortalamasını alıp veriyor.pid işlemleri filan sanırım yeterli.ama 18 khz anahtarlama frekansı iş görürmü.sanırım düşüncem doğruysa başka bir çok sorunun cevabı uygulamada bulacağım sanırım..

bu arada 1 derece gibi hassasiyetle kontrol yapmak istemiyorum sadece hata payını vurgulamak istedim.

Restantum cogniscutur Quantum deligutur

fractal

iyildirim hocam yorumlarınızı bekliyorum.
Restantum cogniscutur Quantum deligutur

fractal

aslında bu design time ile run time modlarıda iyice açıklanmalı.ben design time örneğin pwm için gerekli son hesapların yapıldığı run time ise artık bu hesaplmalara göre pwm oluştuğu durum olarak tanımlıyorum.bu örneği daha fazla nasıl açabiliriz..
Restantum cogniscutur Quantum deligutur

z

Örnek vereyim

Motor sürücüye uygulanacak pwm değeri, PWM = Pmax*V/Vb bağıntısı ile hesaplanıyor olsun.

Burada K=Pmax/Vb dersek

Pmax PWM in max değeri. Vb güç katının besleme voltajı.

Şimdi senin tasarımda Pwm max ve besleme voltajı bellidir. O halde Pmax/Vb oranını daha kodları yazarken belirleyip K katsayısını bir sabit olarak programa gömebilirsin.

Bu durumda bu yaptığın işlem tasarım aşaması işlemdir.

Yok ben böyle yapmayacağım besleme voltajını herdefasında ölçeceğim ve K yı program koşarken hesaplacağım dersen bu da runtime aşamasında yapılan bir işlem olur.

Runtime işlerden ne kadar çok kaçarsan kodların o kadar hızlı koşar.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com