Kablosuz Seri İletişim ile PWM dalgası üretmek

Başlatan designer.21, 23 Kasım 2019, 07:31:04

designer.21

herkese merhaba; yapmak istediğim basit bir helikopter çalışması var, sadece aşağı yukarı yönlü hareket etse yeter. yani motorun hızını ayarlayabileceğim kumanda olsun istiyorum.
 
 forumdaki bilgilerden yararlanarak 433Mhz lik alıcı ve vericileri seri iletişim yolu ile haberleştirdim. buraya kadar sıkıntı yok ama verici modulde(kumanda) bulunduracağım bir potansiyometre(veya başka bir yöntem) ile alıcı modulun pwm dalgasını ayarlayarak pervanenin hızını değiştirmem mümkün mü acaba.

umarım ne demek istediğimi anlatabilmişimdir : )

MB_77

#1
bu mesaj tarafımdan silinmiştir.

mg1980

Haberleşmeyi sağladığınıza göre "pwm" için şifre gönderin,alıcı da onu çözüp yapmak istediğinizi yaptırın...

ete

Madem henüz bir çalışman yok sadece nasıl yapılabileceği konusunda bilgi vereyim.
Malum arada RF haberleşme var hemde RS232 (USART) üzerinden yapılacak.
Önce vericiden başlayalım. Verici devrendeki işlemcide Analog okuma (ADC) özelliği+Donanımsal USART özelliği olması gerek  (12F1822, 16F1827 gibi)
Verici yalnızca el kumandası (elcik diyeim) dan gelen komutları kullanıp karşıya bunları iletecek.
PWM işine girince iki parametre kullanman gerekiyor. Birincisi start/stop yani çalış/Dur bilgisi ikinciside Hız yani PWM nin Duty değeri bilgisi.
Haberleşme detaylarını vermediğin için (en azından başka emirler varmı yokmu biliyoruz) yalnızca Başla/Dur komutu ile hız bilgisini iletmeyi açıklayacağım.
Verici sisteminde bu durumda bir Çalış bir Dur (veya tek düğme ile toggle çalışma da basınca başla tekrar basınca dur şeklinde) bir emir üretilecek. Bunu bir byte değişkenine verelim. Aslında BIT de olur ama RF ile yollanacak bilgiler BYTE olacağı için byte kullanalım dedim.
Dur=0 olsun Çalış=10 olsun. Yani Tuşa bir kere basınca DURUM=10 olacak. Tekrar basınca Durum=0 olacak  (DURUM=10-DURUM komutu bunu yapar).
İkincisi POT konumunu okuyarak buradan bir duty değeri üretecek. DUTY değeri tamamen motora vereceğin Frekans ve ona bağlı hız ile alakalı bir durum olmalı.Örnek veriyorum. ALıcıdaki motoru 10Khz frekansında bir PWM ile sürecek isen ve OSC frekansın 8 Mhz ise  10Khz lik frekansı üretmek için TMR2 de 1/1 bölme oranı ile PR2=199 allman yeterli olur. Bu durumda Duty değerin max. 800 olacaktır. (Bütün bunları PicMultiCalc.exe isimli basit bir programdan alıyorum, hesaplamakda mümkün ama çok zaman alıyor)
Şimdi yapılması gereken POT okumada potun sıfır konumunda Duty=0 ve Potun Maksimum konumund aise DUTY=800 değerini üretecek bir formül bulmakta. Buda basit 800/1023=‭0,7820136852394917‬
BU sayıyı 256 ile çarparsak (*/parametresini kullanacağımız için) 200,195 değerini buluyoruz.Biz bunu 200 olarak kullanalım. Böylece potun maksimum değerinde hesaplanacak değer 799 olacaktır ki genellikle maksimum duty (800) değerini pek kullanmak istemiyorum, sonuçta 799 ile 800 arasında zaten bir fark olmuyor. O halde formülümüz HIZ=(HAM_ADC */200) formülü ile hesaplanacaktır.
Dikkat edersen hız değerimiz 255 den büyük olabiliyor o halde bu değişken WORD tipinde olmalı.
ELimizde Hız bilgisi (Hız.Byte1 ve Hız.Byte0 olarak kullanılacak) ve açık/kapalı  bilgisi mevcut. Karşı tarafa 3 byte yollanacak.
HSEROUT [REP$AA\5,REP$00\5,REP$FF\5
HSEROUT ["E","T","E",DURUM,HIZ.byte1,HIZ.Byte] komutları ile yollanabilir.

Gelelim ALıcıya. ALıcıdaki işlemcide hem USART hemde HWPM özlliği olması gerek. (12F1822 veya 16F1827, 16F1825 gibi işlemcilerle olabilir).
USART kesmesi ile çalışacak sistem. Şayet USART dan geçerli bir bilgi gelmiş ise ALDIM isimli bit değişkenini set edersin.
Ana program kısmında ise IF ALDIM=1 ise yeni gelen bilgileri değerlendirmeye alırsın.
Başlangıçta PWM kapalı olur. Aldım=1 olunca ve gelen bilgide DURUM=10 ise CCPCON=%00001100 vererek PWM yi aktif edersin.
Sonra Gelen Duty bilgisini aşağıdaki alt programa vererek Duty sinyalini açmış olursun hemde istediğin frekans ve hızda. Her yeni gelen sinyali değerlendirdiğinde ALDIM=0 yapman gerekir ki aynı komutları sürekli işlemesin program.
PWM_VER:
      X=DUTY
      CCP1CON.4=X.0
      CCP1CON.5=X.1
      CCPR1L=x>>2
      RETURN
Tabiiki alıcıda PR2=199 ve T2CON=%00000100 değerlerini vermen gerekir. Böylece sistem 1/1 bölme oranı ile ve frkans da 10Khz ile açılmış olacaktır.
SOn olarak kesme kısmınıda yazayım da sorun yaşamayasın.

DISABLE
KESME:
HSERIN 10,ATLA,[WAIT("ETE"),DURUM,HIZ.BYTE1,HIZ.BYTE0]
ALDIM=1
ATLA:
TEM=RCREG
RESUME
ENABLE

Hepsi bu kadar.
Anlaşılmayan bir husus olursa sorarsın.
BUradaki kod örneklerini BASIC (PBP) temelli olarak verdim. Şayet başka bir derleyici kullanıyor isen sadece mantığını kullanırsın. Zaten haberleşmeyi yapabildiğini belirtmişsin gerisinide halledersin sanırım.

Ete

designer.21

öncelikle cevaplarınız için çok teşekkür ederim.
iki pic'i rf aracılığıyla potansiyometre kullanarak pwm dalgası gönderilebileceğini hiç ummuyordum. bu benim için çok büyük bir olay

size komik gelecek ama; ben böyle bir devreyi yaparsam benim için nirvana ulaşma seviyesi olur o derece : )

cevap yazan hocalarıma tekrar teşekür ederek konuya geçmek istiyorum.
Sayın Ete hocam benim yapmış olduğum devre, 433 MHz alıcı verici modülü ile 16f628 kullanarak yaklaşık  80-90 metre mesafeli 4 kanallı(ileri-geri-sağ-sol) bir uzaktan kumandalı araba yaptım. onu da hazır kodları alıp yaptığım için konuya pek hakim olamadım, ama şimdi bahsettiğiniz işlemci modelinden alıp, sizin yazdığınız bu paylaşımı ve forumda mevcut olan "seri iletişim" konusunu tekrar tekrar gözden geçirip mantığını kavrayıp bahsetmiş olduğum projeyi yapacam inşallah.

hiç bir yerde arayıp ta bulamadığım bu değerli paylaşımınız da ders notlarım arasında yerini aldı hocam. Teşekkürler

Dtmf

Simdilik basit modulle calis.bit tik ileri gitmek istediginde hc-12 kullan 1000m ama baud rate degerinden dolayi boyle pot lu uygulamalar da 500-600m gayet iyi sonuc veriyor

designer.21

Sayın Dtmf; mesafe belirleyicisinin frekans değeriyle orantılı sanıyordum. benim kullandığım 433 MHz lik modül en fazla 100 metreye kadar etkili, ama sizin belirttiğiniz module baktım da dediginiz gibi açık alanda 1000 metreye kadar olduğu belirtiliyor.

hc12 de 433 MHz lik bir frekans ile çalışıyor. her iki modül de aynı frekansta çalışmasına rağmen nasıl oluyor da mesafeler değişebiliyor. mesafeyi belirleyenin frekans değeri olduğunu sanıyordum.

vermiş olduğunuz bilgiler için teşekkür ederim yeni birşey daha öğrenmiş oldum : )

bu konuyla alakalı, konuyu kavrayabilmek için elinde bir kaynak doküman, belge, pdf olan varsa paylaşabilir mi acaba.

ete

Mesafe frekansla bağlantılı değil. Frekans denilen şey bilgiyi taşıyan sinyaldir sadece.
Mesafe, tamamen vericinin gücü ile alakalı bir özellik.
Dediğin doğru olsaydı her mesafe için ayrı frekans olması gerekirdiki incelersen bu işler için arılmış frekanslar olduğunu görürsün. RF haberleşme için ayrılan aralık 300-3GHz arasıdır. Her iseteyen her istediği frekansta verici alıcı yapamıyor. Bütün dünyada sistem aynı. Daha detay gerekirse RF haberleşme için genellikle 315Mhz - 433Mhz - 815Mhz ve son olarak 2,4Ghz frekansları kullanılıyor.
Yollanacak yada alınacak bilginin cinsine yada hızına bağlı olarak frekans da değişebilir. Mesela ses ve görüntü aktarımında yalnızca 2,4Ghz kullanılıyor. Tabiiki data alışverişlerinde en çok kullanılan frekans 433 ve 433,92Mhz dir.

İnternette bolca kaynak mevcut. Yapman gereken RF Frekans yada RF haberleşme kekimelerini yazıp aramak.

Ete

designer.21

verdiğiniz bilgiler için teşekkürler Ete hocam

Dtmf

Sayin ete hocamizin dedigi gibi.designer vericinin gucu mW veya W olarak bide alicinin hassasiyeti dbm olarak olculur ikisi ayrilmaz ikilidir.

Powered by EzPortal