Adc çok değişken sabit kalmıyor

Başlatan bybik, 19 Mayıs 2009, 20:05:17

bybik

Arkadaşlar 6 kanaldan adc ölçyorum hem 10 bit hemde 8 bit ölçtüm ama ölçtüğüm değerler ben bir değişiklik yapmadığım halde hep aşağı yukarı oynuyo nedeni ne olabilir.Değişiklik en fazla 3-4 oluyor ama genede işimi aksatıyor.

Birde lcd de karekter gözükmesi için  doğrudüzgün başlatmak için 3-4 reset veya enerjiyi açıp kapatmam gerekiyor.Nedeni ne olabilir başlamadan önce beklemede var ama genede yapıyor.

omenek

Kanal seçtikten sonra 20,30 mikrosaniye kadar gecikme yap.

bybik

kanal seçtikten sonra derken kanalları ölçerken arasınamı bekleme koyiyim

tayyar

okunacak adc kanalını sectikten sonra 20-30 milisaniye bekleme yapmak gerekir pic in o kanalı tam olarak ele alması biraz zaman alıyor. Basicte nasıl bilmiyorum ancak örnek olması açısından ccs c de

set_adc_channel(0); // 0 nolu kanala geç
delay_ms(20); // 20 milisaniye bekle
veri=read_adc(); //kanaldan gelen veriyi değişkene at


seklinde bir kullanım var
--EGEMENLİK KAYITSIZ ŞARTSIZ MİLLETİNDİR--

bybik

Ama basicde bu mümkün değil herşey tek komutta oluyor.

ADCIN 3,ham


3. kanalı ölç ham a aktar gbi

Maxim

Alıntı yapılan: "bybik"Ama basicde bu mümkün değil herşey tek komutta oluyor.

ADCIN 3,ham


3. kanalı ölç ham a aktar gbi

tamam işte bu satırın altına bir gecikme koymak gerekiyor ,

adcin 3,ham
pauseus 20
ham=ham + 50

gibi ...

gecikme için milisaniye değil ,mikrosaniye yeterlidir ,

ama senin sorun muhtemelen bundan değil zaten ,

ısrarla kodun o parçasını ve şemayı vermiyorsunuz ya boşa kürek çekmeye devam .

leblebitozu

8-10 kez oku aynı veriyi, okunan adc değerlerini topla ve ortalamasını al

bybik

Alıntı yapılan: "maxiboost"
Alıntı yapılan: "bybik"Ama basicde bu mümkün değil herşey tek komutta oluyor.

ADCIN 3,ham


3. kanalı ölç ham a aktar gbi

tamam işte bu satırın altına bir gecikme koymak gerekiyor ,

adcin 3,ham
pauseus 20
ham=ham + 50

gibi ...

gecikme için milisaniye değil ,mikrosaniye yeterlidir ,

ama senin sorun muhtemelen bundan değil zaten ,

ısrarla kodun o parçasını ve şemayı vermiyorsunuz ya boşa kürek çekmeye devam .

Aslında vermeyi bende istiyorum.Ama kodu yazınca mesaj üyelere sanrım uzun geliyor okumadan kapatıyorlar hiç cevap alamıyorum.
Böyle kısa yazınca cevap alma ihtimalim daha fazla oluyor.

işte kodlar


TRISB=%00000000                                   
TRISD=%00000000
TRISC=%00000000 
TRISA=%11111111
TRISE=%111

@_CONFIG1H_FOSC_XT_XT_1H
'xt osc
@_CONFIG2H_WDT_OFF_2H          
'bekçi köpek kapalı
@_CONFIG1H_PLLDIV_4_1L
'4 mhz kristal 
@_CONFIG2H_BOR_OFF_2L
'gerilim düşme sıfırma kapalı
@_CONFIG3H_MCLRE_Off_3H
' mclr açık
@_CONFIG2H_PWRT_OFF_2L 
' PWRT kapalı
@_CONFIG6H_WRTB_OFF_6H
'kod koruma yok
@_CONFIG5H_CPB_OFF_5H
 'kod koruma yok 
@_CONFIG4L_DEBUG_Off_4L
'rb6-rb7 açık programlama


i       var byte
adc     var word[6]
ham     var word

pause 1000  
DEFINE  LCD_DREG    PORTB
DEFINE  LCD_DBIT    0
DEFINE  LCD_RSREG   PORTB
DEFINE  LCD_RSBIT   5
DEFINE  LCD_EREG    PORTB
DEFINE  LCD_EBIT    4
DEFINE  LCD_EBITS    4
DEFINE  LCD_LINES   2
DEFINE  LCD_COMMANDUS   2000
DEFINE  LCD_DATAUS   50
DEFINE OSC 4       
DEFINE ADC_BITS        10       
DEFINE ADC_CLOCK       1
DEFINE	ADC_SAMPLEUS	100

  
ADCON1=%00010111 
ADCON2=%10001001   


basla:
 gosub olc
 LCDOUT 254,128,DEC4 adc[0]
 LCDOUT 254,133,DEC4 adc[1]
 LCDOUT 254,138,DEC4 adc[2]
 
 LCDOUT 254,192,DEC4 adc[4]
 LCDOUT 254,197,DEC4 adc[5]
 LCDOUT 254,202,DEC4 adc[6]
 PAUSE 400  
goto basla


olc:

For i=0 to 6
  if i=3 then i=i+1
  pause 50
 ADCIN i,ham
  if adc[i]>(ham+2) or adc[i]<(ham-2) then adc[i]=ham   'eğer yeni ölçülen değer ilkinden 2 büyük veya 2 küçükse yeni değeri aktar
  pause 50
next i

return


Bunlarda hem kod hem isis

http://rapidshare.com/files/234923383/Desktop.rar.html

isisde olmuyor ama gerçek devrede her saniye değerler 5 aşağı 5 yukarı oynuyo

bybik

olc:


For i=0 to 6
 if i=3 then i=i+1
 for k=0 to 9
    ADCIN i,ham
    pauseus 100
    adc[i] =ham+adc[i]
 next k
 adc[i]=adc[i]/11
next i
return


10 kere olcup ortalama aldım ama gene değişiyor.

Kristali 20 mhz yapsam daha kararlı olurmu? bu arada mcu olarak 18f4550 kullanıyorum.

Ziya

dahili referans kullanıyorsanız beslemenizdeki gürültü etkiliyor olabilir. Bir de ölçüm aldığınız yerden gelen gürültü varsa 3-4 civarında adc değer oynaması normal sayılabilir. Daha hassas ölçüm için ADCIN standart komutu yerine bir alt program yazıp, kanal seçtikten sonra 5-6 mikrosaniye bekleyip okutun, referans gerilimini dahilden verecekseniz pic besleme hattına 100 nF kondansatör ekleyin, ADC girişiniz fazla hızlı değişen bir hat değil ise bir indüktör (çok küçük değerli) üzerinden ADC'ye bacağına verin.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

muhittin_kaplan

lcd ye mesajları felan yazdığında, yada çıkışlardaki led vs varsa bunlar çalıştığında giriş gerilimini ölç. oynama varmı ?
benin yaşadığım bir problem;
7805 ile beslediğim devrede role çekince değer oynamaya başlıyordu. sonra role çekince giriş voltajının 4.9 dan 4.4 e düştüğünü gördüm. bu düşüş Vref i de değitiriyor buna bağlı olarak tüm hesaplar karışıyordu..

bybik

Alıntı yapılan: "muhittin_kaplan"lcd ye mesajları felan yazdığında, yada çıkışlardaki led vs varsa bunlar çalıştığında giriş gerilimini ölç. oynama varmı ?
benin yaşadığım bir problem;
7805 ile beslediğim devrede role çekince değer oynamaya başlıyordu. sonra role çekince giriş voltajının 4.9 dan 4.4 e düştüğünü gördüm. bu düşüş Vref i de değitiriyor buna bağlı olarak tüm hesaplar karışıyordu..

Enerji girişe iyi bri kondansatör bağlayınca sorun çözüldü herkese teşekürler.