avatar_ete

Ders notlarına ilaveler -6. ADC kullanımı

Başlatan ete, 22 Şubat 2016, 10:37:12

ete

Bu dersde genel anlamda ADC kullanımı işlenmiştir.

Ete


Eolos

Konu için teşekkürler. sormak istediğim bir şey var.

Basit bir komut üstünde çalışıyorum ama malesef çalıştıramadım.

V = ADC_Read(0);
I = ADC_Read(1);
W = V * I;

if (W >=10000) {
        PORTC.F3 = 1;
              }

Misal bu şekilde basit bir komut. if komutunu V için ayrı veya I için ayrı ya da farklı türevlerde yazınca if komutunda sıkıntı yok ama Analog değerleri bu şekilde çarpımını tanımlayınca if komutu çalışmıyor. Acaba ADC readten elde edilen analog değerleri bu şekilde çarpamıyor muyuz? Ya da bir çözüm öneriniz var mı?

ete

Öncelikle bu komutların hangi derleyici esas alınarak verildiğini bilmiyorum. Basic bu şekjilde komutları kabul etmez.
Diğer taraftan ADC den okunan değer 10 bitlik bir değerdir ve maksimum seviyesi 1023 dür. Her ikiside 1023 olsa sayıları çarparsan 16 bitlik değeri aşmış olursun. C dilinde çalışıyor isen 32 bitlik bir değişken kullanarak ADC değerlerini çarpabilirsin. Daha sonra if satırının çalıştığını göreceksin.
Şayet 32 bitklik değişken kullanma imkanın yok ise hesabı 32 bitlik çarpma ile yapıp sonucu 100 e bölerek halledebilirsin.
Temp=I x V
V=div32 100
şeklinde kullanırsan sonucun 16 bitlik değeri aşmasını önlemiş olursun.
2 adet 1023 ün çarpımı şeklinde düşünürsek;
Temp=1023 x 1023=1046529 çıkacak bunu 100 e bölersek, 10465 elde edeceksinki bu senin hesaplayabileceğin en büyük değer olacaktır. Kendini buna göre ayarlarsın artık.

Ete

Eolos

Anladım teşekkür ederim sayın ETE..

1023 değerini geçemeyeceğime göre ben bu sayıyı 100 değil de 1000'e de bölsem iş görür o zaman..

Misal 28V için ADC değerim 286, 40 A için ise 818.. Çarpımı 233948 yapıyor.. Eğer tanımda W= V*I / 1000 yaparsam otomatik 233'e inmiş olurum. Sadece hata oranı artar. Onu da küsüratı yuvarlayarak biraz daha azaltabilirim.

eprom_20

Hocam ADC ölçme ve hesap konusunda bir noktada takıldım,

ADCIN 0,HAM  '0 nolu kanaldan Analog değeri oku ve RAW değişkenine aktar.
     
BAK:  IF ADCON0.2=1 THEN BAK

NEM_HESAP:   
       Ham=ham+1 'Hesap kolaylığı açısından Ham değerini bir artırdık
      Volt=(ham */ 1250)/100 'Ham ile 1250 yi 32 bit olarak çarp ve 100'böl
     ' Mvolt=volt//10
      Volt=Volt*2/1
.
.
.
LCDOut $FE,1,    "TOPRAK NEM "
LCDOUT $FE,$C0,"SEVIYESI :%" ,DEC3 Volt

     

Hocam bu hesap ile 5V geldiğinde LCD de %100 yazdırdım,
Ancak %100 den azalırken %90,%80.. gibi değilde %99,%98.....%15,%14 gibi düşmesini ve çıkarkende aynı çıkmasını yapamadım.
Nem hesapta ne eklemem gerekiyor Hocam yardım edermisiniz?

Adem AYDIN

Ham değeri 2500 le çarp. (*/2500)
Ham*/ 2500=yüzde
Virgül=yüzde//100
Yüzde=yüzde/100
Lcdout "yüzde= %",#yüzde,",",#virgül
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

eprom_20

Teşekkür ederim,deneyeceğim sonucu paylaşırım,,Selametle

Powered by EzPortal