ADC devresi kararlı çalışmıyor.

Başlatan subram, 21 Eylül 2010, 10:51:23

subram

arkadaşlar merhaba
elimde max 10V çıkış veren bir sensör var. bu sensörün çıkışını 877 nin adc  girişine bağlayıp sensördeki voltajı lcd ekranda okuyorum sorun yok. Yalnız lcd ekranda bu değer sürekli oynuyor.  öyleki LCD ekranda 200 okuduğumda bile lcd ekranda anlık "0" görebiliyorum. bunu nasıl önleyebilirm? bu sorunu pratikte yaşıyorum. simaülasyonda doğal olarak sorun yok.
Devre beslemesi için 7805 kullanıyorum. giriş çıkışlarına kondansatör bağladım. Yazımsal olarak ne yapabiliriz bu sorunu çözebilmek için?
DEFINE ADC_BITS 8
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50

DEFINE    LCD_DREG    PORTC
DEFINE    LCD_DBIT    4
DEFINE    LCD_RSREG    PORTC 
DEFINE    LCD_RSBIT    2 
DEFINE    LCD_EREG    PORTC 
DEFINE    LCD_EBIT    3 
DEFINE    LCD_LINES    2 
DEFINE    LCD_BITS    4 

ADC VAR BYTE
TRISE=%11111111
ADCON1=%00000000
PAUSE 500
DONGU
ADCIN 5, ADC


LCDOUT,$FE,$80,"DEC:", DEC ADC
PAUSE 100 
GOTO DONGU
END

kurduğum devre;[IMG]http://img267.imageshack.us/img267/3018/adcw.jpg[/img]
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

JKramer

Belirli miktardaki değerin ortalamasını ekrana gönderebilirsiniz. Çeşitli ortalama alma yöntemleri (olympic,vb.) mevcut. Bir de sensör çıkışını ekranda ne sıklıkla görmeniz gerekiyor? Buna göre ekranı tazeleme hızınızı düşürebilirsiniz. Son olarak mikrodenetleyiciyi uyku moduna alıp analog değeri okuyabilirsiniz.

subram

ilgin için teşekkür ederim.
sensördeki bilgiyi anında ekranda görmem lazım. çok hızlı çalışması lazım. ortalama almaktan bahsetmişsiniz! bunu biraz daha açabilir misiniz? hangi komutlarla yapacam vs..
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

JKramer

Komut konusunda yardımcı olamayacağım ama basit olarak şöyle yapabilirsiniz:

16 bit'lik bir değişken oluşturun.
Analog değeri okuyun.
Okuduğunuz analog değerin sonucunu bu değişkene ekleyin.
Analog değeri okuyun.
Okuduğunuz analog değerin sonucunu bu değişkene ekleyin.
(...)
Diyelim ki 16 kez analog değeri okuyup değişkene eklediniz. Bundan sonra değişkenin ortalamasını almak için değişkeni 16'ya bölmeniz yeterli. Ortalamasını alıp ekrana yazdırdıktan sonra değişkeni sıfırlamayı unutmayın.

subram

Alıntı yapılan: JKramer - 21 Eylül 2010, 12:27:39
Komut konusunda yardımcı olamayacağım ama basit olarak şöyle yapabilirsiniz:

16 bit'lik bir değişken oluşturun.
Analog değeri okuyun.
Okuduğunuz analog değerin sonucunu bu değişkene ekleyin.
Analog değeri okuyun.
Okuduğunuz analog değerin sonucunu bu değişkene ekleyin.
(...)
Diyelim ki 16 kez analog değeri okuyup değişkene eklediniz. Bundan sonra değişkenin ortalamasını almak için değişkeni 16'ya bölmeniz yeterli. Ortalamasını alıp ekrana yazdırdıktan sonra değişkeni sıfırlamayı unutmayın.

yardımınız için teşekkür ederim yalnız benim analog olarak okuduğum değer zaten 8 bit. 16bitlik bir kaydedici değilde 16 adet 8bitlik kaydedici oluşturmam gerekiyor. bunun dışında ortalama bulma yöntemi var mıdır acaba? yada adc için nasıl bir komut dizilimi oluşturmak gerekir. Bunları araştırayım bakalım bişey çıkar mı?
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

JKramer

Yok, toplamı tutacağınız değişkeni kastetmiştim:

int8 adc;
int16 toplam;

for(x=0;x<16;x++)
{
    adc=adc_oku;
    toplam=toplam+adc;
}
toplam=toplam/16;
ekrana_yaz(toplam);
toplam=0;


parda

Denemelerinizi sensörün kendi ilemi yapıyorsunuz? Eğer öyle ise sensörü çıkarın ve yerine bir pil takın halen göze batan sıçramalar görüyorsanız. Donanımda bir hata(bozuk eleman, hatalı bağlantı vs.) olduğu açık. Yok pili düzgün ölçüyorsa sensörün çıkışında problem olabilir.

Son olarak verdiğiniz örnek değerler adc nin ham değeri ise verdiğiniz şemaya göre pratikte sıfır okumanız çok zor. Buda bir problemin işareti olabilir.
Bildiğim tek şey, hiç bir şey bilmediğimdir.

subram

@JKramer
yazdığın kodu anlayamadım.

@parda
sensör yerine pot bağladım. potu min yaptığımda "0" oluyor. Max.  yaptığımda 255 oluyor ama salınımları engelleyemedim bir türlü.  okuduğun değerin 10 birim altına kadar düşüyor sürekli. bazen de "0" oluyor. ilk olarak şu salınımları durdurmam lazım???
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

Maxim

Alıntı yapılan: ramoon - 21 Eylül 2010, 14:59:11
@JKramer
yazdığın kodu anlayamadım.

@parda
sensör yerine pot bağladım. potu min yaptığımda "0" oluyor. Max.  yaptığımda 255 oluyor ama salınımları engelleyemedim bir türlü.  okuduğun değerin 10 birim altına kadar düşüyor sürekli. bazen de "0" oluyor. ilk olarak şu salınımları durdurmam lazım???

pic adc girişine şase ile arasına 100nf koyun salınım falan kalmaz..

hımm orada opamp var o zaman opampın girişine 100nf koyun

subram

@Maxim hocam 100nF'ı R2'ye paralel bağlayacam doğru mu?
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

Maxim

Alıntı yapılan: ramoon - 21 Eylül 2010, 15:42:39
@Maxim hocam 100nF'ı R2'ye paralel bağlayacam doğru mu?

hımm bak şöyle yap sen
r2 ve r3 aynen kalsın

r3 ile opampın 3 numaralı ayağı arasına seri bir 10k daha koy
opampın 3 numaralı ayağı ile şase arasına 100nf at