4 Kanal Pwm okuma programı - hazır

Başlatan gambit1244, 25 Ocak 2012, 13:58:42

gambit1244

merhaba arkadaşlar
program bitti ve harika çalışıyor
20 mili saniyede 4 kanalı okuyup rs232 cıkışından veriyor
internal 8 mhz ve 4xpll ile 32mhz de çalışıyor
tüm piclerde çalışabilir timer kullanılmıyor yazılımsal olarak yaptım
ccp1 girişine 74153 4 to 1 multiplexer ile 4 kanal pwm girebiliyorsunuz d0 ve d1 bacaklarından mux seçme yapılıyor.

işte kodları
sınırlı programlama bilgimle yaptım öneri ve geliştirmelere açığım
soru olursa cevaplamaya calışırım
sağlıcakla
#include <18F4580.h>
#fuses HS,NOPROTECT,NOLVP,NOWDT
#use delay(internal=8Mhz , clock=32Mhz)



#use rs232(baud=38400, xmit=PIN_C6, rcv=PIN_C7)

#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
int x=0;
int t=0;
int sira=1;
int k[5];
#INT_CCP1   // INT_CCP1 kesmesi fonksiyonu
void yakala1_kesmesi ()
{
if(x==1)
x=0;
else
x=1;
}






void main() {


   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
  
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı

   set_tris_b(0x00);   // B portu komple çıkış
   set_tris_d(0x00);   // B portu komple çıkış
   set_tris_c(0x07);   // RC0, RC1 ve RC2 pini giriş

   output_b(0x00); // İlk anda B portu çıkışı sıfırlanıyor
   output_d(0x00); // İlk anda B portu çıkışı sıfırlanıyor
   setup_ccp1(CCP_CAPTURE_re); // CCP1 kesmesi yükselen aktif// fe olursa düşen
  
 
   CCP_1_HIGH=0x00; // CCPR1H kaydedicisi sıfırlanıyor
   CCP_1_LOW=0x00;  // CCPR1H kaydedicisi sıfırlanıyor
   

  
   enable_interrupts(INT_CCP1);  // INT_CCP1 kesmesi aktif yapılıyor
   enable_interrupts(GLOBAL);    // Aktif edilen kesmelere izin ver
   
   k[1]=0;
   k[2]=0;
   k[3]=0;
   k[4]=0;
   
   Delay_ms(10);
   printf("START!");
   Delay_ms(10);

   while(TRUE) 
   {
   output_d(sira-1);
   delay_ms(1);
   setup_ccp1(CCP_CAPTURE_re); 
 while(x==0)
 {
 //output_d(1);
 }
 if(x==1)
 {
 setup_ccp1(CCP_CAPTURE_fe);
 while(x==1)
 {
 t++;
 delay_us(15);
 }}
 x=0;
 
 k[sira]=(t+160);

 sira++;

  if(sira==5)
 {
 printf("%d*%d*%d*%d"k[1]*(-1),k[2],k[3]+25,k[4]);

 sira=1;
 delay_ms(1);
 }

 t=0;

 

}
}
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

VFR

Programı okudum biraz ama anlayamadım mantığını.
20ms içinde 4 kanalı da okuyor mu?
Bir kanalın okunması bitmeden diğer kanala geçmek mantıklı mı bilginin kaybolmaması için?
Sırayla okuyunca doğru bir şekilde okunur ama bu sefer de geç bilgiyi almış oluruz o da çok kötü olur.
Biraz açıklayabilir misin programı?

gambit1244

1 kanalı bitirmeden diğerine geçmiyor

önce pwmin yükselen kenarını bekliyor
yükseldimi saymaya başlıyor 1 - 2 - 3 -4 diyelimki 4 dediğinde düştü kesme aktif oldu ve 4 numarasını çıkışa veriyorum
sonra mux u bir arttırıp diğer kanala geçiyorum
sırasıyla 4kez yapıyorum bunu

saniyede 50 kez seri porttan 4lü pwm çıkışı alabiliyorum
yani 20ms de 4 kanalı okuyor
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

VFR

Hocam şimdi pwm periyodu 20ms, bir kanalı okumayı bitirdikten sonra diğerine geçiyorsak nasıl 20ms'de 4 kanalı okuyoruz orasını anlamadım.

skara1214

pwmlerin periyodu 20 ms değil mesela birtanesi nin frekansı 1 Mhz  onu okuyor sonra ikinciye geçiyor okuyor 3. geçiyor okuyor e 4 cüye geçiyor okuyor sonrada 20 ms de bir  bilgisayara atıyor(yani tüm okumaları 20 ms içinde bitireceğini öngörüp 20 ms de bir yolluyor-10 ms tutarsa toplam 4 kanalı okumak 10 ms de bekliyor) burda asıl sorun 50 hzden düşükleri okuyamaması bence zaten piclerin ürettiği  pwm okuması yapacaksa 100 hzden aşağı üretemiyeceği için sıkıntı yok
Herkes ölür ama herkes gerçekten yaşamaz

gambit1244

pwm sinyali rc kumandalarda genelde şöyle bir kare dalga olur
duty nin çoğu negatif azı pozitiftir

00110000000    =%2 duty

01000000000   =%1 duty

01110000000   =%3 duty

(yanlış hatırlamıyorsam) bu duty oranı %5 ile %9 arasında değişir daha fazla olmaz
hal böyle olunca komple okumasını beklemektense
sadece birleri okutuyorum
hem birleri hem sıfırları okutsaydım ozaman 20 ms herbir kanal sürerdi haklısın

@skara ben bu devreyi sadece rc kumanda alıcısı için tasarladım oyüzden 20ms kota koydum
anlatımın çok doğru tamda dediğin gibi yaptım en stabil halini belirledim 20ms olarak :D
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

VFR

RC kumanda okuyacağım ben de.
Yeni başladım bu işe o yüzden bilmiyorum kusura bakmayın.
RC kumandanın alıcısından aldığımız bilgi 50HZ'lik pwm değil mi?
ESC'ler 50HZ ile sürülüyor değil mi?
Bu soruların cevabını bulmam lazım öncelikle.
RC kumandaların verdiği bilgi duty olarak kaçla kaç arasında bir de bunu da öğrenmek istiyorum.

gambit1244

#7
hayır değil
rc kumandalarda servoları standart sürebilirsin

fakat esc ler çok farklı

esc için 2 3 değişik mod bulunuyor.

eğer quadcopter yapacaksan escler için 50hz yeterli değil

400 hz kullanman gerekir (ki çoğu gelişmiş kart 400 hz çıkış verir)
50 hz ile de esc sürersin ama tepkime süresi yavaş kaldığı için quadcopterleri iyi kontrol edemez

sen tam olarak neyde kullanacaksın ona gore yardım edeyim

mesela bu işi gerçekten yapıcaksan 30 liralık logic anayzerlerden bitane almanı tavsiye ederim çok faydası oluyor
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

VFR

Hocam quadrotor yapacağım.
Kumandam HK'nın dandik kumandasından.
ESC'lerim de şundan : http://www.hobbyking.com/hobbyking/store/uh_viewItem.asp?idProduct=17135

Aklımdaki sistem şu, 16F819 ile kumandadan veriyi okumak ve PWM'i oluşturmak.
4 kanal 50HZ PWM oluşturdum şu anda ama okumayı daha yapamadım.
Onunla uğraşıyorum.

Eğer frekanslar farklı olcaksa ona göre yapayım.
Şimdi kumanda kaç HZ bilgi veriyor ve ESC kaç HZ PWM istiyor onu kesinlikle öğrenmem lazım.

gambit1244

#9
kumandadan 50 hz okucaksın.

ama kumandaya ihtiyacın yok kendine bitane alıcı verici yap daha güzel olur
bu alıcıyıda pice bağla
pic çıkışlarını test et
escler yeniyse 400 hz uyumludur. deneye deneye bulucaksın

şöyle bişey var bunu bilmen lazım

escye ilk elektrik verdiğinde önce düşük duty vermen lazım.
düşük duty vermezsen esc çalışmaya geçmez. bunun amacı kumandayı sıfıra indirdiğinden emin ol pili takar takmaz motorlar çalışıp ellerin parçalanmasın mantığıdır.
düşük duty i verince zaten motor bibip diye öter artık verdiğin her sinyali döndürmeye hazırdır sinyalidir bu izmirdeysen yardımcı olurum

özetle şöyle söyliyim sensör olmadan bu iş biraz zor
accelerometer ve gyro kullanman lazım


bunuda okuyabilirsin az once gordüm belki mantık açısından işine yarar. ayrıca kafana takılan her şeyi ö.m atabilirsin
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

VFR

Eğer esc 400HZ ile çalışıyorsa donanımsal olarak pwm üretebilirim bu güzel olacak.
Onu araştırayım ben bi.

Aslında ben de kumanda kullanmak istemiyordum ama uzun mesafeler için gerekiyor illaki.
İlk denemelerde çok kolaylık sağlar RF modülle çalışmak aslında.

Dün gece IMU verisi okumaya çalıştık zaten. IMU Fusion board kullanıyorum.
Bir şeyler okudum ama daha tam hakim olamıyorum şu anda. Biraz daha çalışmam lazım üzerinde.

Malesef izmirde değilim. Ama yine de çok yardımın oldu teşekkür ederim.