Timer1 ile puls aralık zamanını ölçmek

Başlatan ergün, 18 Temmuz 2018, 18:52:18

ergün

Öncelikle gecikme için herkesten özür dilerim, malum günümüz piyasası artık dahada zor ($  :-X ). Konuya geri dönelim, @MB_77 tavsiyesi üzerine (16f866) gate control modülü olan bir işlemci ile devreyi simule ettim. Öngörüldüğü gibi çok az sayılacak bir sapma ile hesaplanabiliyor. Gerçek hayatta durum aynı, devreyi kurup denediğimde sonuç olumlu oldu. Lakin bu komut dizinine ekleme yapmak istediğimizde durum biraz karışıyor. Mesela analog okuma gibi durumlar dengeleri değiştiriyor sanırım,

/*
Komparator kesme uygulaması
Ver:1
pic16f886
4MHz
*/

int timer1_reg=0;
int zmn1=0;
int zmn2=0;
int ref=0;
int inp;
//int bay = 0;

char txt[16];

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;

#define fled portc.rc0
#define nor  portc.rc5


void init(){
porta=0;
portb=0;
portc=0;
  TRISA = 0x0f; // RA1(-) and RA2(+) as inputs, the rest outputs
  ANSELH =0;// 0x06; // RA1(-) and RA2(+) as analog inputs, the rest digital outputs
  INTCON= 0xC0; //Enable global interrupt,Enable peripheral interrupt

  ADC_Init();

  /* Configure Comparator module */
    C1ON_bit = 0; // OFF comparator 1
    C2ON_bit=1; // ON comparator 2
    C2OE_bit=0; //internal output
    C2POL_bit=0; // non-inverted polarity
     T1GSS_bit=0;
     C2SYNC_bit=1;
    C2R_bit=0; // C2VIN+ connects to C2IN+ pin (non-inverting terminal)
    // C12IN1- pin of C2 connects to C2VIN- (Inverting Terminal)
   C2CH1_bit=0;
   C2CH0_bit=1;

  trisc = 0b10000000;
  trisb = 0b00000000;

  Lcd_Init();
  Lcd_Cmd(_LCD_CURSOR_OFF);
  Lcd_Out(1,1,"Sistem ");
  Lcd_Out(2,1,"Acildi ");
  delay_ms(1000);
  Lcd_Cmd(_LCD_CLEAR);
}

void main()
{
init();
//INTCON = 0b11000000; // GIE ve PEIE global kesmeler aktif
//PIE1   = 0b01000000; // komparatör kesmesi aktif
T1CON  = 0b00000000;
//PIE1.TMR1IE=1;//Timer 1 kesmesi aktif.
T1CON.T1CKPS1=1;  //prsclH
T1CON.T1CKPS0=0; // prsclL

T1CON.T1OSCEN=0;
T1CON.NOT_T1SYNC=0;
T1CON.TMR1CS=0;
T1CON.TMR1ON=1;
TMR1H = 0x00;
TMR1L = 0x00;

portb=0;
nor=1;
fled=1;

delay_ms(1000);
portc=0;


               while(1) {

                        if(C2OUT_bit==1){

                            }
                             else{
                             timer1_reg = (TMR1L | (TMR1H<<8));
                             TMR1H = 0x00;
                             TMR1L = 0x00;

                             intTostr(timer1_reg,txt);
                             Lcd_Out(1,1,txt);

                             if(timer1_reg<3500){
                              nor  =1;
                              fled =0;

                                       }
                             else {
                              nor  =0;
                              fled =1;

                         }

                         }

                      }



}

MB_77

#16
bu mesaj tarafımdan silinmiştir.

ergün

Merhabalar;
   Gecikme için kusura bakmayın, aslında program faz takibi yapmak için, sıralarını ve genlik kontrolünü yapacak, bunun için logic kapılardan da faydalanılabilirdi biliyorum, ama amaç
bunu bu şekilde de yapmaya çalışmak. Fakat mantığını doğru kurduğumu düşünürken bir sürü yeni şey çıktı :), üzerinde çalışıyorum hala. Yardımlarınız için tekrar teşekkür ederim.

MB_77

#18
bu mesaj tarafımdan silinmiştir.

ergün

#19
Gayet mantıklı, fazlar opto izole olursa voltaj sorunsalları büyük ölçüde ortadan kalkar, fakat hala programda sorun yaşıyorum  :-\ demeye devam

poke53280

#20
Alıntı yapılan: ergün - 18 Temmuz 2018, 18:52:18
Merhabalar;
         Farklı açılardaki puls sinyalleri arasındaki farkı ölçecek bir program üzerinde çalışıyorum, temel mantık komparatör kesmesini kullanarak saymaktı, fakat bunun yerine
her kesmede TIMER1 i bir register a eşitleyip sıfırlayarak aradaki farkı ekrana yazdırmaya çalışıyorum. puls uygulandığında kesmeler düzgün gibi ama ekranda birbirine yakın satabil olmayan
sayılar görüyorum. Yardımlarınız için şimdiden teşekkür ederim.

#MikroPascal #MikroC #PicBasic

Selam,

Faz farkını mı ölçmek mi istiyorsunuz, yoksa pulse genişliğini mi_?
Ölçülmek istenen giriş dijital mi yoksa analog mu_?

elektro77

Alıntı yapılan: pro-TR - 27 Temmuz 2018, 21:52:07
slm yeni nesil mcu larda özellikle timerlerdeki gate kontrolünün işlevi nedir

hocam siz bu yöntemle bir dedektör tasarlayın bence.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

MB_77

#22
bu mesaj tarafımdan silinmiştir.

MB_77

#23
bu mesaj tarafımdan silinmiştir.

poke53280

Alıntı yapılan: ergün - 11 Eylül 2018, 18:35:08

Yüksek mhzli bir mcu seçin ki çözünürlük yüksek olsun.
Farkını alacağınız 2 sinyal için 2 tane capture kullanın.
Vericiden gelenin yükseleninde başlatın, alıcıdan gelenin yükseleninde ilkinin flagını 1 yapın olsun bitsin.
Böylece tüm ölçümü mcuya bırakmış olursunuz. 0 hata.
Ticari bir üründe kullandığım mantık budur.

Selamlar.

ergün

Selamlar;
@MB_77 bu kodu simulatörde deneyeceğim, fakat temel mantıkta hemfikiriz, fazlar arası net olarak ölçülmüş olur. @ Poke53280 alıcı ve verici kısmını tam anlamadım, buradaki temel konu tkomparatör ve timer1 fonksiyonlarını kullanarak 2 faz farkındaki zamanı ölçüp değerlendirmek, fikrini biraz daha açarsan çok sevinirim, şimdiden değerli zamanlarınızı ayırdığınız için teşekkür ederim.

MB_77

#26
bu mesaj tarafımdan silinmiştir.

MB_77

#27
bu mesaj tarafımdan silinmiştir.

ergün

sinyal frekansı 50Hz, belirtmiş olduğun süre bu aralığı rahatlıkla ölçüyor olmalı, emeğine sağlık, kodu reel olarak test edeceğim, sonuçları bildiririm.

Analog

Değerli arkadaşlarım;
Timer1 Gate ile frekans ölçümü yapmak istedim başarılı olamadım. Aynı frekansta her Timer ölçümüm bir birinden çok farklı çıkıyor. Tek periyot ölçüm bayrağını kesme içinde set edersem birden çok kesmeye giriyor ve ölçümlerim arasında birbirine yakın değerler çıkıyor. Faka Tek periyot ölçüm bayrağını kesme dışında, ölçüme başlarken set ettiğimde tek kesmeye giriyor ancak ölçüm sonuçlarının bir biriyle alakası yok.
Kod içindeki K değişkenini kesmeye girip girmediğini takip etmek için koymuştum.
Timer ve Kesme değişkenlerinide bayrakları takip etmek amacıyla koydum.
Frekans hesaplamasında da sorunlar yaşıyorum. Dosyayı ilişikte verdim. Boş bir vaktinizde bakabilirseniz memnun olacağım.
Saygılarımla.

Powered by EzPortal