Faz sırası doğruluğu

Başlatan Akaan, 11 Aralık 2022, 13:37:56

Akaan

Arkadaşlar merhaba. Yardımınıza ihtiyacım var. Örnek kod ile. Ccs c kullanmak gibi bir hata yapmaktayım. 3 faz bir devrede faz sırası doğruluğu yaparak LCD ye yazdırmam gerekiyor. İşlemcim 16f877a Referans fazım harici kesmesi bulunan rb0 da denetleyeceğim 2 ve 3üncü fazlar e0 ve E1 portunda. E0 ve E1 giriş olarak ayarlandı zaten digital giriş çıkış portları. Fazlar arası 120° açı olduğundan 6.66 MS gecikme ile gelen ilk pals doğru olan ikinci faza ait olacak. Sıralamanın rb0 re0 re1 olarak işleme alınması lazım. Oldu ki 5v sinyallerimiz referanstan sonra re0 yerine re1 e geldi ekranda faz sırası yanlış yazacak. Diğer olasılık bir porta hiç sinyal gelmemesi ozaman da faz kopuk yazacak. Yani if rb0 =1 delay_ms 6.66 re0=1 delay_ms re1= 1 faz sırası doğru kabul edilecek. İşin içinden çıkamadım

Serk@n

Devre şeması ve yazılım göndermemiş olmanızdan daha ilk adımı dahi atamadığınızı anlıyorum.

Eğer bunu doğru anladıysam bence ilk atılması gereken adım 220 VAC.yi 0-5V arasında olan bir AC sinyale çevirmek olmalıdır.

Bunun için bir çözüm, her fazın voltajını ayrı ayrı üç trafo ile düşürmek olabilir. Analog girişte voltajı bölen iki yüksek değerde direnç koyarak bir kapasitör ile buraya giriş yaparsınız.

Diğer bir çözüm, her fazı ayrı ayrı bir direnç ve kapasitörden geçirerek ve linear optoküplörleri sürerek picin analog girişlerinden sinyali takip edebilirsiniz. Direnç ve özellikle kapasitör değeri 50 hz.e göre dikkatlice hesaplanması gerekir.

Kesmeden sonra bir timer ile diğer iki fazı kontrol edersiniz.

Başlangıç olarak bunları söyleyebilirim.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

Akaan


Akaan




Resimler PC başında olmadığımdan yüklenmemişti. Yazılım konusunda evet bir arpa boyu yol alamadım

Serk@n

Maalesef ccs c yazılım konusunda ben de yardımcı olamam ama algoritma oluşturma konusunda yardımcı olabilirim.

Donanımla ilgili olarak da şunları söylemek isterim: Seri kapasitör olmadan 680K üzerinde hemen hemen 220V.un tamamı düşecek. Koyacağınız direncin watajı kuvvetli olsa bile bunu karşılamayacaktır. Kutupsuz bir 100nF, 400V bir kapasitör ile voltajın büyük bir bölümünü kondansatör üzerinde tutmalısınız. Simülasyonda çalışması sizi aldatmasın.

Analog optoküplör kullanmamışsınız. Sinyal kare dalga olarak görünüyor. Bütün fazlarda aynı donanım kullanıldığından faz farkını ölçmek için yeterli ve ucuz maliyetli bir çözüm olabilir. Gönderdiğiniz resimde faz farkları bariz görünüyor.

Yazılımda da yapılacak işlem bir timer ile kare dalgaları sürekli ölçüp, yükselen anların veya düşen anların zaman farkını tespit etmek.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

Akaan

400v kutupsuz polyester kondansatör kullanma konusunda haklısınız. Devamlı ölçümde stabil kalması önemli. O detayı atlamışım. Evet sorun ccs c olması. Birçok fonsiyon yazdım ac bir devrenin verebileceği fonksiyonların hepsi şuan sıkıntısız çalışmakta. İki motorun ayrı ayrı ve birlikte çalışması stop swichler yön değiştirmeler Bluetooth kontrolü gibi. Panoya yüksek voltaj vermeden hallettim kart üzerinde. Şimdi iki fonksiyon kaldı. Birincisi faz tespiti ikincisi 0-25A arası ayarlı akım kontrolü. O yüzden değiştirmem söz konusu değil. Maalesef hiç uğraşmadığım bilgim olmayan konuda tıkandım.

Alıntı yapılan: Serk@n - 11 Aralık 2022, 22:16:15Maalesef ccs c yazılım konusunda ben de yardımcı olamam ama algoritma oluşturma konusunda yardımcı olabilirim.

Donanımla ilgili olarak da şunları söylemek isterim: Seri kapasitör olmadan 680K üzerinde hemen hemen 220V.un tamamı düşecek. Koyacağınız direncin watajı kuvvetli olsa bile bunu karşılamayacaktır. Kutupsuz bir 100nF, 400V bir kapasitör ile voltajın büyük bir bölümünü kondansatör üzerinde tutmalısınız. Simülasyonda çalışması sizi aldatmasın.

Analog optoküplör kullanmamışsınız. Sinyal kare dalga olarak görünüyor. Bütün fazlarda aynı donanım kullanıldığından faz farkını ölçmek için yeterli ve ucuz maliyetli bir çözüm olabilir. Gönderdiğiniz resimde faz farkları bariz görünüyor.

Yazılımda da yapılacak işlem bir timer ile kare dalgaları sürekli ölçüp, yükselen anların veya düşen anların zaman farkını tespit etmek.

mehmet

#6
Diğer yerde cevapladım. Süre kısmından
devam edecekseniz benim yazdıklarım
size yaramaz.
Ayrıca CCS C bilmiyorum. XC8 ile
yardımcı olabilirim.
Müsait bir zamanda prensip kodları
yollarım.
Ancak bunu siz de yapabilirsiniz.
RB0/INT ile harici kesme kodu oluşturun.
unsigned int türünde bir genel bir
değişken olsun.
durum = (PORTEbits.RE1 << 2) | (PORTEbits.RE0 << 1) | (PORTBbits.RB0);
if(durum == 0b101)
{
    yon = 1; //Mesela sol
}
else if(durum == 0b011)
{
    yon = 2; //Mesela sağ
}
else
{
    yon = 0; //Hata durumu
}
Kendinize göre düzenleyebilirsiniz.
Daha fazla ayrıntıyı kendiniz tecrübe etmelisiniz.

Kolaylıklar.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Akaan

Hocam bu sanki işimi görecek gibi. Teşekkür ederim gelişmeleri yazarım

Alıntı yapılan: mehmet - 11 Aralık 2022, 22:28:36Diğer yerde cevapladım. Süre kısmından
devam edecekseniz benim yazdıklarım
size yaramaz.
Ayrıca CCS C bilmiyorum. XC8 ile
yardımcı olabilirim.
Müsait bir zamanda prensip kodları
yollarım.
Ancak bunu siz de yapabilirsiniz.
RB0/INT ile harici kesme kodu oluşturun.
unsigned int türünde bir genel bir
değişken olsun.
durum = (PORTEbits.RE1 << 2) | (PORTEbits.RE0 << 1) | (PORTBbits.RB0);
if(durum == 0b101)
{
    yon = 1; //Mesela sol
}
else if(durum == 0b011)
{
    yon = 2; //Mesela sağ
}
else
{
    yon = 0; //Hata durumu
}
Kendinize göre düzenleyebilirsiniz.
Daha fazla ayrıntıyı kendiniz tecrübe etmelisiniz.

Kolaylıklar.


Akaan

#define R_faz pin_rb0
#define S_faz pin_re0
#define T_faz pin_re1

Dedik.
Set_tris_e(0b111) // e portu giriş

İf(input(R_faz)==1) //koşul referans 1
{
Delay_ms(6.66);
Else if (input(S_faz)==1 && (input(T_faz)==0);
Printf("faz sırası doğru");
}
Else //döngü öyle değilse
{
Printf("faz sırası yanlış");
}

Diyebilir miyiz

Akaan

Ardunio ile CNC yaparken motor sürücülerden  sanırım geri besleme oldu laptop anakart yandı. Yeni bir laptop edinene Kadar burdan kara düzen gitmek zorundayım dağınık yazıyorum kusura bakmayın

Akaan

Aslında sizin yol daha kestirme, denemek lazım. Ama bu durumda r portlarını komple bu işe ayırmam gerekiyor. Şuan öyle bir lüksüm yok maalesef girişler sınırlı. İşlemcide 4 bacak boşta. Yada harici bir devre yapıp bu iş için LCD+faz sırası+ akım ayarını başka karta alıcam dip soketlerle üst üste yerleştiricem

Alıntı yapılan: mehmet - 11 Aralık 2022, 22:28:36Diğer yerde cevapladım. Süre kısmından
devam edecekseniz benim yazdıklarım
size yaramaz.
Ayrıca CCS C bilmiyorum. XC8 ile
yardımcı olabilirim.
Müsait bir zamanda prensip kodları
yollarım.
Ancak bunu siz de yapabilirsiniz.
RB0/INT ile harici kesme kodu oluşturun.
unsigned int türünde bir genel bir
değişken olsun.
durum = (PORTEbits.RE1 << 2) | (PORTEbits.RE0 << 1) | (PORTBbits.RB0);
if(durum == 0b101)
{
    yon = 1; //Mesela sol
}
else if(durum == 0b011)
{
    yon = 2; //Mesela sağ
}
else
{
    yon = 0; //Hata durumu
}
Kendinize göre düzenleyebilirsiniz.
Daha fazla ayrıntıyı kendiniz tecrübe etmelisiniz.

Kolaylıklar.


Serk@n

Burada sinyalin kare dalga olduğuna dikkat etmemiz gerekiyor. Algoritmanın buna göre oluşturulması gerekiyor.

Mesela 6,66 ms. süreyi 3 kat hızlandıralım. Sinyal değerleri aşağıdaki gibi olacak.

Faz1 111000111
Faz2 011100011
Faz3 001110001

Yukarıdaki listede fazlardaki her değişim 2,22 ms.

Faz1'in ilk yükseldiği esnada Faz2 ve  Faz3 halen 0'da. Ortadayken Faz3 hâlâ 0'da.

Yani demek istediğim Faz1'deki sinyalin son anındaki 2,22 ms.lik dilimi yakalamak gerekiyor.

Bunun için bir timer gerekir. Ve en az değeri 2,22 ms. olmalı. Daha yüksek değerlerde daha sağlıklı sonuçlar çıkar. Mesela timer 2,22 ms. ise Faz1'de üç kere ardarda 1 görüldüğünde 6,66 ms. eklenip diğer fazlara bakılmalı.
Bildiklerimize göre hareket edersek bilmediklerimizi de öğrenebiliriz.

Akaan

Doğruyu söylemek gerekirse anlamadım. Mehmet hocamın yaptığı gibi örnekle anlatırmısın

Alıntı yapılan: Serk@n - 12 Aralık 2022, 15:10:32Burada sinyalin kare dalga olduğuna dikkat etmemiz gerekiyor. Algoritmanın buna göre oluşturulması gerekiyor.

Mesela 6,66 ms. süreyi 3 kat hızlandıralım. Sinyal değerleri aşağıdaki gibi olacak.

Faz1 111000111
Faz2 011100011
Faz3 001110001

Yukarıdaki listede fazlardaki her değişim 2,22 ms.

Faz1'in ilk yükseldiği esnada Faz2 ve  Faz3 halen 0'da. Ortadayken Faz3 hâlâ 0'da.

Yani demek istediğim Faz1'deki sinyalin son anındaki 2,22 ms.lik dilimi yakalamak gerekiyor.

Bunun için bir timer gerekir. Ve en az değeri 2,22 ms. olmalı. Daha yüksek değerlerde daha sağlıklı sonuçlar çıkar. Mesela timer 2,22 ms. ise Faz1'de üç kere ardarda 1 görüldüğünde 6,66 ms. eklenip diğer fazlara bakılmalı.

Akaan

Ben şöyle düşündüm yukarıda da yazdım

#define R_faz pin_rb0
#define S_faz pin_re0
#define T_faz pin_re1


while(1)
{
disable_interrupts(int_rda);

   
   if (input(R_faz)==1)  && (input(S_faz)==0) && (input(T_faz)==0)  //koşul referens fazı
         {
         delay_ms(6.66); //120derece gecikme
      input(S_faz)==1; //faz 2 değer okuma
         input(T_faz)==0; //faz3 değer okuma
      printf("faz_sırası_dogru") //sıra doğru
      }
      else // koşul oluşmadıysa
{
printf("faz_sırası_yanlıs"); //sıra yanlış
      }
}

Akaan

Yazılanı inceleyip anlamaya çalışmak için geçen süre + cevap yazmaya harcadığım süre == metrobüste 8 10 durak fazla gitmişim. 😁 artık bana borçlusunuz bu işi beraber halledicez 😁😁

Powered by EzPortal