Timer ile faz kontrolü.

Akaan

Üye
Katılım
1 Eyl 2022
Mesajlar
13
Puanları
1
Yaş
43
Arkadaşlar selamın aleyküm. Ben faz sırası kontrol edip LCD ekrana yazdırmak istiyorum. Fakat işin içinden çıkamadım. Referans fazın(e0) ardından 6.66ms gecikme ekleyip (E1) lojik 1 olursa yani 5v pals gelirse faz sırası doğru. (E2) 1 olursa LCD ye faz sırası yanlış yazdırmak istiyorum. Ccs c ile. Yani referans e0 delay_ms 6.66 E1 ve E2 sıralamasında olması lazım doğru sıranın. İşlemcim 16f877a Yardımlarınız için şimdiden teşekkürler
IMG_20221209_095609.jpg
IMG_20221209_111929.jpg
 
peki süre 6.66ms den fazla veya az olursa bir önemi var mı? Yada her iki sinyalde gelmezse ne olacak? Eğer bunların bir önemi yoksa üç tane harici kesmeyle bu sinyallerin sırasını izleyebilirsin. Örneğin referans geldiğinde değişkeni 1 yaparsın e1 geldiğinde bir artırırsın e2 geldiğinde bir azaltırsın. sonsuz döngüyle bu değişkenin değerini sürekli kontrol edersin 1 veya 2 ise faz sırası doğru 0 ise yanlış yazdırırsın.
 
peki süre 6.66ms den fazla veya az olursa bir önemi var mı? Yada her iki sinyalde gelmezse ne olacak? Eğer bunların bir önemi yoksa üç tane harici kesmeyle bu sinyallerin sırasını izleyebilirsin. Örneğin referans geldiğinde değişkeni 1 yaparsın e1 geldiğinde bir artırırsın e2 geldiğinde bir azaltırsın. sonsuz döngüyle bu değişkenin değerini sürekli kontrol edersin 1 veya 2 ise faz sırası doğru 0 ise yanlış yazdırırsın.
Şimdi referans aldığım girşten sonra lojik 1 verebilen tek opto doğru olan 2.ci fazdan gelen sinyaldir. Fazlar arası 120° açı olduğundan 6.66 MS arayla ilgili pinler lojik 1 oluyor. Sıralama için e0 referans olduğunda E1 i takip edeceğiz. E0 dan sonra 6.66 MS sonra E1 lojik 1 olursa sıra doğru. Yok e0dan sonra E2 lojik bir olursa sıra yanlış yazacak LCD de . Yani sıramız input pin_e0==1 delay_ms 6.66 input pin_e1==1 faz sırası doğru.. else yanlış
peki süre 6.66ms den fazla veya az olursa bir önemi var mı? Yada her iki sinyalde gelmezse ne olacak? Eğer bunların bir önemi yoksa üç tane harici kesmeyle bu sinyallerin sırasını izleyebilirsin. Örneğin referans geldiğinde değişkeni 1 yaparsın e1 geldiğinde bir artırırsın e2 geldiğinde bir azaltırsın. sonsuz döngüyle bu değişkenin değerini sürekli kontrol edersin 1 veya 2 ise faz sırası doğru 0 ise yanlış yazdırırsın.
Her iki sinyalde gelmezse faz kopuk yazacak
 
Anladığım kadarıyla faz koruma devresi yapmaya çalışıyorsun ama 6.66 sabit bir sayı değildir. 50hz in 3 faza yayılmış hali olarak bu sayıyı bulursun ama 1/150 tam sonucu olan bir işlem değildir. Yani devre en başta güzel çalışırken zamanla kaymaya başlayacaktır. Yapman gereken en güzel şey az önce söylediğim gibi harici kesmeler kullanarak gelen sinyalleri dinlemektir. Süreden bağımsız olarak. Birazcık programlama mantığıyla çözebilirsin bunu.
 
Yani amacım devreye bağladığım çeşitli fonksiyonlar ile durdurma yön değiştirme sabit test hareketleri için stabil dönüş yönü. Bağlantı yapıldığında r-s-t bağlı olmasını istiyorum. Bunu da ekranda kullanıcının görmesini istiyorum. Bahsettiğiniz faz korumayı örnek kodla açıklayabilir misiniz
 
Sadece bir pin harici kesme bacağında
olsun.
Kesme oluşunca diğer iki faz okuma
pinine bakın. 0b101 ise bir yön, 0b011
ise diğer yön olacaktır.
 
Hocam mantığını az çok biliyorum. Sorun şu örnek lazım. Yokmu iki satır yazacak biri yahu 😁 ben birşeyler karaladım sildim. Yok beceremedim.
Sadece bir pin harici kesme bacağında
olsun.
Kesme oluşunca diğer iki faz okuma
pinine bakın. 0b101 ise bir yön, 0b011
ise diğer yön olacaktır.
 
INTCON=0b11001000;
IOCB=0b00000100; //PORTB2- PIN CHANGE INTERRUP
//MOTOR SENS INTERRUPLI //em sens iptal edildi
T1CON=0b00110001;
TMR1H=0;
TMR1IE=1;
bu yukarda yazanlar portb change interrup ile ilgili,yani port b de hangi pinlerin change olayında interrupa girecegini ayarlamada kullanılıyor.sen üç pin olacak şekilde degişiklik yapacan.
//******************
#include <stdint.h>
#include <xc.h>
#include "usart_pic16.h"
#include "PORTLAR.c"
#include "DEGISKENLER.c"
#define _XTAL_FREQ 18432000


void interrupt ISR(void)
{

if (RCIE && RCIF) {
USARTHandleRxInt();
return;
}

if (TMR1IF)
{
TMR1IF=0;
TMR1_COUNT++;
TMR2_COUNT++;
TMR3_COUNT++;
TMR4_COUNT++;
if(TMR1_COUNT>=6) {TMR1_COUNT=1;}
if(MOTOR==1 && TMR2_COUNT>=5)
{
MOTOR=0;FREN=0;HATAKODU=1;CALISTI=44;EL_EMNIYET_PISTON=0;
}
FLAG.bits.HMI=1;
return;
}


if (RBIF) { //PORTB CHANGE INTERRUP
char temp=PORTB;
MOTOR=0; //SENSORU GORDUMU MOTOR DURDURULUYOR
FREN=0; //FREN SIKILIYOR
RBIF=0;
EL_EMNIYET_PISTON=0;
return;
}


}

bu yukarda yazanlarda ise timer ve portb change interrupına girdigi zaman ne yapacagı yazıyor.
senin yapman gereken portb change interrupını üç fazın sinyal girişleri ile tetiklemek ve fazbirde zaman sayaclarının üçünüde sıfırlayacan,ikinci ve üçüncü zaman sayaclarının süreleri, eger üçüncü zaman ikinciden büyükse faz sırası dogru, yok ikinci sayac üçüncüden büyükse faz sırası yanlış demektir.
Kusura bakma yukardaki programları hale hazırda bir makinada kullandıgım yazılımdan kesip yapıştırdım.üzerinde degişiklikler yapman gerek.Kolay gelsin.
 
Hocam ne kusuru yardımların için teşekkür ederim. Uğraşıp cevap vermişsin. Lakin kodlar benim yaptırmak istediğime uygun durmuyor. Benim yaptırmak istediğim şey ilgili portlar (e0.e1.e2) e0=1 delay 6.66ms E1=1 &E2=0 ise faz sırası doğru değilse yanlış yazdırmak.
INTCON=0b11001000;
IOCB=0b00000100; //PORTB2- PIN CHANGE INTERRUP
//MOTOR SENS INTERRUPLI //em sens iptal edildi
T1CON=0b00110001;
TMR1H=0;
TMR1IE=1;
bu yukarda yazanlar portb change interrup ile ilgili,yani port b de hangi pinlerin change olayında interrupa girecegini ayarlamada kullanılıyor.sen üç pin olacak şekilde degişiklik yapacan.
//******************
#include <stdint.h>
#include <xc.h>
#include "usart_pic16.h"
#include "PORTLAR.c"
#include "DEGISKENLER.c"
#define _XTAL_FREQ 18432000


void interrupt ISR(void)
{

if (RCIE && RCIF) {
USARTHandleRxInt();
return;
}

if (TMR1IF)
{
TMR1IF=0;
TMR1_COUNT++;
TMR2_COUNT++;
TMR3_COUNT++;
TMR4_COUNT++;
if(TMR1_COUNT>=6) {TMR1_COUNT=1;}
if(MOTOR==1 && TMR2_COUNT>=5)
{
MOTOR=0;FREN=0;HATAKODU=1;CALISTI=44;EL_EMNIYET_PISTON=0;
}
FLAG.bits.HMI=1;
return;
}


if (RBIF) { //PORTB CHANGE INTERRUP
char temp=PORTB;
MOTOR=0; //SENSORU GORDUMU MOTOR DURDURULUYOR
FREN=0; //FREN SIKILIYOR
RBIF=0;
EL_EMNIYET_PISTON=0;
return;
}


}

bu yukarda yazanlarda ise timer ve portb change interrupına girdigi zaman ne yapacagı yazıyor.
senin yapman gereken portb change interrupını üfazın sinyal girişleri ile tetiklemek ve fazbirde zaman sayaclarının üçünüde sıfırlayacan,ikinci ve üçüncü zaman sayaclarının süreleri, eger üçüncü zaman ikinciden büyükse faz sırası dogru, yok ikinci sayac üçüncüden büyükse faz sırası yanlış demektir.
Kusura bakma yukardaki programları hale hazırda bir makinada kullandıgım yazılımdan kesip yapıştırdım.üzerinde degişiklikler yapman gerek.Kolay gelsin.
 
Faz sırası tespiti için mutlaka bir pin
harici kesme bacağında olmalıdır.
E portunda harici kesme özelliği var mı?
 

Forum istatistikleri

Konular
129,721
Mesajlar
929,265
Kullanıcılar
452,439
Son üye
GİZEM51*-+

Yeni konular

Geri
Üst