12 v encoderi PIC 16f877 ye okutma

Katılım
28 Ağu 2016
Mesajlar
9
Puanları
1
Yaş
29
Konum
İstanbul
Elimde 12v beslemeli NPN open collectör rotary encoder var. Çıkışında 12 volt gerilim ölçüyorum ve bunu doğrudan pice giremedim. Arada opamp gerilim izleyici devresi kullandım opampın +V sine +5v, -V sini de gnd ye bağladım. Encoderi döndürdüğüm zaman max 5v alıyorum ama minimum 0v alamıyorum. Minimum 1.8 V civarı falan alıyorum. Pic te bunu 0 olarak algılamıyo sorun ne olabilir.
Not: Daha önceki konuları inceledim ama sorunumun çözümünü bulamadım.
 
Kod ve şemayı paylaşa bilirmisinz rica etsem
 
Enkoder çıkışı zaten open collector, oraya bir 1K direnç ile 5V a bağlarsan, çıkış 0 veya 5V olur. Başka bir opamp falan devreye gerek yok.
 
Ben bu yaz direnç bağlamadan kullanmıştım.Kodları şuan nerde hatırlamıyorum. Ben basitçe nasıl okuduğumu anlatıyım .
Enkoderin bildiğiniz üzere A,B ve Z uçları var. A ve B uçlarından enkoderin dönme yönüne göre (mesala sağa döndüğunde A sinyali B den önde geliyor) aralarında faz farkı oluşur. Ben bunu sinyali PIC16f877 de kesme kullanarak okudum. A sinyalini RB0 kesme girişine girdim ve program yazarken kesme oluşma durumunu yükselen kenar için yaptım.
Yüklediğim resimde görüldüğü gibi sağa dönerken A sinyalinin her yükselen kenarinda B sinyali lojik 0 dır. Sola dönerken ise B lojik 1 dir.
Ben kesme alt programı içinde sadece B sinyalini kontrol ederek enkoderin dönüş yönünü buldum. Aynı zamanda her kesmeye girdiğinde dönme yönüne bağlı olarak sayac değişkenini arttırıp veya azalttım. Buradan açı hesabıda yapılabilir size kalmış. Yani kısaca A sinyalini kesme oluşturmak için B sinyalini de kesmenin içinde dönüş yönünü bulmak için kullandım. Yanlış hatırlamıyorsam kesme alt programı şu şekildeydi.
Kod:
Void interrupt(){
if(encoderB==0)
sayac++;
else
sayac--;
RB0IF=0;
}
images.png
 
Kodu kullandınız yükleyebilirmisiniz rica etsem ?
 
Evet devreye gerek yok open collector tek bir pullup direnci yeterdi
 
Enkoderin dönüşünü Uart üzerinden gözlemledim. Kodlar aşağıdaki gibidir.
Kod:
char txt[7];
int sayac=0;
void interrupt(){          // kesme alt fonksiyonu
if(portb.f1)
sayac--;
else
sayac++;

 INTCON.INT0IF=0;          // kesme bayrağı sıfırlandı
}
void init(){
INTCON.GIE=1;         // tüm kesmelere izin verildi
INTCON.INT0IE=1;      // INT0 kesmesi aktifleştirildi
INTCON2.INTEDG0=1;    // INT0 için yükselen kenar seçildi
INTCON.INT0IF=0;      // kesme bayrağı temizlendi.
trisb.f1=1;
trisb.f0=1;
}
void main(){
init();
UART1_Init(9600);        // USART haberleşme ayarları yapıldı.
delay_ms(100);
while(1){

IntToStr(sayac,txt);     // sayac değişkenini USART tan gönderebilmek için int değişkeni Stringe çerildi.
 if(UART1_Data_Ready()){
 UART1_Write_Text(txt);    // txt değişkeni ekrana yazdırıldı.
 UART1_Write(8);
}
}
}
 

Forum istatistikleri

Konular
127,969
Mesajlar
913,975
Kullanıcılar
449,614
Son üye
Canipk

Yeni konular

Geri
Üst