adc

Başlatan behcet.3, 21 Nisan 2012, 17:57:30

behcet.3

Volt=(ham */ 1250)/100
Mvolt=Volt // 10
Volt=Volt/10
kod ile ekranda 5 volta kadar ölçe biliyorum yanlız benim yapmak isteğim ekran 4 voltun yukarı çıkmasın 5 volt versem dahi nasıl yapabilirim yardımcı olursanız sevinirim.

ete

Volt=(ham */ 1250)/100
Mvolt=Volt // 10
Volt=Volt/10
IF VOLT>4 then VOLT=4

Ete

behcet.3

Tesekkurler cevabiniz icin hocam. birde 0.1 mv hassasiyetli degilde 20 mv katlari olarak ekranda nasil gosterebilirim.

hako83

ETE hocam */ lşleminin başka yerlerdede gördüm, anlamını bir türlü anlamadım. Normal çarpma veya bölme işleminden farkı nedir. cevaplarsanız sevinirim hocam.

ete

#4
*/ bir çarpma işlemidir. solundaki sayı ile sağındaki sayıyı çarpar ve sonucu 256 ya bölerek neticeyi verir. Sonuç 256 ya bölündüğü için çarpanı hesap ederken biz 256 ile çarpıyoruz. Böylece çarpımın değeri değişmemiş oluyor.
Örnek vermek gerekirse,
1024 */ 1250  işlemi aslında (1024 x 1250 ) /256= şeklindeki işlemin karşılığıdır. Neden böyle bir işleme gerek duyulmuş onuda açıklayım.
Biliyorsun PBP da küsratlı artimetik işlemleri yapılamıyor. Mümkün olduğunca küsüratlardan kurtularak işlemleri yapıyoruz.
Birazda bu temele dayalı olarak bu sistem geliştirilmiş. Aslında bir taşla iki kuş vurma gibi bir şey.
Çarpım sonucu büyük olacağı için işlemi 32 bit olarak yaptırmışlar ama sonucu en azından 16 bit olarak alabilmek için 32 bitlik sonucun sonda yer alan Byte0 değerini göz ardı etmişler ve ortada yer alan 16 bitini almışlar. Bu ise sonucun 256 ya bölünmüş hali demek olur.
Hex formatında işlemleri yaparsan daha iyi anlarsın.

1024=$100 dır
125=$4E2 dir.
$400 x $4E2=$00138800 şeklinde bir sonuç çıkar. Sondaki 8 bitlik değer olan $00 değerini atarsak geriye $1388 sayısı kalacaktır. Bunun desimal karşılığı 5000 sayısıdır.
Umarım anlaşılmıştır.
Ete

Not: "birde 0.1 mv hassasiyetli degilde 20 mv katlari olarak ekranda nasil gosterebilirim"
Ne anlama geliyor pek anlamadım. Örnekle açıklarsan anlayabilrim. ADC okuması aslında  0,001mv hassasiyetle yapılmaktadır. Bu durumda Okunan değer mesela 3,750 mv şeklinde olabilir.  Sen hassasiyet 0,1mv değilde 0,01 veya 0,001 mv şeklinde desen anlayacağım ama 20mv (0,020 mv) ne anlama geliyor anlamadım doğrusu. Sonucun tam sayı kısmıda 20 mv un katları şeklinde mi gösterilecek yoksa sadece ondalık kısımmıdır.  Örneğin elimizde 3,5V var ise bunu 3,500 şeklinde okuyacağız. Ondalık kısım olan 500 değerini 20mv katları şeklinde gösterecek isek 500/20= 25 ve ekran görüntüsü ise 3,25 şeklindemi olacaktır. Nasıl olacağını örnekle göster anlayayım.




behcet.3

hocam söyle izah edeyim.
0-999 sayıcı düşünelim.0-1-2-3-4....... sayarken benim yapmaya çalıştığım ise 0-5-10-15-20-25..... sayması gibi..tabii ben bunu voltaj okuyup ekrana yazdırmada kullanacam.

ete

#6
Düşündüğün şey aşağıdaki gibi yapılabilir;

Volt=(Ham+1) */ 125
Mvolt=Volt // 100
Mvolt=mvolt-(Mvolt//5)
Volt=Volt/100
IF VOLT>4 then VOLT=4

Örnekle yaparsak;
ADC den okunan ham değeri 985 olsun
Volt=(985+1)*125=123.250
Volt=123.250/256=481
Mvolt=481//100=81
Mvolt=81-(1)=80
Volt=481/100=4
Sonuç 4,80 şeklinde ekranda yer alır.

Ete

hako83

ETE hocam cevabınız için çok teşekkür ederim. Anladığım kadarıyla kullandığımız pic ler 8 bit olduğundan, register lere sayıları sığdıra bilmek için en fazla 16 bit sayılar elde etmememiz gerekiyor, bunun içinde çarpım sonucunu 256 ya bölerek sadeleştirme işlemi yapıyoruz, eldeki 16 bitide h-side low-side olarak kullanmalıyız (veya derleyici bunu kendisi yapıyor), şeklinde anladım (eğer doğru anlamışsam). Bu tarz soruları c dilini öğrenmek için yazıyorum aslında c dilindede (Hi-Tech C) böyle bir detaya gerek varmıdır. 

ete

C dilinde buna gerek olduğunu sanmıyorum.
Çünki burada küsürattan kurtulmak için yaptığımı işlem orada küsratlı olarak yapılabilir.
Bidiğim kadarı ile C dilinde FLOAT değişkenler ile işlem yapılabilmektedir.
Aslında bizim yapmamız gereken hesap şekli şöyledir.
Çıkış voltajımız 0-5V olduğuna göre ve Maksimum ADC okumamızda 1023+1=1024 Olacağına göre birim ADC okumasına karşılık gelen voltaj değeri ;
5/1024= 0,0048828125  olarak bulunur.
Bu bizim olması gereken gerçek sabit çarpanımızdır. Şimdi örnek yapalım. Okunan değer 980 olsun Bu kaç volta tekabül eder diye hesaplamak gerekir ise;
V=980 * 0,0048828125=4,78515625 V şeklinde hesaplanacaktır. Hi-Tech de hesap böyle yapılacaktır büyük ihtimalle.
Biz 0,0048828125 sayısını direk kullanamadığımz için onu 256 ile çarpıyoruz ve  1,25 sayısını buluyoruz. Sayı hala küsüratlı olduğu için onuda 100 ile çarpıp 125 sayısını elde ediyoruz.
BU durumda 980 sayısını 125 ile çarpıp önce 100'e sonrada 256 ya bölersek aynı sonuca ulaşmış olacağız.
*/ işlemi zaten sayının 256 ya bölünmüş halini bize verdiği için işlemin bir tanesinden kurtulmuş oluyoruz. Sayımızda 100'e bölmüyoruz çünki bize ondalık 2 hane küsürat lazım . Bu nedenle elde ettiğimiz sayı 4,78 şeklinde değil 478 şeklinde oluyor.
Bunuda 100 ile mod işlemine tabi tutarak 78 sayısını oradan çekiyoruz ve işlemler böylece devam ediyor.

Ete

hako83

ETE Hocam bir konu ancak bu kadar güzel anlatılabilir. Cevabınız için çok teşekkür ederim.

behcet.3

hocam tesekkürler cevabınız için son olarak

0...250 ham değerde ekranda 0....10 değerlerini
251......640 ham değerde ekranda 11.....40 değerlerini
640.....1023 ham değerde ekranda 40....200 değerlerini göstermek istiyorum..
yanlız hesaplama konusunda takıldım..

BASLA:
ADCIN 0,ham
lcdout $FE,1," HAM =",# HAM
if (ham>=0) AND (ham<=250)then hesapla1
if (ham>=251) AND (ham<=640)then  hesapla2
if (ham>=641) AND (ham<=1023)then  hesapla3
goto basla

hesapla1:
ham1=(ham */ ......)/100
goto ekran1

hesapla2:
ham2=(ham */ ......)/100
goto ekran2

hesapla3:
ham3=(ham */ .....)/100
goto ekran3

ekran1:           
LCDOut $FE,$C0, "ham1=",#ham1
pause 100
goto basla

ekran2:           
LCDOut $FE,$C0, "ham2=",#ham2
pause 100
goto basla

ekran3:     
LCDOut $FE,$C0, "ham3=",#ham3
pause 100
goto basla

ete

#11
ADC=0-250 arasında HAM1 değerini hesaplamak için gösterilecek maksimum değer esas alınır.
Çarpan=10/250=0,04 bu bizim birim ADC okumasına karşılık gelecek olan Ham1 değerimizdir.
Örnek verecek olursak ADC=250 iken 250*0,04= 10 bulunur. Ancak bunu pic hesaplamasında kullanabilmek için 250 ile çarparız.
0,04 x 256 = 10,24 rakam hala 2 adet ondalık haneye sahip olduğu için birde 100 ile çarparız. Sonuç 1024 olarak çıkar.
Bu durumda formülümüz  HAM1=((HAM+1)*/1204)/100 şeklinde uygulanır.

ADC=250-640 arasında ham değeri hesaplamak için maksimum göstergemiz 40 olacağına göre ve okunacak en küçük değerde 11 olacağına göre 40-11=29 birim sonuç için ,640-250=390 birim ADC kademesi okunacaktır. Ohalde birim okumaya tekabül eden değer  29/390=19 olarak sabit çarpanımız bulunur.
Böylece Formülümüz, HAM2=((Ham+1-250)*/19)+11   şeklinde olacaktır.
Örnek ADC=640 ise  HAM2=((640+1-250)*/19)+11 = 40 şeklinde olacaktır.

ADC=641-1023 arasında gösterge 40-200 arasını gösterecek ise , 1023-640=383 birim okuma olacaktır. Elde edilecek sonuçlar ise 40 ile 200 arasında olacaktır. Bu durumda formül hesabımız;
200-40=160 sonuç için 383 birim ADC ve birim ADC başına düşen değer ise 160/383=107 olarak bulunur.
O halde formülümüz  Ham3=((Ham+1-640)*/107)+40  şeklinde çıkar.
Örnek yapalım; ADC=1023 ise   Ham3=((1023+1-640)*/107)+40=200 olarak bulunur.

Hepsi bu kadar.
Ete


behcet.3

Hocam tesekkurler cevabiniz icin
yanliz ham2 veya ham3 olcmeye basladigi zaman sifirdan basliyor.
Ham2 degeri 11 den ham3 degeri 40 dan baslamasi gerekiyor

ete

Hesap hatası yapmışım. Hesapları yeniden düzenledim. Önceki mesaja yeniden bakıver.

Ete

behcet.3

teşekkürler hocam

Powered by EzPortal