Pf hesabı ve kompanzasyon
  • Yapacağım projede algoritmada sıkıntı yaşıyorum sistemde akım ve gerilim bilgilerini aldıktan sonra 2 kare dalgayı karşılaştırarak geri veya ileri olduğunu nasıl bir algoritma oluşturarak yapabilirim ?
  • İleri veya geri dediğiniz durumlarda aldığınız kare dalfalar farklı mı geri ileri dediğiniz bir motor mu biraz daha bilgi ve varsa denediğiniz kod konuyu gören arkadaşların konuyu anlamalarına ve o yönde cevap vermesine yardımcı olacaktır
  • Şebekeden gelen gerilim değeri ile yüklerin çektiği akım bilgisini akım trafosu yardımıyla sıfır geçişli devreye sokarak darbe genişlikleri eşit olan 2 kare dalga elde ediyorum. Algoritmadaki amacım bu 2 kare dalgayı karşılaştırarak akımın ileri fazda mı yoksa geri fazda mı olduğunu öğrenip kompanzasyon için gerekli röleleri açmak

    if(angle_max<5.75)<br /> {
    display.print(" Omik...");
    }
    else if(digitalRead(PB3)==HIGH && digitalRead(PB4)==LOW)
    {
    display.print(" Geri...");
    }
    else if(digitalRead(PB3)==LOW && digitalRead(PB4)==HIGH)
    {
    display.print(" ileri...");
    }
    display.display();


    bu algoritmayı oluşturdum fakat doğruluğundan emin değilim. Daha iyi bir sonuç almak için nasıl bir algoritma oluşturabilirim
  • 2 pinde de okuma zamanı T anında olmadığından yanlış bilgi gelmektedir. Sadece ilk else if yapısına giriyor. Sistem ileride olduğunda da "geri" yazıyor. Bitirme çalışması için acilen çözmem gerekiyor bu konu hakkında yardımcı olabilecek birisi var mı ?
  • #include < Wire.h>
    #include < Adafruit_SSD1306.h>

    #define OLED_RESET 4
    Adafruit_SSD1306 display(OLED_RESET);


    int pin = PB5;
    int role1=PB14;
    int role2=PB15;
    int role3=PB3;
    float rads = 57.29577951; // cos'u hesaplatmak için açıyı radyana çeviriyor.
    float aci = 360;
    float frekans = 50;
    float katsayi = 1 * pow (10,-6);// microsaniyeyi saniyeye çevirmek için kullanılan katsayı
    float pf;
    float angle;
    float pf_max = 0;
    float angle_max = 0;
    int a=0;
    int ctr;


    void setup()
    {
    Serial.begin(9600);

    pinMode(role1, OUTPUT);
    pinMode(role2, OUTPUT);
    pinMode(role3, OUTPUT);
    pinMode(PC13, OUTPUT);
    pinMode(PB12,INPUT);
    pinMode(PB13,INPUT);
    display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // oled ekranın başlaması için gereken kod
    attachInterrupt(PB12, zcd, RISING);


    }


    void loop()
    {
    pinMode(pin, INPUT);
    digitalWrite(PC13, HIGH);
    delay(200);
    digitalWrite(PC13,LOW);

    for (ctr=0; ctr <= 10; ctr++)<br /> {
    angle = (((pulseIn(pin, HIGH)*katsayi)* aci)* frekans);

    if (angle > angle_max)
    {
    angle_max = angle;
    pf_max = cos(angle_max / rads);
    }
    }
    if (angle_max > 160)
    {
    angle_max = 0;
    pf_max = 1;
    }
    if (angle_max == 0)
    {
    angle_max = 0;
    pf_max = 1;
    }
    if(pf_max<90)<br /> {

    if(pf_max<=0.10)<br /> {
    digitalWrite(role1, LOW);
    digitalWrite(role2, LOW);
    digitalWrite(role3, LOW);
    }
    else if(pf_max<=0.31)<br /> {
    digitalWrite(role1, LOW);
    digitalWrite(role2, LOW);
    digitalWrite(role3, LOW);
    }
    else if(pf_max<=0.46)<br /> {
    digitalWrite(role1, LOW);
    digitalWrite(role2, LOW);
    digitalWrite(role3, LOW);

    }

    else if(pf_max<=0.60)<br /> {
    digitalWrite(role1, LOW);
    digitalWrite(role2, LOW);
    digitalWrite(role3, LOW);

    }

    else if(pf_max<=0.72)<br /> {
    digitalWrite(role1, LOW);
    digitalWrite(role2, LOW);
    digitalWrite(role3, LOW);

    }
    else if(pf_max<=0.84)<br /> {
    digitalWrite(role1, LOW);
    digitalWrite(role2, LOW);
    digitalWrite(role3, HIGH);
    }
    else
    {
    digitalWrite(role1, HIGH);
    digitalWrite(role2, HIGH);
    digitalWrite(role3, HIGH);
    }
    }

    display.clearDisplay();

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(0,0);
    display.print("Power Factor= ");
    display.setTextColor(WHITE,BLACK);
    display.println(abs(pf_max));
    display.print("Faz Kaymasi= ");
    display.setTextColor(WHITE);
    display.println(angle_max);
    display.setTextSize(1);
    display.println(" ");

    if(a==1)
    {
    display.print(" ileri ... ");
    }
    else if(a==0)
    {
    display.print(" geri ...");
    }
    else if(angle_max<5.75)<br /> {
    display.print(" omik ...");
    }

    display.display();
    delay(5000);
    angle = 0;
    angle_max = 0;
    a=0;
    interrupts();
    }

    void zcd() {

    if(digitalRead(PB3)==LOW)
    {
    a=1;
    }
    noInterrupts();
    }



    Artık kesme kodundan sonra hiç ekran açılmıyor kesme kullanmadan once pf yi hesaplayabiliyordum
  • dostum rotary encoderlar da kare dalgaları karşılaştırıp ileri geri bilgisi ile ilgili değer döndürtebiliyor.



    incelemek faydalı olabilir
  • hocam sıfır geçiş anlarında ıkı farklı tımerı başlatman veya resetlemen lazım birde bu fazların tepe veya dip noktalarını da olcersen burada ılerı gerı cıkarımı yapman daha kolay olmaz mı.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.