Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

En Hassas 10Bit ADC

Başlatan Maxim, 01 Ekim 2007, 18:58:43

Maxim

10 bit ADC ,
100 kere örnek alıyorum ,sonra onun ortalamasını alıyorum ,
daha ne yapayım ??

bu kodu daha nasıl geliştirebiliriz ?
nasıl daha hassas , nasıl daha doğru göstermesini sağlayabiliriz ?

slm


Declare ADIN_RES	10
Declare ADIN_TAD	FRC
Declare ADIN_STIME 50

Dim Raw As Float
Dim Result As Float     					
Dim Sample As Byte
Dim Volt As Float
		
Result = 0

loop:

For Sample = 1 To 100					
ADIn 0, Raw
Result = Result + Raw
Next Sample
Result = Result / 100

Volt = Result
Volt = Volt * 5 / 1023

Print At 1,1,"Raw= ",DEC1 Raw,"   "
Print At 2,1,"Volt= ",DEC3 Volt

Result=0

GoTo loop

Erol YILMAZ

512 kere oku,
128 e bölerek kullan...

Hemen ardından ÖLÜ BAND uygula.


Maxim

erol usta ,,

nasıl yani :)
ölü band nedir ?

slm

files

okunan değer nedir? dc gerilim mi?

değilse adc için FRC  sakattır. napıp edip kristal frekansını kullanmalısınız. çevirm süresi 1.6 uSoalcak şekilde tablosuna bakılarak ayar yapılır.

Erol YILMAZ

Şekile iyi bakıyorsun şimdi,

Şöyle ki,

100 ün 101 olması için 100.8 olması gereksin.
100.7 olunca tekrar 100 e düşmesin !!!

100 e düşmesi için 100.3 okuması gereksin :))

Böylece ufak tefek kıpırdanmaları görmemiş oluyoruz.

@files,

Kristal ile adc doğruluğunun ne alakası var?

Maxim

Alıntı yapılan: "files"okunan değer nedir? dc gerilim mi?

değilse adc için FRC  sakattır. napıp edip kristal frekansını kullanmalısınız. çevirm süresi 1.6 uSoalcak şekilde tablosuna bakılarak ayar yapılır.

DC ,
çevrim süresi 8_FOSC yapıldı .

Maxim

erol usta ,

ama o zaman 10 bitlik çözünürlükten aşağılara inmiş gibi olmuyormuyuz ?
yani yanlış anlamadıysam ,

ham değer
100.4 iken biz onu 100 ,
100.6 iken biz onu 101 görürüz .

bunu sizin dediğiniz gibi yapmam için ,
volt = volt * 5 / 1023   ; buradaki 1023 yerine daha küçük bir sayı yazmam gerekmezmi ?  :roll:

Erol YILMAZ

Konuyu tam olarak anlatamadım.
Ama bahsetmek istediğim 2 konu var.
Basitçe yapmanız gereken,

1. Oversampling
2. Dead band

Netten araştırarak, anlayacağınız hale getirebilirsiniz.

512 kere okuyup 128 e böldüğümüzde 10 bit Adc 12 bit gibi sonuç üretir.
ADC nin geçiş noktasındaki kararsızlığından faydalanarak yapılan birşey bu.  Yani 12 bit sonuç vermez doğal olarak ama 10 biti tam manasıyla bu şekilde okuyabiliriz.

Deadband ı da devreye sokabilirseniz tadından yenmeyecek hale gelir.

[bu arada "Usta" tabirine hiç alışamadım. Bende sizin bir kardeşinizim.]

Maxim

anladım ,
araştırmaya başladım .

yanlız 512 kere okuma yapınca adc hızı bayaa yavaşlıyor .

bkrtncr

Bende olaya baska yonden yaklamak istiyorum;

Analog devre ile digital devrenin tasarimini cok iyi bir şekilde yaparsan ortalama almana bile gerek olmadan sonucu adc'den direk okuyabilirsin.

Sonucta aldigin ortalama programda bir yuk ve gecikme yapacagindan, aldigin analog degeri isleyip, gerekli islemleri direk olarak yapman cok bir kolaylık saglar ve daha saglikli bir sonuc elde edersin.
Bildigini paylaşan, ALİM'dir...

cenkishan

SLM arkadasım adc nin ref voltajını beslemeden okuyorsan sasesini ve beslemesini ayrı tut.gurultu azda olsa azalır.alabildigin kadar ornekleme al eger ICD2 var ise mplabta registerin icindekileri gorup ona gore ortalama yap.cok iyide okumak istiyorsan opamp kullan.RLC filtrede yaptınmı duzgun bir okuma saglarsın.EROL HOCAM VERDİGİNİZ BİLGİLER İCİN SAGOLUN ogrendigim iyi oldu.
Bir bit olsam dolaşsam C de byte byte

arslan74

Merhaba,

Derleyicilerin coğru matematiksel işlemlerde %100 doğru sonuc vermiyor.
Bir miktar hata payı yapma ihtimalleri var.

Matematiksel işlemleri bitsel işlemler haline getirerek hata yapma ihtimalini asgariye indiriyorum.

Aşağıda örnek kod var. Ben ADC değerini milivolt dönüşümlerine hep bu yazdığım fonksiyonu kullaniyorum. Daha doğru değer veriyor hemde daha az yer kabliyor.

unsigned int 
convert2mV(unsigned int adc){
	
	unsigned int val,temp;

//  U[mV] = ((5*adc - 5*adc/64) - 5*adc/128)
	temp = val = (5*adc);
	val -= temp >> 6;
	val -= temp >> 7;
		
	return	val;
}



Selamlar

swat

kardeşim 10 bit adc den doğru veri okumak için mecbur tolerans kullanmalısın buda demek oluyorki son 8 biti almalısın
yada 10 bitlik adc verisi lazımsa 12 bit dönüşüm yapmalısın.

şimdi diyelimki 10 bit veri okudun.  örneğin 1011001100
ilk baştaki 2 LSB bitini yok say 1011001100
geriye kalan 11001100 sayısını kullan.

ADC çözünürlüğü nekadar fazla olursa okadar doğru sonuç elde edersin.
10 bitin hepsini doğruya çıkarmak çok sağlıklı değil.
bu arada kullandığın PIC 10bit dönüşüm yapıyorsa yukarıdaki yöntemle 8 bit kullanmaya mecbursun yada fazladan adc ekle.

benim tavsiyem bu. karar senin.

ahmetBR

imkanın varsa ADC dönüşüm yaparken mikroişlemciyi SLEEP moduna al. Böylece dijital gürültüyü önemli ölçüde azaltmış olursun.
iyi çalışmalar.

zafzaf82

Alıntı Yapşimdi diyelimki 10 bit veri okudun. örneğin 1011001100
ilk baştaki 2 LSB bitini yok say 1011001100
geriye kalan 11001100 sayısını kullan.

@swat ters yazdın galiba LSB yi yok say demişsin ama baştaki 2 biti atmışın. bi yanlışlık yokmu.
Mikroişlemci bi araçtır, amaç değil.....