Analog girişten gelen sinyali grafik LCD'de çizdirmek

Başlatan ovaliiismail, 12 Mart 2018, 17:52:27

ovaliiismail

Arkadaşlar analog girişten gelen herhangi bir sinyali örneğin sinüs sinyalini grafik LCD'de çizdirmek istiyorum.Şöyle bir mantıkla yapabilirim diye düşündüm.Analogdan gelen sinyali okuyacak LCD'nin 1.sütunun ilgili satırını aktif edicek.Daha sonra bir daha okuyacak 2.sütunun ilgili satırını aktif edicek.Bu şekilde çizdirmeyi düşünmüştüm.Ama çalıştırdığımda bambaşka bir şey çıkıyor.
#include <16f877.h>

#device ADC=10

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)

#include <HDM64GS12.c>

#include <graphics.c>

int i,j=1,k;

void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   
   setup_adc(adc_clock_div_32);
   setup_adc_ports(ALL_ANALOG);
   
   glcd_init(ON);
   
   while(1)
   {
      for(k=1;k<=128;k++)
      {
         set_adc_channel(0);
         delay_us(20);
         i=read_adc();
         glcd_pixel(j,64-i,ON);
         j++;
      }
      glcd_init(ON);
   }
}

halil82ist

10 bit adc okuyorsun gördüğüm kadarıyla 1024 kademe ama 64 - yazmışsın porgramda .

         i=read_adc()/16;
         glcd_pixel(j,64-i,ON);

böyle bir dene istersen .

ovaliiismail

Öyle de denedim sorun çözülmedi.Ama sorunun neden kaynaklandığını buldum.ADC okurken bekleme süresi koymadığımız için örnekleme frekansımız çok yüksek oluyor.Bu yüzden çok hızlı örnekleme yapıp çizdiriyor.Bu yüzden saçma şekiller görüyorum.Deneme yanılma yoluyla 10ms gecikme koyduğumda işler düzeldi.Ama tam anlamıyla değil.Sinüsün 0'ın altında olan kısımlarını çizdiremiyorum çünkü 0-1024 çözünürlüğe sahibiz.

devrecii

Picleri bilmiyorum ama adc çevrimin bittiğini gösteren bir fonksiyon mutlaka vardır.  Adc öçlümü yapar sende alıp ekrana çizdiririsn.

ac okumak için


ovaliiismail


elektronart

ADClerde dönüşümü başlatmadan önce interrupt kurabilirsin. Dönüştürme işlemi bittiğinde bu interrupt sana bittiğini haber verir. İnterrupt servis rutini içinde değeri okuyup adcyi tekrar kurarsın. Böylece hiç kayıp yaşamadan sinyali örnekleyebilirsin. 10ms bir ADC için yüksek bir değer. 1-2ms içinde dönüşümü tamamlar çoğu denetleyici.
Açık Elektronik

tekosis

1 - Her for döngüsünde tekrar tekrar adc kanalını set etmene ve 20us lik beklemeyi vermene gerek yok. While döngüsünden önce bir defa bu ayarı yapman yeterli.


2 - Ya for döngüsü bittikten sonra j'yi sıfırla ya da j yerine k değişkenini kullan, gereksiz ram bellek kullanmana lüzum yok.


3 - i değişkeni adc den alınıp doğrudan ekrana yansıtılıyor. Adc den alınan veriler hiç bir yazılımsal filtreden geçirilmeden kullanılırsa bahsettiğiniz hatalı ölçümler olması normal, yazılımsal filtreleme örneklerini incelemenizi tavsiye ederim.


4 - 128 adet for döngüsü tamamlandıktan sonra ekranı temizlemek için kullandığın glcd_init(ON) komutu yerine ekranı temizleme ilgili bir komut varsa onu kullanabilirsin. Tabi hangisinin daha sağlıklı ve hızlı olduğuna bakmak lazım.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.