pwm metre yapımı??

Başlatan ecunnu, 21 Ekim 2011, 00:34:19

ecunnu

arkadaşlar herhangi bir kaynaktan gelen pwm sinyalini ölçüp frekansını ve duty cycle süresini yüzde olarak lcd de yazdırmak istiyorum yanlız pwm sinyalini sizce pic ile nasıl ölçebilirim nasıl bir algoritma kullanmalıyım?? aşağıda linkini verdiğim vidyoda tamda demek istediğim şeyi yapmışlar ...

http://www.youtube.com/watch?v=A-oU6mx4VTU


ecunnu

evet o siteyi bende gördüm fakat tam olarak anlayamadım sanırım dil olarak c dilini kullanmış ama derleyicisi ne bilmiyorum ben ccs c derleyicisini kullanıyorum programı çözmekte biraz zorlandım...

Klein

Kod istiyorsan veremem. Kod istemiyorum,  mantığını kavramaya çalışıyorum dersen anlatırım.

dhan000

Code Compiled with mikroBasic 7.2
sanırım kodu derlemek için size mikrobasic 7.2 lazım...

ecunnu

yok ben kod istemiyorum ben mantığını kavramak istiyorum zaten kod var dhan000 arkadaşım derleyicisini yazmış o derleyiciyi bulur yine derlerim ama asıl sıkıntı bu kodun mantığını kavrayabilmemde.. aslında bu pwm metredeki mantığı kavraya bilme amacım uzaktan kumandalı bir araç kontrol etmek. yanlız kumandanın alıcısı çıkışına bir pwm sinyali gönderiyor ve bu sinyal kumandayı max getirdiğimizde %14 min da%4 duty cycle bu arada değişiyor benim amacım kumandadan gelen bilgiyi pice göndermek ve picinde  yüzde kaçlık bir pwm geliyorsa ona göre motorun hızını ayarlamasını sağlamak yani mesala %7 lik bir pwm geldiğinde motoru benim belirleyeceğinm orta derecede bir hızla çevirecek... kısacası ben bu işin mantığını öğrenmek istiyorum vede ezbere iş yapmayı pekte sevmeyen biriyim.. bana bu konuda yardımcı olursanız size gerçekten minnetar olurum... ne demişler;

BANA BİR HARF ÖĞRETENİN 40 YIL KÖLESİ OLURUM (HZ. ALİ )

iyildirim

İşlemcinin CCP modülü kullanılarak yapılabilir. MikroE deki örnek kodda da IC (input capture) modülü kullanılmış.

PWM frekansı ve duty'sini ölçmek için, IC modülünü hem yükselen hem de düşen kenarda kesme üretecek şekilde konfigüre edin. İki yükselen (veya iki alçalan) kenar arasındaki zaman farkı peryodu, dolayısıyla da frekansı söyleyecek, yükselen kenar ile düşen kenar arasındaki zaman farkı da duty'yi söyler.

Eğer amacınız alıcıdan gelen sinyalleri algılamak ise frekans ölçmeye pek gerek yok. Duty yi söylediğim şekilde ölçmek yeterli oluyor.  Input capture için kullanacağınız timer'i max duty süresinden daha büyük bir değere set etmeniz gerekir. Amaç duty ölçmek olduğu için period boyundan küçük olması dert olmaz.

Daha önce alıcıdan gelen sinyalleri okumak ile ilgili bir çok kanallı bir örnek kod paylaşmıştım. Ama hangi konuydu hatırlamıyorum. 

ecunnu

verdiğin bilgiler gerçekten işime yarayacak cok tessekür ederim bir sorum daha olucak 16f877 2 tane ccp birimi var ama ben 6 kanallı bir alıcıdan gelen pwmleri okuyucam okunması gereken 6 farklı pwm sinyali var.. acaba bu iş için 16f877 yeterli olurmu yoksa başka bir pic önerirmisiniz...

iyildirim


6 kanalı okumak için direkt olarak 6 adet IC pinine ihtiyacınız var. En basit ve iyi yöntem bu.

Yada işlemcimden vazgeçmem derseniz pratik de denemedim ama şöyle bir yol olabilir. Eğer alıcının senkron çıkışı da varsa,  (ki bunu alıcı üzerinde genellikle kullanılmayan 7. sıra header dan anlayabilirsiniz.) alıcı her 6 kanallık dizinin başında bu çıkışı aktif eder. Bu bir IC veya INT pinine girilerek, darbe katarının başladığı anlaşılabilir. Diğer 6 kanal da OR kapısı veya diyotla birleştirilip bir IC pinine girilip bir önceki mesajda söylendiği şekilde okunur.  İlk yükselen kenarda 1 kanal, 2. yükselen kenarda 2. kanal gibi.

Normalde PPM çalışan alıcı vericilerde kanal pinlerinde PWM sırayla görünüyor. Aynı havada iletildiği şekilde. Benim kullandığım alıcıda yaklaşık 2.5-3 ms de bir sırayla pinlerde darbe görülüyordu.

Ancak bazı yeni model (işlemcili- programlanabilen vs.) alıcı çıkışlarında aynı anda tüm kanalların basıldığı da olabilir. Senkron pini olsa bile bu tip bir alıcı ile bu yöntem çalışmaz.

Benim tavsiyem 6 IC pini olan bir işlemci seçmeniz yönünde. Böylece senkron vs. gibi sorunlarla uğraşmak zorunda kalmazsınız. Ve alıcıdan bağımsız bir çözümünüz olmuş olur.

Ben 16 bitlik 8 IC girişi olan bir işlemci kullanmıştım. 16-18F  leri pek bilmiyorum. Bilen arkadaşlar yol gösterir.
Microchip'in sitesinde MAPS diye bir uygulama var. Bu kullanarak ihtiyacınızı karşılayacak bir işlemci seçebilirsiniz.
Örnek C kodu isterseniz de sitede aramanız yeterli.

Birde hatırlatma olarak, kullandığınız araca göre değişir ama, bazı araçlarda sinyaller kariştirilarak gönderilir. Örneğin heli 'de e-CCPM gibi. Gelen sinyallerden  komutları anlamak için gelen sinyalleri çözmeniz de gerekir.

ecunnu

#9
benim aklıma şole bir çözüm geldi ama bi fikrinizi almak istiyorum müsadenizle. benim ilgilendiğim pwm sinyali 50 hz ler civarında ve duty %4 ila %14 arasında değisşiyor yani
minimumda %4 duty 800us 5v 19200us 0V
maxsimumda %14 duty 2800us 5V 17200us 0V 

ben eğer 100us oluşan bir timer kesmesi oluşturursam ve kesme fonksiyonunda b portunun ilk 6 bitini kullansam 

örneğin kesme fonsiyonun içine;


     eğer b0 biti 1 ise ;
    {
      i değişkenini bir artır;
    }
     eğer b0 biti 0 ise;
     {
          eğer i !=0 ise;
          {
               i değişkenini a değişkenine ata;
               i değişkenine 0 değerini ata;
               duty_cycle=(a x 100us)/periyot ;
           }       

       
     
     }

aynı işlemleri b1,b2,b3,b4,b5 pinleri içinde aynı işlemleri yapacağım bir bakışta anlaşılabilsin diye boyle yazmayı tercih ettim.böylece her 100us bir portları kontrol edicem ve porttan gelen bilgi 1 olduğu sürece i bir artacak ne zaman ki porttan gelen bilgi 0 olunca i yi sıfırliyacam ve  periyot sabit olduğundan duty hesaplıyacağım ne zamanki porttan gelen bilgi 1 olacak o zaman i değeri yine artmaya başliyacak 20mhz lik bir pic ile yapıcam benim takıldığım nokta bu programımı çok yavaşlatırmı ?? bu programda maksimum durtyi hesaplarken yapacağım hata 100us bir hata olucak kesme süresini azaltarak bunuda kısaltabilirim..

iyildirim

100 us lik kesmelerle saniyede 10000 kesme oluşturacaksınız ve duty çözünürlüğünüz, min 1 max 2ms lik duty için bakarsak sadece 10 gibi bir değer olacak. Ayrıca bunu ölçmek için kesmeden 50-100 clock da çıksanız yaklaşık olarak 20mhz işlemcinin %10-20 gibi bir işlem zamanını kullanacaksınız.

Bu çözünürlük size yetiyorsa ve işlemci nin yapacağı diğer işler de müsaade ediyorsa neden olmasın.

ecunnu

verdiğin bilgiler için teşekür ederim...