pic16f877 ile 2 kanaldan ADC okuma ACİL!!!

Başlatan mckmk03, 14 Aralık 2005, 17:26:33

mckmk03

merhaba arkadaşlar
 ben 16f877 ile 2 kanaldan bilgi okuyorum.bu bilgileri alıp seri portla bilgisayara gönderiyorum.Fakat okunan değerler birbirini takip ediyor.örneğin 1. kanal 255 gösterirken 2. kanalı toprağa çekiyorum fakat 2 . kanaldan okunan değer 0 olması gerekirken 20 ler de ve 1. kanaldan okunan değerde 240 a falan düşüyor. ADC nin okuduğu değerler karışıyor sanırım.Fosc , örnekleme zamanı falan o ayarlarda zannedersen bir yanlışlık yapıyorum. hatasız okuma yapmam için ne yapmam gerekiyor.
                     yardım edermisiniz bana.teşekkür ederim

mckmk03

selam arkadaşlar.
       şunu sormak istiyorum.Bütün forumu dolaştım.PİC ile ilgili yazılmış dünya kadar yazı var.ben yukardaki soruyu soralı 2 gün oldu.30 defa görüntülenmiş şimdiye kadar.Fakat kimse küçükde olsa  cevap yazmadı.Yaaa herkez pic asm programlama biliyorda bu bilen arkadaşların hiç biri 2 kanaldan (en az hata ile) anolog bilgi nasıl okunur bilmiyolar mı acaba.
       bunu çok merak ediyorum.

Petek

Vcc ile toprak arasına 100nF kondansatör koy
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

Erol YILMAZ

İki okuma arasındaki zaman farkını artırırsan problemin çözülebilir.

taxin

2 kanal analog okumada +referans ucu kullanılıyor RA0 1.KANAL
RA1    2.KANAL,  RA4 te + referans ucu bu uca uygulayacagın voltaj senin maximum olçme yapayacagın seviyeyi ayarlar örnegin ra4 ü 5 volt a bagladın ve analog okumayı yaptıracagın degişkenide byte olarak tanımladın 0 volt u 0, 5 voltu 255 olarak okursun

ra4 e 2.5 volt verdin diyelim 0 voltu 0, 2.5 ve yukarısı 255 olarak okunur
bu ucu boşta bırakırsan saglıklı okuma yapamazsın

ve okuma yaptıgın kanallara paralel birer kondansatör koyarsan ani değişiklikleri de filtrelemiş olursun

Petek

Vcc ile toprak arasına 100nF kondansatör koy. diğer kenardaki Vcc GND arasına da birtane 100NF koy. Sorunun çözülecek.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

mckmk03

hepize cevap yazdığınız için teşekkür ederim.Ben bugün kendi problemimi kendim çözdüm.ama sizin önerilerinizide dikkate alıcam.
                                   teşekkür ederim.kolay gelsin

Veli B.

Alıntı yapılan: "taxin"2 kanal analog okumada +referans ucu kullanılıyor RA0 1.KANAL
RA1    2.KANAL,  RA4 te + referans ucu bu uca uygulayacagın voltaj senin maximum olçme yapayacagın seviyeyi ayarlar örnegin ra4 ü 5 volt a bagladın ve analog okumayı yaptıracagın degişkenide byte olarak tanımladın 0 volt u 0, 5 voltu 255 olarak okursun

ra4 e 2.5 volt verdin diyelim 0 voltu 0, 2.5 ve yukarısı 255 olarak okunur
bu ucu boşta bırakırsan saglıklı okuma yapamazsın

ve okuma yaptıgın kanallara paralel birer kondansatör koyarsan ani değişiklikleri de filtrelemiş olursun

Bu mesajda bulunan bazı hatalı bilgiler için bu linki inceleyebilirsiniz.
http://picproje.org/index.php/topic,7117&highlight=adcon1

Sonucu etkileyen bazı config ayarları;
1. ADC kaç bit çözünürlük için çalışıyor.
2.10 bit ise sonuç sağa yada sola dayalı olacaktır.Hangi register içeriği, nasıl alınıyor değerlendirme için (ADRESH:ADRESL).Sonucun yükleneceği değişken word tanımlı mı?
3.ADCON1 ayarları yapılırken kullanılacak kanal ve ref ayarları nasıl yapılmış.

1 den fazla kanalı vdd referanslı olarak kullanabilirsiniz.Vref verilmesi zorunluluğu yoktur.

Kanala paralel kondansatör koymak ac gibi sinyaller için kaliteyi bozar bir ölçüde.

Petek

Alıntı yapılan: "mckmk03"hepize cevap yazdığınız için teşekkür ederim.Ben bugün kendi problemimi kendim çözdüm.ama sizin önerilerinizide dikkate alıcam.
                                   teşekkür ederim.kolay gelsin
Bilgiyi isterken çok rahatsınız :) hatta ilgilenen olmadı diye sitem edip, arkasından ince bir siyasetle rastgele birilerinin damarına basıp bilgi almaya çalışıyorsunuz.
Alıntı yapılan: "mckmk03"selam arkadaşlar.
şunu sormak istiyorum.Bütün forumu dolaştım.PİC ile ilgili yazılmış dünya kadar yazı var.ben yukardaki soruyu soralı 2 gün oldu.30 defa görüntülenmiş şimdiye kadar.Fakat kimse küçükde olsa cevap yazmadı.Yaaa herkez pic asm programlama biliyorda bu bilen arkadaşların hiç biri 2 kanaldan (en az hata ile) anolog bilgi nasıl okunur bilmiyolar mı acaba.
bunu çok merak ediyorum.

Peki sorununuzu nasıl çözdüğünüzü size  cevap yazan arkadaşlarla neden paylaşmıyorsunuz? İşiniz bitti mi?
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

CaFFeiNe


mckmk03

@petek
   
      tekrar teşekkür ederim.  :D  bende birisinin bu konuda tepki göstermesini bekliyordum.tabiki işim hallettim diye düşünmüyorum.zaten forumların amacı bilgi paylaşımıdır.Amacını yerine getirmek gerekli.

      Aslında problem çok küçük bi eksiklikten kaynaklanıyormuş.ben okuma frekansını Fosc/8 seçiyordum.bunu Fosc/32 yaptım problem yinede çözülmedi.normalde kanalı seçtikten sonra 30uS lik bir geçikme koyuyordum adc nin hazırlanması için.Bu zaman ADC çevrim için Pic içindeki kondansatörde  depo edilen enerjinin boşalması için gerekli.Hepimizin bildiği gibi pic içerisindeki kondansatörün şarj ve deşarj sürelerine göre çevrim yapıyor.Koymuş olduğum 30uS lik gecıkmeyi adc kanalını seçmeden önce ve  çevrim bittikten sonrada yaptım.Sonuç olarak yaklaşık olarak %0.16 lık bir hata ile doğru çevrim yaptım..
         hepinize teşekkür ederim.Yanlız bir sorum daha olucak.Umarım bana kızmamışsınızdır. Sorumuda yeni bir başlık attında açıcam.Teşekkür ederim.

Petek

Kendi adıma teşekkür ederim. Bir an farklı düşünüp kaba bir yazı yazdım. Dolayısıyla özür diliyorum ben de.

Senin çözümünde o kadar uzun süre bekleme gerekiyormu? Datasheette birkaç us demiyor mu?  

Gerçi biz daha önce 1 ms lik gecikmeler koymuşuz ama sanki okuma işlemi yapıldıktan sonra ADC_OFF yapmadığımız için benzer bir problemle karşılaşmıştık diye hatırlıyorum. Daha sonra ADC_OFF işlemi yapınca hemen arkasından diğer kanal için ADC yi tekrar açıp, kanalı seçip okuduğumuz değer doğru sonuç vermişti. Zaman geçince detayını unutmuşum, aynı durum bizde de olmuştu, bir de seri haberleşmede kesiklikler oluyordu. Bu ikinci sorun, devrede Vcc ve GND arasında 100 NF lık kondansatör koymayı unuttuğumuz için ortaya çıkmış, farkına varınca ekledik ve sorunu giderdik. Tabi ben de aynı devredeki iki sorunu karıştırdım. Özür ...

       setup_adc( ADC_CLOCK_INTERNAL );
       set_adc_channel( 0 );
       okunan    = read_adc();
       setup_adc( ADC_OFF );
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

mckmk03

önemli değil birbirimize yardım edebiliyorsak ne mutlu bize.10 bitlik çevrim için en az 12uS gecikme yapılması gerekiyor diyo fakat ben garanti olsun diye 30uS yaptım.
       anolog kanaldan okuduğum değerler sürekli oynuyor.yani 120-121-120-121 gibi.Bu salınımları gidermek için anolog kanal girişine 100nF lık kond. koydum fakat hala sorun devam ediyor.başka bişey yapılabilir mi bu konuda acaba.

Petek

Alıntı yapılan: "mckmk03"önemli değil birbirimize yardım edebiliyorsak ne mutlu bize.10 bitlik çevrim için en az 12uS gecikme yapılması gerekiyor diyo fakat ben garanti olsun diye 30uS yaptım.
       anolog kanaldan okuduğum değerler sürekli oynuyor.yani 120-121-120-121 gibi.Bu salınımları gidermek için anolog kanal girişine 100nF lık kond. koydum fakat hala sorun devam ediyor.başka bişey yapılabilir mi bu konuda acaba.
Süreler konusuna sakin bir zamanda tekrar bakayım .

Değer salınımı anormal değil. Bir zaman 16F84 le çlıştığım yıllarda devremde Vcc-GND arasına en az 100 nF lık kondansatör koymayı unutmuşum. Daha doğrusu konması gerektiğinin farkında değildim. Elimde 2 tip 16F84 vardı, biri A modeliydi. Data eeproma birşey yazdırmak istiyorum ama bir türlü yazmıyor. Saatlerce programda hata aradım. Sonra nereden esti bilmiyorum. İşlemiciyi diğer modelle değiştirince istediğim işin yapıldığını gördüm. Demek yazılımdan kaynaklı bir hata yoktu. Sonra kondansatörün eksikliğini gördüm ve o zaman elimde 10 uF lık bir kondansatör vardı, hemen bağladım. Her iki işlemci de tam istediğim gibi çalışır hale geldi. Bu örneği vermemdeki maksat şu, işlemci içerisinde yürüttüğün bazı işlemler fazla akım çekilmesine ve içeride gerilim dalgalanmasına neden olabilir. Seninkinde çok küçük, benim örnekte (eeproma yazacak ya) daha büyük dalgalanma oluyor(du nefesi yetmediği için de yazamıyordu).
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

mckmk03

benim salınım değerleri çok küçük ama yinede hiç olmamasını yeğlerim.Aslında ben dc motorun  PID ile hız kontrolünü yapıyorum.Hesaplanan değerlerin doğruluğuna bakmak içinde o değerleri bilgisayara gönderip izliyorum.motora uygulanan pwm değeri  set value (AN0 dan okunan değer) ve proses value (AN1 den okunan değer) değerlerinin sürekli değişiminden etkileniyo ve sürekli değişiyo.Aslında gerçek devrede bunu denesem bu salınımları DC motor algılayamaz bile.Ama neyse bu kadar salınımda olabilir artık diyelim.
                 yadımlarınız için teşekkürler