Şimdi Ara

16F877'de Analog input

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir (1 Mobil) - 1 Masaüstü1 Mobil
5 sn
29
Cevap
0
Favori
1.861
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 12
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • Selam arkadaşlar,

    Projemde bir load cell'den değer okumam gerekiyor ve bu için 16F877 kullanacağım. Load cell'im kendinden amplifikatörlü ve max. çıkış gerilimi (12 kg yükte) 4.5 V. Ancak 16F877 ile analog sinyal okumaya çalışırken yaklaşık 3 V'tan sonra alet sapıtıyor. Load cell'imi tam yük altında da çalıştırmak için picte yazılımsal olarak yapılabilecek birşey var mı? Yoksa 16F877'nin analog input limiti 3 V'mi? Eğer öyleyse, sanırım opamp falan kullanıp voltajı yarıya indirmem gerekiyor, değil mi?

    Cevap için şimdiden sağolun.

    p.s. 16F877'nin datasheet'ine göz attım ama Analog girişlerin voltaj limitiyle ilgili birşeye rastlamadım. Muhtemelen vardır ama ben o kadar anlamadığım şey arasında görememişimdir







  • yazdıgın programı yollarsan daha net cevaplar alabilirsin ve analog giriş max limit 5V burda değişkeni word olarak kullanırsan max olarak ham degerin 1023 olacak
  • Tabi ki. Bizde gizli saklı olmaz

    'A/D ÇEVRİM PARAMETRELERİ

    DEFINE ADC_BITS 10
    DEFINE ADC_CLOCK 3
    DEFINE ADC_SAMPLEUS 50

    INCLUDE "MODEDEFS.BAS"


    'LCD PARAMETRELERİ

    DEFINE LCD_BITS 4
    DEFINE LCD_DREG PORTD
    DEFINE LCD_DBIT 4
    DEFINE LCD_RSREG PORTE
    DEFINE LCD_RSBIT 0
    DEFINE LCD_EREG PORTE
    DEFINE LCD_EBIT 1


    'DEĞİŞKEN TANIMLAMALARI

    olcum VAR WORD
    i VAR WORD
    toplam VAR WORD
    ortalama VAR WORD
    kuvvet VAR WORD
    olcum_sayisi CON 100


    'PROGRAM

    TRISA =%11111111
    ADCON1 =%10000100
    ADCON0 =%10000001
    TRISB =%00000000

    LCDOUT $fe,1, " KORAY ULU "
    LCDOUT $fe, $c0, " 25/09/2007 "
    PAUSE 3000

    Loop:

    i = 1
    toplam = 0

    WHILE i < olcum_sayisi
    i = i + 1
    ADCIN 0,olcum
    toplam = toplam + olcum
    WEND

    ortalama = toplam / olcum_sayisi
    kuvvet = 13931 * ortalama / 1000 - 14664/10

    LCDOUT $fe,$80, " KUVVET" ," ", #kuvvet ," " , "gf" , " "
    LCDOUT $fe, $c0
    PAUSE 500

    GOTO loop

    END


    Bir iki ufak açıklama faydalı olabilir diye belirteyim:
    Ölçüm sayısı dediğim şey, ölçüm hatasını azaltmak amacıyla yapıldı. Program 100 ölçüm yapıp, bunları toplayıp, ortalamalarını sonuç olarak alıyor.
    'kuvvet =' diye başlayan satırdaki denklem, ham değeri gerçek gram değerine dönüştürmeyi sağlıyor. Bu denklemi elde etmek için load cell ile ölçüm yaparak ölçüm sonuçlarını lineer bir denkleme uydurdum. Bu denklemin deneysel ölçüm değerleriyle arasındaki hata payı en fazla 28 gr oldu.

    Ama dediğim gibi, 6500 gr. civarından sonra sayılar sapıtmaya başlıyor. Load cell'in çıkış voltajına baktığımda herhangi bir problem yok, lineer gitmeye devam ediyor. Yani sorun PIC'te. Ama nerde???



    < Bu mesaj bu kişi tarafından değiştirildi Hasbi 81 -- 29 Eylül 2007; 15:28:25 >




  • Yaptığın matemetiksel işlemde parantez kullanmanı tavsiye ederim.
    kuvvet = (13931 * (ortalama / 1000) - 14664)/10 gibi.Ve yaptığın işlemde değerin 65535 değerini geçmemesine dikkat et.
  • )Yok, bu haliyle problem yaratmıyor. Zaten o sondaki '/10' denklemin tamamı için değil, sadece 14664 için.

    Ama daha sonra Pic'i yormamak için denklemi şu şekilde değiştirdim:
    kuvvet = 14265 / 1024 * ortalama - 1467

    Forumda birisi pic'e ikinin katları üzerinden işlem yaptırmak hızı arttırır demişti. O yüzden 1024'e böldüm ve sonuçlar tam sayıya yuvarlandığında önceki denkleme göre bazı değerlerde en fazla 1 gramlık fark oluştu. (ki benim load cell'imin hassasiyeti zaten o kadar yüksek değil
  • register lara atanan değerlerde herhangi bir sorun yok gibi görünüyor fakat
    kuvvet = 13931 * ortalama / 1000 - 14664/10 işleminin sonuncunun WORD sınırları içerisinde kaldığından emin olmak lazım! belli değerden sonra sapıtması WORD olan değişken içeriğinin taşmasından kaynaklanıyor olabilir!!!
  • olcum_sayisi CON 10
    TRISA =%11111111
    ADCON1 =%10000100
    ADCON0 =%10000001
    TRISB =%00000000

    LCDOUT $fe,1, " KORAY ULU "
    LCDOUT $fe, $c0, " 25/09/2007 "
    pause 3000
    lcdout $fe,1
    Loop:

    i = 1
    toplam = 0

    WHILE i =< olcum_sayisi
    i = i + 1
    ADCIN 0,olcum
    toplam = toplam + olcum
    WEND
    kuvvet = (toplam/10)*14

    LCDOUT $fe,$80, " KUVVET" ,"=", #kuvvet ," " , "gf" , " "
    LCDOUT $fe, $c0


    GOTO loop

    END


    hesaplamalarda biraz eksiğin vardı bir incele kafana takılan olursa sor cevaplamaya çalışalım


    Edit: yukarda bi ekleme var



    < Bu mesaj bu kişi tarafından değiştirildi cundali11 -- 29 Eylül 2007; 16:41:51 >
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • kuvvet = (toplam/10)*14
    bu degeri verdüm çünkü tam 4.5Vta hesapla sağlam küsüratlı 12000gr mı yakalayamazsın (yada ben yolunu bilmiyorum ) böylece analog girişe bi pot takıp 4.5 V ta 12000gr mı ayarlayabilirsin
  • ya kusura bakmayın bi yanlışlık yapmışım
    WHILE i < olcum_sayisi

    kuvvet = (toplam/10)*15

    satırlarını bu şekilde değiştirmek gerek
  • @cundali11: Benim load cell için veridğim 12 kg tam olarak max. yük değil. Aslında 25 lb, yani 11,34 kg. Ayrıca üzerinde yük yokken de +0,5 V çıkış veriyor. Yani ham değerden grama geçiş formülü maalesef o kadar kolay olmuyor En sağlıklı sonuç için, yukarda bahsettiğim gibi deneysel ölçüm yapıp, bu sonuçlara göre bir denklem çıkardım ve şu anda 7 kg civarına kadar hatasız çalışıyor. O kısımları dert etmeye gerek yok
    Edit: WHILE i =< olcum_sayisi satırındaki düzeltme konusunda haklısın! Benim yazdığımda 99 değer ölçüp 100'e bölüyor. Ya i = 0 ile başlayacam, ya da senin yazdığın gibi 'küçük eşit' kullanacağım. Sağolasın

    @r2d2droids: Olayın o işlemle veya daha sonra biraz daha iyileştirdiğim haliyle bir ilgisi yok. Çünkü aynı problem ham değer okurken de karşıma çıkıyor.
    kuvvet = ortalama
    diyerek yazdırdığım ham değerlerde 7 kg yükte (load cell çıkışı 2.97 V olarak gözüküyor) 595 sonucu çıkıyor. 595'ten sonra çok kısa bir aralıkta 65bin küsür, ondan sonra biraz daha arttırınca yük 0'dan başlayarak tekrar artmaya başlıyor gibi görünüyor ama sanki normale biraz dengesiz şekilde ilerliyor. Başka ne sebebi olabilir?



    < Bu mesaj bu kişi tarafından değiştirildi Hasbi 81 -- 29 Eylül 2007; 17:15:04 >




  • arkadaş tamam işte kendi ağzınla söyledin 595 ten bir anda 65 lere çıkıp değişiyor çünkü
    kuvvet = 13931 * ortalama / 1000 - 14664/10
    satırı olayı bozan kıısm ve bu kısımda yanlış yazılmış çarpmaları bölmeleri benim yaptıgım gibi parantez içine sokmalısın @r2d2droids in demek istedigi zaten degişkenlere 65535 ten fazla deger verremezsin taşar 0 lanır ve kaldıgı yerden devam eder (ama 0dan ittibaren)

    ve yük yokken sensör çıkışınmı 0.5V veriyor aceba bunun bir ayarı varmıdır olması gerek

    quote:


    orjinalden alıntı: cundali11

    ya kusura bakmayın bi yanlışlık yapmışım
    WHILE i < olcum_sayisi

    kuvvet = (toplam/10)*15

    satırlarını bu şekilde değiştirmek gerek


    birde ilk şunları yap 0.5Vtu 0V a düşürebilirmisin ona bak eger düşüremezsen buna karşılık gelen degeri programda son işlem olarak çıkartabilirsin
    ilk olarak yazdıgım programı pice bi yükleyip dene istersen




  • quote:

    Orjinalden alıntı: cundali11

    arkadaş tamam işte kendi ağzınla söyledin 595 ten bir anda 65 lere çıkıp değişiyor çünkü
    kuvvet = 13931 * ortalama / 1000 - 14664/10
    satırı olayı bozan kıısm ve bu kısımda yanlış yazılmış çarpmaları bölmeleri benim yaptıgım gibi parantez içine sokmalısın @r2d2droids in demek istedigi zaten degişkenlere 65535 ten fazla deger verremezsin taşar 0 lanır ve kaldıgı yerden devam eder (ama 0dan ittibaren)

    ve yük yokken sensör çıkışınmı 0.5V veriyor aceba bunun bir ayarı varmıdır olması gerek

    quote:


    orjinalden alıntı: cundali11

    ya kusura bakmayın bi yanlışlık yapmışım
    WHILE i < olcum_sayisi

    kuvvet = (toplam/10)*15

    satırlarını bu şekilde değiştirmek gerek


    birde ilk şunları yap 0.5Vtu 0V a düşürebilirmisin ona bak eger düşüremezsen buna karşılık gelen degeri programda son işlem olarak çıkartabilirsin
    ilk olarak yazdıgım programı pice bi yükleyip dene istersen

    Yukarda yazmıştım: o işlemi hiç yaptırmasam, direk ham sonucu yazdırsam bile aynı problem var. Ayrıca bu formül 7 kg'a kadar hatasız şekilde çalışıyo da, ondan sonra mı hata çıkarmaya başlıyor?

    65535'ten sonra sapıtmasını anlıyorum ama dediğim gibi ham değerlerle işlem yaparken 595'ten sonra uçuyor. Ama ortalama almak için 100 ölçümü toplarken bu sayıyı geçiyor olabilir! Bir de ölçüm sayısını 50 yapıp deneyecem. Sonucu ileteceğim arkadaşlar...

    ps. Load cell'in yük yokken 0.5 V çıkış vermesi konusunda yapılabilecek birşey yok maalesef. Load cell'in karakteristik eğrisi bu şekilde, değiştirmek mümkün değil.




  • Sorun çözülmüştür arkadaşlar !!! Yardımlarınız için çok teşekkürler!

    Dediğim gibi programın en başındaki 'Ölçüm sayısı' sabitini 50 olarak değiştirdim, problem halloldu. Ah 65535 ah...



    < Bu mesaj bu kişi tarafından değiştirildi Hasbi 81 -- 29 Eylül 2007; 18:23:10 >
  • ah işte ah benim dediğim programı yğkle dedim ya sana orda dikkat etiysen ortalama alma sayısını 10 diye aldım sen 100 aldıgın iöçin 1023*100 = 36765 çıkar ben orda bu yüzden 10 aldım ama 50 alırsan tamam ozaman 1023*50 = 51150 çıkacak buda 65535 ten ufak
  • TRISA = 255 ;PORTA'YI GIRIŞ OLARAK TANIMLA

    ADCBILGI VAR BYTE
    A VAR BYTE
    B VAR BYTE
    C VAR BYTE
    D VAR WORD

    ADCON1 = 0 ;ADCON1 REGISTERINI SIFIRLA

    ADC_OKU:

    ADCIN 5, ADCBILGI ;A0 KANALINDAN ANALOG VERI OKUR,
    ;DIJITAL BILGIYI ADCBILGI DEGISKENINE ATAR
    D=ADCBILGI*100/51 ;BILGI VOLTAJ CINSINDEN YAZILIR

    LCDOUT 254, 1 ;EKRANI TEMIZLE

    A=D DIG 2 ;ADCBILGI DEGISKENININ SAGDAN 3. RAKAMINI A'YA
    B=D DIG 1 ;ADCBILGI DEGISKENININ SAGDAN 2. RAKAMINI B'YE
    C=D DIG 0 ;ADCBILGI DEGISKENININ SAGDAN 1. RAKAMINI C'YE ATADIK

    LCDOUT #A, ".", #B, #C," VOLT" ;EKRANA DEGERLERI YAZDIRDIK(*DIPNOT 3)

    PAUSE 100
    ;100 MILISANIYE BEKLEYIP BASA DÖN
    GOTO ADC_OKU


    Bu programda girişe gelen voltajı birebir ölçüyorsun.İstersen bu programı önce dene.Bakalım loadcellin normal çalışıyormu.Daha sonra ağırlık orantı hesaplarını yaparsın.




  • Sağolasın hocam, gerek kalmadı. Dediğim gibi problem tamamen halloldu Sinyal voltajını zaten voltmetreyle okuyup kontrol etmiştim. Gayet sorunsuz şekilde 7 kg'dan sonra da lineer şekilde artmaya devam ediyordu. Bütün problem pic'teydi ama o da bitti

    Projemin bundan sonraki adımı model arabamın gaz servosunu pic ile sürmek. Hadi hayırlısı
  • ne mutlu darısı bizim projelerin başına inşallah
  • geç kaldık bari geçmiş olsun diyelim...
  • Eyvallah

    Yanlız şimdi pic'in ölçtüğü değeleri hassas teraziyle karşılaştırınca, aslında ölçümlerin pek de hassas olmadığını gördüm. Hassas teraziyle yaptığım yeni ölçümlerden sonra denklemi aşağıdaki şekilde değiştirdim:

    kuvvet = (13793/1000)*ortalama - 1525

    Bu denklemde 300 gr'a kadar hatalar oluştu. Oysa ki aynı denklemi excel'de çalıştırdığımda deney sonuçlarına göre max. 28 gr. hata oluyordu.
    Bunun üzerine pic dediğimiz aletin bölme işlemi konusunda özürlü olabileceğini, bu hatanın yuvarlama hatalarından kaynaklanabileceğini düşünüp (13793/1000) yerine direk 14 sayısını yapıştırdım. Haliyle sonuç değerleri biraz yükseldi ama düşük yüklerde hassasiyeti daha iyi yakalayacak şekilde '-1525' kısmını '-1575' olarak değiştirerek durumu biraz olsun dengeledim. Yani içinde hiç bölme işlemi olmayan, el terazi göz nizam bir denklem oluşturdum

    Şimdi Excel diyor ki, bu yeni denklemdeki en büyük hata, eski haline göre 4 kat daha fazla! Ama pic açısından durum hiç de öyle değil. Eskiden 300 gr'lara varan hata, artık 60 gr'ı geçmiyor Neyse ki bu hassasiyet de bana fazlasıyla yetiyor. Güzel bir maceraydı, paylaşmak istedim.




  • yok, pic işlem özürlü değildir. fakat A/D çevriminde sapmalar oluşabilir. bunun içinde picin A/D modülüne giden analog girişi empadansını 10K altına çekmeye çalışın bu işe yarayacaktır. datasındada bu durum The maximum recommended impedance for analog sources is 10 kΩ şeklinde belirtilmiş. ayrıca sapmalar ondalık kısım hatalarından da kaynaklanabilir. zaten programda tanımlanmış herhangi bir float değişkenide yok gördüğüm kadarıyla...
  • 
Sayfa: 12
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.