ADC Kararlılık

Başlatan imcek, 29 Ekim 2008, 11:53:45

imcek

selam arkadaşlar

ADC işlemlerinde okutulan voltaj değerinin tam stabil olması için ne gibi işlemler yapılabilir.Ortalama alma dışında başka önerileri olan varmı ?

Erol YILMAZ

Okutulan voltaj değerinin sabit kalması sağlanabilir.

imcek

Alıntı yapılan: "Allegro"Okutulan voltaj değerinin sabit kalması sağlanabilir.

Bunu nasıl sağlayabiliriz.Yani Pic in voltaj okuması hatasız demek mi bu

Klein

öncelikle donanımdan başlamak gerek. Dijital filtreler ve ortalama almak kararlılık için önemli adımlar olsa da , donanım kararlı değilse tek başına yazılım bir işe yaramıyor. Allegro'nun söylemek istediği de bu.
Öncelikle ADC referans voltajı stabil olmalı. ve referans filtresi için tek kapasite yerine farklı değerlerde birkaç kapasite kullanmak isabetli bir seçim olacaktır. Örn 10uF, 1uf , 100n ve 10n gibi farklı değerde kapasiteler bağlayabilirsiniz. Eğer referansınız TL431 gibi shunt regülatör ise, üzerinden geçecek akım gürültü ile doğru orantılı olacaktır. Bunun için Referansın önündeki direncin mümkün olduğunca yüksek seçilmesi gerekir. 10K , 15K vs.. Eğer bu direnç değerleri referans akımınızı karşılamıyor ise , referans çıkışını bir opamp ile tamponlayabilirsiniz.
ikinci konu ADC girişi. burada da öncelikle donanım filtreleri yapılmalı. Ölçeceğiniz geriliminin , çevreden gelebilecek gürültülerin frekanslarına bağlı olarak , alçak geçiren , yüksek geçiren veya bant geçiren filtreler kullanılabilir. Ama bu filtrenin frekansını hesaplamadan , ne kadar yüksek kapasite koyarsam o kadar iyi mantığıyla yapılacak seçimler her zaman doğru sonuçlar vermeyebilir. Ama bu değerleri hesaplama veya ölçme şansınız yoksa , yine farklı kapasite değerlerini birarada kullanarak nispeten optimal bir çözüm bulmuş olursunuz.
üçüncü konu gerilim bölücüler. Eğer devrede gerilim bölücüler kullanılıyorsa, bu bölücüler üzerinden geçecek akım güzel bir gürültü kaynağına dönüşecektir. Gerilim bölücülerde de direnç değeri mimkin olduğunca yüksek seçilmeli. örn 100K , 300K vs.. Ama böyle bir dirençle bölücü yaptığımıza bu bölücünün çıkışını doğrudan ADC ye giremeyiz. Böyle bir bölücü çıkışını ADC ye doğrudan girmek linearizasyon hatalarına davetiye çıkarmak demektir. Bunun için bölücü çıkışının da tamponlanması gereklidir.
Başka bir konu ise sıcaklık kararlılığı. Burada söylenecek çok fazla söz yok zaten. Isısal kararlılık  ppm/C ile gösterilir. Kullanacağınız aktif ve pasif elemanların ppm/C değeri ne kadar düşük olursa, sıcaklık değişimlerinden doğacak hatalar o kadar minimize edilmiş olacaktır.

imcek

Teşekkürler Klein

 Gerilim bölücü kullanmayı düşünmüyorum.Zaten ölçmek istediğim 3.6 voltluk pilin gerilimi.Pilin gerilimini 100k lık dirençle 0. kanaldan girdim.Yani pil voltajını izleyip şarj işlemini sonladırmak istiyorum.Bi sorum daha olacak
6 ma lik bir sabit akımı pic üzerinden kontrol edebileceğim (yani akımı verip kesebileceğim) mümkün olduğunca az elemanlı bi devreye ihtiyacım var Analog işlemler hakkında tecrübem az.Yavaş yavaş tecrube kazanıyoruz sizin gibi yardımcı olan insanlar sayesinde.

Erol YILMAZ

Alıntı yapılan: "imcek"
Alıntı yapılan: "Allegro"Okutulan voltaj değerinin sabit kalması sağlanabilir.

Bunu nasıl sağlayabiliriz.Yani Pic in voltaj okuması hatasız demek mi bu

Pic in Adc leri Oldukça kararlı ölçümler yapmaya müsade ediyor.
Bu durumda hatalı ölçümler yapıyorsanız donanımınıza odaklanmanız şart.
Bir sonraki adım da da Yazılıma.

Pic ler için önerilen ADC nin giriş empedansı Max 10K.
Bu durumda 100K değeri çok yüksek. Farklı değerler oKumanın
ilk sebebi bu olabilir. Bu durumda en iyi yapılacak şey,
ADC nin hemen girişine 1 adet 100 nF koymak olacaktır.
Yüksek Giriş empedansının ADC nin kapasitesi ile gerilim düşümüne
mani olması sağlanır bu şekilde.

imcek

Teşekkürler Allegro  

   Olumlu sonuç aldım.Yalnız Proton'da yazdığım programda bir sorun var.
toplam değişkenini 11 e bölmem sorunu düzeltiyor ama mantığıma uymuyor.0 dan 9 a yani 10 defa voltu okutup topluyorum.Sonra 10 a bölüp ortalamasını almış oluyorum.Ama 11 de doğru çalışıyor??

While PORTC.7=1 
         For i=0 To 9 Step 1
            Voltbyte = ADIn 0
            DelayUS 50
            TOPLAM=TOPLAM + Voltbyte
         Next 

        TOPLAM=TOPLAM / 10
 
         If TOPLAM>864    Then PORTD.6=0 '4.3 volttan buyukse şarj kes
         If TOPLAM<854    Then PORTD.6=1
         DelayMS 100
    Wend

Erol YILMAZ

Alıntı yapılan: "imcek"Teşekkürler Allegro  

   Olumlu sonuç aldım.Yalnız Proton'da yazdığım programda bir sorun var.
toplam değişkenini 11 e bölmem sorunu düzeltiyor ama mantığıma uymuyor.0 dan 9 a yani 10 defa voltu okutup topluyorum.Sonra 10 a bölüp ortalamasını almış oluyorum.Ama 11 de doğru çalışıyor??

While PORTC.7=1 
         For i=0 To 9 Step 1
            Voltbyte = ADIn 0
            DelayUS 50
            TOPLAM=TOPLAM + Voltbyte
         Next 

        TOPLAM=TOPLAM / 10
 
         If TOPLAM>864    Then PORTD.6=0 '4.3 volttan buyukse şarj kes
         If TOPLAM<854    Then PORTD.6=1
         DelayMS 100
    Wend

Basic Derleyicisinin bölmede nasıl bir işlem yaptığını bilmiyorum ama
bu tarz işlerde okumayı 2 nin katı şeklinde yapmanın bölmede
büyük avantajı var. 16 kere okuyup Topladığın değeri 4 kere sağa
kaydırırsan, sade  bir bölme yapmış olacaksın.

imcek

Teşekküler  Allegro

Ama söylediğini  tam olarak anlayamadım. :cry:

2 nin katı şeklinde derken.?

bu avantaj neyden kaynaklanıyor.Basic için mi geçerli yoksa tum diller için mi ?

Tagli

PIC bölme işlemi yapmak için bir komuta sahip değildir (18 serisi ve üstü olanlarda, ve bazı 17'lerde çarpma var gerçi). Yazılan çarpma ve bölme ifadeleri ASM diline çevrilince karmaşık ve uzun algoritmalar ortaya çıkar ve bunlar PIC'e zaman kaybettirir (ben bu algoritmaları bilmiyorum ama internetten rahatlıkla bulunur sanırım). Ama 2'ye bölmek veya 2 ile çarpmak için yapılması gereken tek şey ilgili register'ı bir kez kaydırmaktır. Bölme için sağa, çarpma için sola kaydırmak gerekir. @Allegro hocamızın dediği 4 kez sağa kaydırmak 2^4 e bölmek demektir ve sadece 4 cycle'da hesaplanabilir.

Ekleme: Bu belgeye bir bak. Çarpma ve bölme işlemleri hakkında bilgi veriyor. Buraya da bakabilirsin.
Gökçe Tağlıoğlu

imcek

Alıntı yapılan: "Tagli"PIC bölme işlemi yapmak için bir komuta sahip değildir (18 serisi ve üstü olanlarda, ve bazı 17'lerde çarpma var gerçi). Yazılan çarpma ve bölme ifadeleri ASM diline çevrilince karmaşık ve uzun algoritmalar ortaya çıkar ve bunlar PIC'e zaman kaybettirir (ben bu algoritmaları bilmiyorum ama internetten rahatlıkla bulunur sanırım). Ama 2'ye bölmek veya 2 ile çarpmak için yapılması gereken tek şey ilgili register'ı bir kez kaydırmaktır. Bölme için sağa, çarpma için sola kaydırmak gerekir. @Allegro hocamızın dediği 4 kez sağa kaydırmak 2^4 e bölmek demektir ve sadece 4 cycle'da hesaplanabilir.

Ekleme: Bu belgeye bir bak. Çarpma ve bölme işlemleri hakkında bilgi veriyor. Buraya da bakabilirsin.


Teşekkürler Tagli

Aynısını yaptım ama beklediğim voltajı algılamıyor.

Vref 5.1 volt  

 

   
While PORTC.7=1 
    For i=0 To 15 
   Voltbyte = ADIn 0
   DelayUS 50
    TOPLAM=TOPLAM + Voltbyte
    
    Next 
    TOPLAM=TOPLAM >> 4
    If TOPLAM>864    Then PORTD.6=0 '4.3 volttan buyukse kes
    If TOPLAM<854    Then PORTD.6=1
    DelayMS 100
    Wend


Acaba bi yanlışlık mı var

Tagli

PicBasic Pro ile fazla deneyimim yok ama gözüme takılan iki yer var, belki sorun oralardadır:

1. Döngüden çıkmadan önce TOPLAM'ı sıfırlamamışsın sanırım. Bu da her kontrolde biraz daha artmasına sebep olacaktır.

2. PicBasic Pro kaydırma işlemini nasıl yapıyor bilmiyorum ama şöyle bir ihtimal var: Kaydırma sırasında çok da önemli olmadıkları (belki de önemlilerdir, bundan da tam emin değilim) için kaybolmaları planlanan sağdaki 4 bit (yani ihmal edilen küsurat) cary bit üzerinden geçip TOPLAM'ın solundan geri çıkıyor olabilir, bu da çok alakasız bir sonuç çıkmasına neden olacaktır.

3. Bir ihtimal de 16'ya bölerken ihmal ettiğimiz bu 4 bitin sonucu etkilemesi olabilir. Öyle ki 32/16=2 iken 31/16=1 verecektir kaydırma yöntemi ile.
Gökçe Tağlıoğlu

imcek

Doğru önemli olan döngü içerisinde sıfırlanması toplam değerinin.ben önce sıfırladım haklısın.. çok teşekkürler

camby

8biti 4 kez sağa kaydırınca sağdan girip soldan tekrar bitlerin girmesini nasıl önlüyoruz? Pratik bir yolu var mı?
16 bitlik bir sayıda bunu nasıl yaparız?

tyildizak

Alıntı yapılan: "camby"8biti 4 kez sağa kaydırınca sağdan girip soldan tekrar bitlerin girmesini nasıl önlüyoruz?

Bunu dert etmene gerek yok, soldan giren bitler daima 0 olacaktır  :D