Pwm Decoder Entegresi varmı?

Başlatan gambit1244, 14 Ocak 2012, 20:36:25

SpeedyX

CP kullanılarak güzel olur zaten ama 5 kanal okumaya yetecek kadar CP destekli pin var mı işlemcide?

gambit1244

meraba arkadaşlar, ustadlar

pic +ccs c ile bu işi yapmaya calısıyorumda
bir sorum var minimum kesme süresini en az kaç uS yapabilirim uğraşa uğraşa 60uS ye kadar düşürdüm
fakat devrenin frekansı 4Mhz idi
bunu 8 yaparsam bu sürem düşermi
yoksa timer birimi frekansını içerdeki rc osilatördenmi alıyor
yardımcı olursanız cok sevinirim saygılar.
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

SERRO EFE

Eğer timer0 kullanıyorsanız prescalar minimum 1/2 oluyor(timer için) diğer timerlar 1/1 prescalar çalışabiliyor.
Yani siz denemenizi timer0 la yapmışsanız diğer timerlarla 30 us ye düşürebilirsiniz.
Ayrıca hesap kitap yapmak istemiyorum diyorsanız linkten timerlar için ayarları yaptırabilirsiniz.
http://eng-serve.com/pic/pic_timer.html

muhittin_kaplan

Hocaların yardımı ile STM32F4 ile ölçüm yapıp pc ye gönderdim. orada yazdığım küçük bir uygulama ile progressbar durum alıyor.
şimdi sorum şu,
Her Ölçülecek Kanal için bir timer şartmı ?
Bana Sistemi gereksiz kullandığımı başka bir yolunun olacağı/olması gerektiği gibi bir düşünceye sürüklüyor. Kendime Vesvesemi veriyorum  ::)

muhittin_kaplan

Alıntı yapılan: iyildirim - 16 Ocak 2012, 22:49:05
SpeedyX hocam,
Bazı alıcılarda senkron bilgisini içeren sinyal ayrı bir pin ile dışarı taşınıyor. Benim alıcımda var.  Bu pini de dahil edip OR larsak tam olarak dediğiniz gibi yapılabilir. Ama alıcıda senkron sinyali dişarı taşınmamış ise bu durumda kanal numarasını bildiğimiz bir kanalı işlemcide ayrıca GPIO pinine girip, yükselen kenar kesmesi sırasında bu pinin durumuna bakıp, pin  HIGH ise şu anda extra bağladığımız kanal aktif şeklinde bir senkronizasyon kurmak da mümkün.

Kumanda modifikasyonu içinde kullanılan verici alıcı çifti ne kadar basitse, modifikasyon da o kadar basit oluyor denebilir.

Benim 6 kanal heli kumandasında bir mikro ADC ile potları okuyup, tek bir pinden sıralı çıkış veriyor. Bu pinin çıkışıda RF vericinin girişine bağlı.

Manuel modda heliye e-CCPM modda karıştırılmış sinyaller gidiyor.  Ki kumandanın orijinali de bu.

Manuelden yarı otomatik moda geçip,  komutların servoları değilde, heliyi kontrol etmesi için için boş olan 5 kanala bağlı head lock gyro için kullanılan anahtarı kullanıyorum. Bu durumda kendi işlemcim potları okuyup RF modüle kendi ürettiği  karıştırılmamış darbeleri gönderebiliyor.   
Alıcıda modifikasyon gerekmiyor. Sadece kontrol işlemcisi 5 kanala bakıp servo darbelerine müdahalemi edecek yoksa tamamen kendi mi üreteceğine  karar veriyor.

Standart PPM kullanan bütün alıcı vericilerde bu yöntem çalışabilir. 
Standart'a göre max duty 2ms olduğundan teorik olarak max 10 kanala kadar standart PPM çalışabiliyor. 

Aynı şekilde alıcı tarafta RF çıkışına bir çengel atılırsa elde edilen sinyalin işlenmesi de aynen SpeedyX in söylediği gibi olacak.

Çok kanallı alıcı-vericilerin bazılarında baştaki 1 ms boşluk süresi azaltılıp yer açılmaya çalışılan DIY sistemleri nette gördüm. Vericide azaltılan miktar alıcıda duty'ye ekleniyor. Bazılarında da 50Hz  frekans örneğin 25Hz'e düşürülüp, alıcı tarafında son gelen duty değeri 50Hz de gönderiliyor. Yani son duty değerinde iki puls gönderiliyor.
Ki bu tip modifikasyonlarda yukarıda bahsedilen OR lama yöntemi çalışmayacak.
Hocam Burada şekilli şemalli anlatmışlar sizin bahettiğiniz olayı,
http://paparazzi.enac.fr/wiki/RC_Receivers_and_Radios#R.2FC_Receiver_Interface

SpeedyX

#65
Mesela 7 pini hem porta hem de orlayıp tek bir kesme/ccp pinine versek yine az kaynak kullanarak bu işi yapamaz mıyız? Kesme geldiğinde tüm portu değerlendirip timer değeri alıp ekleyen bir mekanizma kullanılabilir.
STM de tüm pinlerde kesme var heralde, ozaman ek kesme pini olmadan bu kesmeler kullanılarak ve 1 timer kullanılarak çok rahat yapılır.
Neden adc olayına sıcak bakmıyorsunuz ki?

muhittin_kaplan


gambit1244

Alıntı yapılan: muhittin_kaplan - 24 Ocak 2012, 15:10:13
ADC de deneyeceğim artık.

hocam ben yazdım programı ccs c ile
son düzenlemeler ile 20 ms de 4 kanalı okuyup çıkışa veriyorum / 4 kanal yaptım elimde hazır mux vardı oyüzden 8 de yapılabilir ufak bir değişiklik ile
tamamen kusursuz çalışıyor hiçbir hata gözlemleyemedim
ben her kanalı (-15 +15) 30 hassasiyete bölerek okuyorum bu sayıyı istersek 200 e kadar çıkartabiliyoruz
en ucuz 8mhz internal osc olan bir picle yapılabilir
3 kb program kodum var sanırım 12f serisi için yeterli



#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 a=0;
int t=0;
int sira=1;
int k[5];

#INT_CCP1   // INT_CCP1 kesmesi fonksiyonu
void yakala1_kesmesi ()
{
if(a==1)
a=0;
else
a=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(a==0)
 {
 //output_d(1);
 }
 if(a==1)
 {
 setup_ccp1(CCP_CAPTURE_fe);
 while(a==1)
 {
 t++;
 delay_us(15);
 }}
 a=0;
 
 k[sira]=(t+160);

 sira++;

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

 sira=1;
// delay_ms(100);
 }

 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.

muhittin_kaplan

işlemi bir pic ve birde mux ile çözdün. bunu ana işlemciye nasıl göndereceğiz ?

SERRO EFE

Neden ana işlemciye göndermekle uğraşacaksınız. O kodları ana işlemcide çalıştırsanız daha kolay olmazmı? Sonuçta 1ccp modülü kullanıyor.

muhittin_kaplan


SERRO EFE

ccp kesmesi çalışıyor anladığım kadarıyla. Bu şartlarda sinyalin her düşen ve yükselen kenarında kesme oluşması gerekir yani rc sinyali minimum 1 ms olduğuna göre en düşük kesmeye gitme süresi 1ms olacaktır. Diye düşünüyorum :)

muhittin_kaplan

1 adet mux ı 4 adet (kanal sayısına göre) MCU çıkışı ile kontrol ederek tek bir sinyal e çeviriyor. ve onu ölçüyor.
ölçeceğim herzaman bu kanalları taramam gerek. aslında birde iyi tarafı var istediğimde istediğim kanalı doğrudan okurum.

SERRO EFE

Evet istenen kanalı direk okuma kolaylığı getiriyor ama pin sayısı artıyor. Size kaç adet servo girişi lazım şu anki yapıda 4 yeterlimi 5 mi olması gerekiyor.
edit: pin sayısı artmaz kullandığı mux'a göre

SERRO EFE

@gambit hiç mux ile uğraşmadan bu iş kolayca yapıbilir.(gibi)
Senin pwmlerinin hiç üst üste binmediğini kabul ediyorum. Bu durumda portb change kesmesini kurarsan gelen her change kesmesininde hangi pinden geldiğini tespit edip yükselen kenarlarında bir timer çalıştırsan( hepsi için 1 timer yeter) düşen kenarında timerı okursun.
Okuduğun değer pwm süren olur.
Çözünürlük yüksek olsun dersen 16 bitlik timer kullanılabilir.