2 analog girişi işleme matematiksel işleme tabi tutmak

Başlatan may86, 27 Nisan 2006, 21:27:22

may86

Merhaba arkadaşlar.
şöyle bir sorunumuz var;
pic 16F877'ye A portundan 2 ayrı analog giriş uyguluyoruz, daha sonra bu analog girişleri 10 bitlik djital veriye çevirip yazaçlarda atıyoruz.
yapmak istediğimiz şu;
bu iki veri arasında işlem yapıp lcd'ye sonucu aktaracağız.
1. işlem R=analog1/analog2
2.işlem  S=(1-R)/(1+R)
1.işlemin sonucu lcd'nin 1. satırında, 2. işlemin sonucu da 2. satırında gözükmeli.
bu konuda yardımcı olabilecek olan varsa seviniriz.

Ziya

Nasıl bir yardım bekliyorsunuz?

Size tavsiyem kullandığınız derleyicinin analog giriş okuma örnekleri mevcuttur (en azından ccs için). floating point aritmetiği de yapıyordur. üç adet floating point değişken, iki adet 16 bit integer değişken tanımlayın.

10 bit ADC değerlerini 16 bit integerlere aktarın. Bunları 2 adet fp değişkene aktarın. deg1= (float) aaa1/1024. * 5.0 gibi sonra R yi hesaplayın. Aynen verdiğiniz denklemi yazın. LCD ile ilgili örnek programlara bakın.

Yapacağınız işler "ar-ge"den ziyade compose (derleyip toparlama) işleri olacak.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

ete

Aşağıdaki gibi yapabilirsiniz;

1. işlem R=analog1/analog2
2.işlem S=(1-R)/(1+R)

LCDOUT $FE,$80,"1.islem:",#R
LCDOUT $FE,$C0,"2.islem:",#S

Her nekadar işin temeli bu şekilde ise de Pic, basic de  ondalıklı işlem yapamaz. Tüm neticeler tam sayı olarak işleme tabi tutacaktır.
Örneğin; Analog1=780 ve Analog2=445 olsun Bu durumda R değeri
R=780/445=1,75 olacak ama sizin hesapta bu R=1 olarak çıkacaktır. Küsaratlarıda işleme dahi edebilmek için R=analog1*10/analog2 şeklinde bir işlem yapın. Böylece en azından virgülden sonra 1 haneyi işleme sokarsınız.
2. işlemide S=(1-R)/(1+R) şeklinde yazarsanız yine bazı hususlara dikkat etmeniz gerekecek; Pic Basic de küçk sayıdan büyük sayıyı çıkartırsanız sonuç sizin için hatalı olur. Örnek 10-20 derseniz sonuç 8 bitlik sayılarda 245 olarak bulunur. 16 bitlik sayılarda ise 65525 olarak bulunur.
Bu yüzden bu gibi hesaplarda tedbir almak zorundasınız.

Kolay Gelsin
ETE

Bu durumda görmek iste
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

may86

Alıntı yapılan: "ete"Aşağıdaki gibi yapabilirsiniz;

1. işlem R=analog1/analog2
2.işlem S=(1-R)/(1+R)

LCDOUT $FE,$80,"1.islem:",#R
LCDOUT $FE,$C0,"2.islem:",#S

Her nekadar işin temeli bu şekilde ise de Pic, basic de  ondalıklı işlem yapamaz. Tüm neticeler tam sayı olarak işleme tabi tutacaktır.
Örneğin; Analog1=780 ve Analog2=445 olsun Bu durumda R değeri
R=780/445=1,75 olacak ama sizin hesapta bu R=1 olarak çıkacaktır. Küsaratlarıda işleme dahi edebilmek için R=analog1*10/analog2 şeklinde bir işlem yapın. Böylece en azından virgülden sonra 1 haneyi işleme sokarsınız.
2. işlemide S=(1-R)/(1+R) şeklinde yazarsanız yine bazı hususlara dikkat etmeniz gerekecek; Pic Basic de küçk sayıdan büyük sayıyı çıkartırsanız sonuç sizin için hatalı olur. Örnek 10-20 derseniz sonuç 8 bitlik sayılarda 245 olarak bulunur. 16 bitlik sayılarda ise 65525 olarak bulunur.
Bu yüzden bu gibi hesaplarda tedbir almak zorundasınız.

Kolay Gelsin
ETE

Bu durumda görmek iste

Teşekkür ederim.
bunlar yararlı.
zaten sorunumuz da bu kısımda  başlıyor, R işleminde alacağımız sonuç 1,*** gibi bir sonuç olmalı çünkü analog girişler 0-5v arası ve  analog2 analog 1'den her zaman büyük  :?
amacımız hassas sonuç görmek.
her yolu deneyeceğiz.

ete

Bir hatanız var sanırım. şayet Analog2 , Analog1 den büyük ise ;
R=Analog1/Analog2   işleminin sonucu  1,*** şeklinde çıkmaz. 0,*** şeklinde çıkar. Tersi olacak herhalde!!!

Buraya bir örnek ölçüm değerleri verebilirseniz belki daha fazla yardımcı olabiliriz. Ancak yukarıdaki hususu da açıklığa kavuşturmanız gerek.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

may86

Alıntı yapılan: "ete"Bir hatanız var sanırım. şayet Analog2 , Analog1 den büyük ise ;
R=Analog1/Analog2   işleminin sonucu  1,*** şeklinde çıkmaz. 0,*** şeklinde çıkar. Tersi olacak herhalde!!!

Buraya bir örnek ölçüm değerleri verebilirseniz belki daha fazla yardımcı olabiliriz. Ancak yukarıdaki hususu da açıklığa kavuşturmanız gerek.

Ete

özür dilerim yanlış yazmışım.
r işleminin sonucu 0 ile 1 arasında çıkacak
örnek girişler;
analog1: 1,75V
analog2: 2,27v
gibi.
ilginize teşekkür ederim..

Mehmet

ete

Örnek veriler üzerinden yazdığım program aşağıdadır. Deneyin bakalım olmuşmu.

ETE


DEFINE LCD_DREG       PORTB
DEFINE LCD_DBIT         4
DEFINE LCD_RSREG      PORTB
DEFINE LCD_RSBIT        1
DEFINE LCD_EREG       PORTB
DEFINE LCD_EBIT         3
DEFINE LCD_BITS         4		
DEFINE LCD_LINES        2		
DEFINE	ADC_BITS       10
DEFINE	ADC_CLOCK      3
DEFINE	ADC_SAMPLEUS  100
TRISD = 0

AN1     VAR    WORD
R       VAR 	WORD
S       VAR	 WORD
AN2     VAR    WORD
   	
LCDOut $FE,1
TRISA = %00000111
ADCON1 = %10000100	
	
BASLA:		
        ADCIN 0, AN1  
        Pause 10
        ADCIN 1, AN2
        Pause 10        
        R= (An1*100/AN2)*10
        LCDOUT $fe,1,"R= ",dec1 (R/1000),",",DEC3 R//1000
        R=R/10    
        S=(100-R)*1000/(100+R)
        lcdout $fe,$c0,"S= ",dec1 S/1000,",",dec3 S//1000
        pause 1000
	
        Goto BASLA
End
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com