STM32F10X PWM+DMA ile Sinüs oluşturma (Örnek)

Başlatan Klein, 11 Mart 2013, 13:37:23

kantirici

Alıntı yapılan: Klein - 12 Mart 2013, 21:58:18
PWM frekansı  = sinüs frekansı * örnekleme sayısı.  olmalı.

Tablonun sinüs frekansına doğrudan bir etkisi yok. Ancak tablodaki eleman sayımız  bir periyottaki örnekleme sayımız olduğu için , doğal olarak örnekleme sayımız ne kadar yükselirse aynı dalga frekansı için PWM frekansımız da okadar yükselecektir.

Anladım hocam teşekkürler.Peki siz bu tabloyu ne ile oluşturdunuz acaba?

Klein


fractal

kafama takılan diğer sorular şöyle;

1.)örneğin denilmişki pwm her yeni period da dma tetikleyecek.bu tetikleme donanımsalmı?yoksa bir interrupt şeklindemi.yoksa 32 örnekli sinüs için geçerli olan aynı şekilde 32 tetikleme işlemi yaparki bu da  aynı şey olmazmı?

2.)dma ile pwm uygulaması yapalım.yine sinüs değerleri kullanalım.peki birde h-köprü sürdüğümüzü düşünelim.bu nu nasıl yapabiliriz?bu örnekte tek kanal pwm çıkışında çalışmak kolay.4 kanal çıkış olsaydı dma ve pwmi nasıl ayarlarık.özellikle alternas geçişleri nasıl olurdu?
Restantum cogniscutur Quantum deligutur

Klein

1-Tetiklemeyi donanım yapıyor.

2- PWM kanalının negatif ve pozitif çıkışları var. yarım köprü kullanırken bu çıkışlar kullanılabilir. 
Tam köprü için  birkaç farklı strateji izlenebilir.

İki tane sinüs tablosu yapılabilir. tablonun birisi bir alternans boyunca 0, diğer tablo ise diğer alternans boyunca sıfır olur. Timer başlatıldığında  iki kanal birden başlar. İlk alternansta tablonun birisi 0 olacağı için kanalın birinden 0 diğerinden ise sinüsün bir alternansı alınır.

örnek tablo:  ( tablo sinüs değil. hesap kitapla uğraşmamak için üçgen yaptım)

const sine_table_hi[] = {0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
const sine_table_lo[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1}



fractal

hocam çok güzel anlatıyorsunuzda ben biraz yeniyim.stellaris lm3sxxx kullanıyorum.derleyicim texas ccs ..onlarda micro dma var.ayrıca pwm modülünü cözdüm.ama pwm modülü timer la çalışmıyor.tabi istersen ayarlayabiliyorsun.burdaki yapıyı uyarlamam gerekecek.yazdığınız örnek kodlarda iyi bir referans kaynağı.ayrıca çift tablo kullanma fikrini paylaşarak da güzel bir çözüm önermiş oldunuz.

birde pid  akım kontrolü işin içine girerse sanırım dma olayı olmaz.çünkü Z nin dediğine göre eğer datalar işlenecekse dma nın bir özelliği kalmıyormuş.data işlemekten kastım genlik değiştirerek  akım kontrolü tablo değerlerinin aynı oranda artması yada azalması gibi.
Restantum cogniscutur Quantum deligutur

Klein

Evet veri üzerinde herhangi bir işlem yapılacaksa DMA kullanmak anlamlı değil.
Ancak Cycle-by-Cycle kontrol  yapılmıyorsa, PID verileri her saykılda hesaplanmıyorsa, tablo dinamik olarak oluşturulabilir.
Tablo const olarak önceden tanımlanmaz. Tablo için bir dizi ayrılır. PID sonucuna göre tablo yeniden hesaplanır. 

Çok hızlı PID işlemlerinde çok efektif olmaz.
Ama DMA kullanmasanız da zaten PID sonucuna göre bir dalga formu üretmeniz gerekiyor.
En azından çıkış işlemleri ile uğraşmak zorunda kalmazsınız.


fractal

hocam  ben zaten dinamik tablo kullanıcağım.istediğim frekansa göre tabloyu bir kez hesaplatacağım.daha sonra akım kontrolü için değerlerin tümünü aynı oranda arttırıp azaltacağım.tabi burda ozaman şu nokta önemli ; bir peroyot süresince tablonun tüm elemanları en azından güncellenmiş olmalı.peryot süresi dolunca pwm dma tetikleyecek.dma zaten güncel değerleri göndermiş olucak.eğer işelem yükünü dma aldığını varsayarsak işlemci 80mhz ise yani 1s de 80 milyon işlem ozaman 1ms 80000 işlem.eğer 500hz sinüs üretecksem.T=2ms  yapar.360 derece  360 değer kullnırsam en az 360 işlem demektir.burdan cıkan sonuç ozaman rahatlıkla tabloyo güncelleyebilirim.ayriyeten geriye çok işlem gücümü kalıyor.

şunuda merak ediyorum dma nın birden çok kanalı kullanmak dma nın hızını düşürürmü?dma nın performansını ne etkiler?
Restantum cogniscutur Quantum deligutur

Klein

DMA'da birden fazla kanal kullanmak muhakkak ki DMA hızını düşürecektir.  Ancak tablonun 360 elemanlı olduğunu düşünürsek , saniyede 500 kez 360 değer aktaracak demektir. O da saniyede 180.000 değer aktarımı demek. Çok yüksek bir değer değil.   

muhittin_kaplan


Klein

DMA hızını , DMA'yı tetikleyen donanım belirliyor.

muhittin_kaplan

Yani bir timer a bağlayabiliyormuyuz ?
SPI dan alınan bir bilgiyi USARt tan göndermek istesek
önce Perip->memory sonrasında Memory->peripheral mı yapacağız ?
SPI dan aldığımız bir bilgiyi sprintf ile bir katar oluştursak CPU yu kullanmış dolayısıyla DMA nın özüne ihanet mi etmiş oluruz ?

Klein

#26
Evet bir Timer'a bağlayabiliyoruz. DMA-PWM örneği zaten bunu yapıyor. Timer update olayı oluştuğunda DMa tetikleniyor.
periph<->periph. meselesini bilmiyorum. biraz zaman verirsen datasheet'i ararştırıp cevap veririm.
spi'dan veriyi alıp sprintf formatlamakla hiç bir şeye ihanet etmiş olmayız. 
srintf ile veriyi formatlarken CPU gücü kullanıyoruz. Ama önemli nokta şu:
Donanımlardan veriyi alırken ve veriyi gönderirken, bazı hız sınırlamalarına tabiyiz.  Usart ile veri gönderirken baud hızına göre , belirli beklemeler yapmak zorundayız.
Ama sprintf ile işlem yaparken böyle bir kısıtlama yok. Bellekten ne hızda veri çekebiliyorsak o hızda işlem yapıyoruz.
Bu sebeple SPI'dan veriyi alıp , sprintf ile formatlamak gayet olağan bir durum. DMA ile veriyi formatlama şansımız yok zaten.


mesaj birleştirme:: 06 Ağustos 2013, 18:45:02

peripherial-to-peripharial transfer yapabiliyormuş.

Ref: STM32f10xxx refsheet. sayfa 256.

muhittin_kaplan

hocam Kütüphanesinde
sadece
mem to mem
pripheral to mem
mem to peripheral
var.

muhittin_kaplan

Hocam Dediğiniz yerde eksik/yanlış bir durum mu mevcut
normalde mem to mem olması gerekirken yok.

Klein

Evet kütüphaneye ve register yapısına baktığımda yapamayacağını görüyorum. 
http://s3.dosya.tc/server8/JqAZG4/STM32F10xxx_REF.pdf.html
Ama bu dokümanın 256. sayfasında periph-periph yapabildiğini söylüyor.

Şöyle olabilir. Emin değilim denemek gerek.
Yavaş donanımı periph seçip tetiklemeyi bu donanıma yaptırıp, memory adresi olarak da karşı donanımın adresi verilebilir. Yer mi? Yemez mi? Bilmiyorum.