CSS C'de güç faktörü analizi derleme ve kodlama problemi (PIC16F877A)

Başlatan meslekihesap, 22 Şubat 2017, 13:03:08

meslekihesap

Arkadaşlar selamlar.Elektrik Elektronik Mühendisliği son sınıf öğrencisiyim.Bir kaç haftadır denemediğim yöntem bakmadığım topic kalmadı ama halen sorumun cevabını bulamadım. Üstellik bitirme projesi için bunun yetişmesi gerekiyor.Kıymetli yardımlarınız beni ziyadesiyle mutlu edecektir.Şimdiden teşekkür ederim.İyi çalışmalar dilerim.

Projede amacım PIC'in E0 ve E1 bacaklarına sırayla gelen sinyaller arasındaki zaman farkını E0'a gelen sinyalle başlattığım timere0'ın taşma sayısını E1'e gelen sinyalle öğrenmek ve bunu gerekli formüle koyarak cosfi(güç faktörü) değerini elde etmek.Ama ne yaparsam yapayım zaman farkını elde edemiyorum.

Öncelikle buradan projeni proteustaki görüntüsünü atayım(hangi bacakları kullandığımı belirtmek için)

[IMG]http://i63.tinypic.com/33nxh61.jpg[/img]

[IMG]http://i68.tinypic.com/2q0iuc7.jpg[/img]

CSS C'de hazırlamış olduğum kodlar ise aşağıda.

#include <main.h>
#include <math.h>
#define LCD_ENABLE_PIN PIN_D0
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7

#define A PIN_E0
#define B PIN_E1

 int8 tasma=0;
float zaman=0,aci=0,gf=0;
#include <lcd.c>

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_bit);      //51,2 us overflow


   lcd_init();

   while(TRUE)
   {
      if(input(A))
      {set_timer0(0);
      }
      if(input(B))
      {
      tasma=get_timer0();
      zaman=tasma*52,2*(10^-6);
      aci=zaman*50*360;
      gf=cos(aci);
      printf(lcd_putc,"Guc Fak.=%f",gf);
      tasma=0;
      delay_ms(50);

      }//TODO: User Code
   }

}

ferdem

Kesme kullanmanız lazım. Bu şekilde zor. Bir de iki ayrı pin değil de tek pinde işi halletmek daha mantıklı, akım ve gerilim örneklerini uygun şarta getirip exor yapabilirsiniz.
Öncesinde PIC timer, kesme konularını iyice öğrenmelisiniz. Mesela bir pine gelen pulse uzunluğunu +-1 us doğrulukta PIC e ölçtürebilir misiniz?
Google da benzer projelere baktınız mı...
power factor measurement using ccs c
Forumda, internette çok bol örnek var.

meslekihesap

Alıntı yapılan: ferdem - 22 Şubat 2017, 16:48:13
Kesme kullanmanız lazım. Bu şekilde zor. Bir de iki ayrı pin değil de tek pinde işi halletmek daha mantıklı, akım ve gerilim örneklerini uygun şarta getirip exor yapabilirsiniz.
Öncesinde PIC timer, kesme konularını iyice öğrenmelisiniz. Mesela bir pine gelen pulse uzunluğunu +-1 us doğrulukta PIC e ölçtürebilir misiniz?
Google da benzer projelere baktınız mı...
power factor measurement using ccs c
Forumda, internette çok bol örnek var.
ilgi alakaniz icin cok cok tesekkur ederim.bahsettiginiz tek pinde yapma ve interruplari kullanma projelerini takip ettim.Kucuk bir oranda olsa calisan projeler mevcut.Aslinda benim aklima takilan soru su; " projem su haliyke neden calismaz ? ya da bir mikroislemcide iki event arasindaki sureyi olcmek neden bu kadar mesakatli ?"

ferdem

Hazır fonksiyonlarla basit işlemler yapılıyor ama biraz daha ince bir iş gerektiğinde kolları sıvamak gerekiyor. Aslında yapmak istediğiniz bir kronometreyi doğru zamanda başlatmak ve durdurmak.
Mikrodenetleyici nin register lerini takip ederek, Debug yaparak ilerlemelisiniz, bu önemli bir yetenek, sonrasında işler çok kolaylaşacak.
Microchip in MPLAB'ı vardı, şimdi yeni versiyonları var, CCS ile entegre olup debug yapılıyor. Bu konuya girmeniz lazım.

Yukarıdaki kod neden çalışmaz? İlk bakışta float işlemler arka arkaya yapılmış, tasma değişkeni integer, küsürlü işlemler problemlidir, type casting vs gerekir. cos fonksiyonu radyan alır, derece düşündünüz heralde? Arka arkaya işlemleri sıralamayıp adım adım gitmeli, örneğin: get_timer0() doğru değeri okusaydı atıyorum 176 olacaktı, elle yazıp baktığınızda LCD de doğru değer var mı?
tasma=176;
      zaman=tasma*52,2*(10^-6);
      aci=zaman*50*360;
      gf=cos(aci);
      printf(lcd_putc,"Guc Fak.=%f",gf);
Yok. aci değerini elle yazın bakalım:
      aci=0.5;
      gf=cos(aci);
      printf(lcd_putc,"Guc Fak.=%f",gf);
Bu şekilde parçalara ayırmalısınız. Son olarak tekrar edeyim: register ları takip etmek, Debug olayına girmek şart.

EK: Bu kod ile taşma sayısını nasıl sayıyorsunuz? Taşma saymaya yönelik bir işlem yapılmamış. Taşma olduğunda kesme tetikletebilirsiniz, ilgili kesmeyi kurmanız lazım. Kesme içerisinde tasma=tasma+1 yaparak tasma sayısını sayabilirsiniz.