PIC'in ADC'sinde ilginç durum

Başlatan zafzaf82, 16 Eylül 2006, 19:14:42

zafzaf82

Arkadaşlar sorum şu pic in 10bit adc'si 16 bit olarak çalıştırılabilirmi?
aşagıda yazdıgım programı yazdım ve denedim adc max değerinde 65535 değerini gösterdi. Böyle bişey mümkünmü yoksa kuantalama aralığı yine 10 bit'e göremi.
#include <16F877.h>
#device ADC=16 // ---> buraya dikkat


#FUSES NOWDT                 	//No Watch Dog Timer
#FUSES NOPUT                 	//No Power Up Timer
#FUSES NOPROTECT             	//Code not protected from reading
#FUSES NOBROWNOUT            	//No brownout reset
#FUSES NOLVP                 	//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD               	//No EE protection

//#use fast_io(A)

#use delay(clock=4000000,RESTART_WDT)
#include <LCD_zafer.C>

int16 deger;

SETUP_MCU()
{

   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   setup_port_a(RA0_ANALOG);
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(0);
   set_tris_a(0x01);

}

main()
{
   SETUP_MCU();
   lcd_init();

   for(;;)
   {
   deger=read_adc();
   lcd_gotoxy(1,1);
   printf(lcd_putc,"ADC : %lu",deger);
   delay_ms(400);
   }

}


http://rapidshare.de/files/33334625/ADC_deneme.rar.html

yorumlarınızı bekliyorum...
Mikroişlemci bi araçtır, amaç değil.....

ibrsel

877 için ADC de 10 bit kullanabiliyoruz diye biliyorum..Hatta hassas bir ağırlık ölçme işinde 12 bit okuma işlemine bile razı olmuştuk  ;)   16 bit okuma işleminin bu kadar küçük bir değişiklik ile olabileceğini zannetmiyorum(Hatta 877 de 16 bit olabileceğini bile zannetmiyorum) ..Yine de üstadların yorumlarını sabırsızlıkla bekliyorum..

z

ADC den okunan deger 16 bit degiskene sola dayali bicimde yerlestiriliyorsa sonucu 6 bit sola otelenmis yani 64 ile carpilmis okumaniz normaldir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

serdarkaradeniz

CCS C size donanım avantajı getiremez. Yani microchip' in datasheetinde 10 bit çözünürlükte tanımlanmış bir donanımı 16 bit hassasiyetde okuyamazsın. Bunalmış' ın belirtiği scale olayı gerçekleşiyor....

arslan74

Merhaba,

Test etmek gayet cok basit, Vref olarak beslemeyi sectiysen o zaman 5  Volt ta 65535, 2,5V -> 32768 ve 0V -> 0 cıkması gerek. O zaman dedeğin olayı yapmış olur. Ama böyle bir sey mümkün değil. Sen PIC'in datasheetlerini incele orada ADC ile ilgili registerleri ayrıntılı anlatiyor.

Selamlar.

Klein

eğer adc de bir dalgalanma varsa , bu istenmeyen durumu software oversampling ile lehinize çevirmeniz mümkün.
ADC den aldığınız değeri 100 kez toplayın. toplama bittikten sonra 100 e bölmek yerine 10 a bölün. Normal şartlarda son dijitin 10 ar artması gerekir. yani  pek bir işimize yaramaz. ama dalgalanma nedeni ile öyle olmuyor. ve 10 bitlik bir adc den 20 bit alabilirsiniz.
denendi ve sonuç mükemmel....

Not: denemede 10 bit ADC ile 14 bit çözünürlük elde edildi.  20 bit denenmedi.

ibrsel

Alıntı Yap
denemede 10 bit ADC ile 14 bit çözünürlük elde edildi.

sayın @Klein hocam,bunu biraz daha açabilirmisiniz..

picusta

100 yerine 128 ile bölmenizi tavsiye ederim.

arslan74

Ben birisine AC Voltmetre yapıştım. Şebeke voltajının ölcüyordu. Direncle 1/100 oranında bölerek yaparak ölçme yapiyordum. ilk önce Voltajın tepe değerini okuyup ekrana iletiyordum. Bu durmda Max. 499Volt yani 4.999V gösteriyordu. Bu şekilde şebeke voltajda cok oynamalar olduğu için değere sürekli değişiyordu. Bende tek ölçüm yerine 8 tane tepe Voltajını okuyub bunları topluyordum, sonrada 8'e bölüyordum (3 bit sağa öteleyerek). Bu şekilde tekrar ölçüm yaptığımızda oynamalarda azalmıştı. Ayrıca 500V üzerindeki voltajı göstermeye başladı. 550V kadar ölcüm yaptım. Gördüğüm tek dezavantajı min ile max. arasında ortalama 2Volt sapma yapmaya başladı, hepsi bu.

Selamlar.

Klein

Alıntı yapılan: "ibrsel"
Alıntı Yap
denemede 10 bit ADC ile 14 bit çözünürlük elde edildi.

sayın @Klein hocam,bunu biraz daha açabilirmisiniz..

Aslında açılabilecek çok fazla şey yok.  
Örneğin elimizde 10 bit bir ADC var. okuduğumuz değer 1024. biz bunu 10 kez toplarsak elde edeceğimiz değer 10240 olacaktır. eğer toplamı 10 a bölersek yine 1024 elde ederiz. Ama son dijitteki dalgalanmaları azaltmış oluruz. Eğer biz bu değeri 10 a değil de 5 e bölersek elde edeceğimiz değer 2048 olacaktır. Yani 11 bitlik bir sonuç. Eğer son dijit dalgalanmamış olsa son dijitimiz 2'nin katları şeklinde gider. Ve biz gerçekte 11 bit okumuş olmayız. Ama son dijitteki dalgalanma nedeni ile  gerçek değerden aşağıda ve yukarıda değerler alacağımız için  ortalamamıza etki edecek. Ve böylece  son dijitte 2 ve katları şeklinde bir artış görmeyeceğiz. Biraz PLL lerde kullanılan 64/65 bölücünün çalışma şekline benzer bir mantık.

picusta'nın söylediğine de katılırım. 10 kez toplayıp 5 e bölmek yerine 16 kez toplayıp 8 e bölmek daha iyi olabilir.