Adc Okuma Sabitleme

Başlatan HeCToR, 22 Mart 2015, 10:58:15

HeCToR

Merhaba Arkadaşlar ;

minumum adc değerim 585 diyelim
maximum adc değerim 878 diyelim

şimdi benim minumum adc değerim 585 ve 585'den küçükse  örnek veriyorum output_high(PIN_A0); sabit kalacak taki 878 ve 878'den büyük olana kadar sonra pin low olacak bunu nasıl yazmalıyım ? ikincisi adc değerim 585 ve 586 arasında kararsız kaldı sürekli değişiyor diyelim bunu sürekli pini high low yapmaması gerekiyor
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Gerekir

Kabil ATICI

#1
İşlemcilerde (örneğin seri portta) gelen sinyal 3 kez okunur, bunlardan 2 tanesi aynı ise değer olarak o kabul edilir.

1)Burada kontrol mekanizmana göre (veya hızına göre 5 tane) okuma değerini alırsın bunlardan 3 tanesi aynı ise değer olarak onu kabul edebilirsin. Bu tepki süreni yavaşlatır ama kararlılığını artırır.

2)Veya ortalama yöntemini kullanabilirsin.
5 tane değeri alır ve ortalamasını alırsın. Değerlerin hepsi yeni olması gerekmez, dizi olarak alır, her adc okumasında son okumayı diziye eklerken, en eski okumayı silersin.

Bu yöntemler hızlı tepki için değildir.


Senin yaptığın şeyde zaten sürekli değişim olmaz.

senin verdiğin örnekte (yanlış anlamadıysam)
              585                878

lojik 1      <......................>      lojik 0        PIN-A0 için
                |---------------lojik 0 alanı---------------------
-------lojik 1 alanı----------|

... ile işaretli alanda bir değişim olmaz.
Schmitt tetikleyici yapmışsın. onun için sınır değerde bir değişik olması sorun olmaması gerekir


ambar7

HeCToR

585 ve altı  lojik 1 iken
586 değerinde lojik 0 olmayacakmıdır eğer benim adc voltajımda sürekli oynuyorsa pin A0 kararsız çalışmayacakmıdır ?
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Gerekir

Kabil ATICI

#3
Niye öyle olsun ki. Senin yazdıklarından anladığım kadarı ile
586 altında lojik 1 olacak 586 olduğunda değişmeyecek taa ki 878 çıkıncaya kadar. 879 olduğunda lojik 0 olacak.
Burada belirttiğine göre 586 ile 878 aralığında bir değişim yok.

if adc <586
lojik-1

if adc>878
lojik-0

böyle bir ifade 585-586 olduğunda çıkış nasıl değişir? 585 olduğunda çıkış lojik 1 olur, ama 586 olduğunda bir şey olmaz.


ama ben yanlış anladıysam o zaman durum farklı tabii
Ama senin sınır değerin 585-586 olupta bu değerin altında lojik 1 üstünde lojik 0 oluyorsa  sıkıntı olur. (programı yazan sensin)
ambar7

HeCToR

void main ()
{ 

int16 adc_deger; 
setup_ADC(ADC_CLOCK_INTERNAL); 
setup_ADC_ports(AN0_ANALOG); 

set_adc_channel(0);
adc_deger=read_adc();



if (adc_deger<585)

{

output_high(PIN_A5);


}

if (adc_deger>878)

{

output_high(PIN_A5);

delay_ms(200);
output_low(PIN_A5);
delay_ms(200);
output_high(PIN_A5);
delay_ms(200);
output_low(PIN_A5);

}


while (TRUE) 
{ 

adc_deger=read_adc();

output_bit(PIN_A1,(adc_deger>585));
output_bit(PIN_A1,(adc_deger<585)); 
//output_bit(PIN_A2,(adc_deger>878));


if (adc_deger>878){

output_high(PIN_A2);
delay_ms(10);
output_low(PIN_A2);
delay_ms(10);
output_high(PIN_A2);
delay_ms(10);
output_low(PIN_A2);
delay_ms(10);
output_high(PIN_A2);
delay_ms(10);
output_low(PIN_A2);
delay_ms(10);
output_high(PIN_A2);
delay_ms(10);
output_low(PIN_A2);

}

delay_ms(1000);
output_low(PIN_A5);

}
}


Alt satırdaki fonksiyonları while içerisinde sürekli taramak istiyorum Hocam

if (adc_deger<585)

{

output_high(PIN_A5);//1000ms sonra lowa geçip lowda kalması gerekiyor taki  adc_değer>878 olana kadar


}

if (adc_deger>878)

{

output_high(PIN_A5);

delay_ms(200);
output_low(PIN_A5);
delay_ms(200);
output_high(PIN_A5);
delay_ms(200);
output_low(PIN_A5);//Bir defa bu döngüyü işledikten sonra lowda kalması gerekiyor taki  adc_deger<585 olana kadar 
 
}
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Gerekir

Kabil ATICI

#5
bayrak kullanmayı biliyorsun. Yapmak istediğin iş için bayrak kullan.
int bayrak;
bayrak=0'dan başlayıp istediğin adımları gerçekleştirdikçe değerini değiştir.

if( (adc_deger>878)&&(bayrak==0)

{
bayrak=1;
output_high(PIN_A5);

delay_ms(200);
output_low(PIN_A5);
delay_ms(200);
output_high(PIN_A5);
delay_ms(200);
output_low(PIN_A5);//Bir defa bu döngüyü işledikten sonra lowda kalması gerekiyor taki  adc_deger<585 olana kadar 
 
}


bu işlemi tekrar yapabilmesi için
if( adc_deger<585){
...
bayrak=0; 
..
}


yapabilirsin gerekirse aynı işlem için diğer şartlar içinde kullanabilirsin.
ambar7

mufitsozen

Alıntı yapılan: CORTEX - 22 Mart 2015, 10:58:15
Merhaba Arkadaşlar ;

minumum adc değerim 585 diyelim
maximum adc değerim 878 diyelim

şimdi benim minumum adc değerim 585 ve 585'den küçükse  örnek veriyorum output_high(PIN_A0); sabit kalacak taki 878 ve 878'den büyük olana kadar sonra pin low olacak bunu nasıl yazmalıyım ? ikincisi adc değerim 585 ve 586 arasında kararsız kaldı sürekli değişiyor diyelim bunu sürekli pini high low yapmaması gerekiyor

sayin @cortex sizin yapmaniz gereken 'input hysteresis' denilen teknigi kullanmak.



bunu minik bir FSM ile yapabilecegin gibi daha once size onerildigi gibi 'flag'(bayrak) kullanarakta yapabilirsiniz.

yani:

#DEFINE HYST_LOW 575
#DEFINE HYST_HIGH 878

uint8_t    cikis_state=0;


while(1){
     ......................
     adc_deger= ADC_Oku();

    switch(cikis_state){
    case 0 :
       if (adc_deger > HYST_HIGH){
           cikis_state=1;
           output_high(PIN_A5);
       }
       break; /* optional */   
    case 1  :
       if(adc_deger < HYST_LOW){
           cikis_state=0;
           output_low(PIN_A5);
       }
       break; /* optional */
    default : /* Optional */
       break
    }
  ......................
}
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

HeCToR

#7
@mufitsozen Hocam Teşekkürler şimdi daha anlaşılır oldu @Kabil ATICI Hocam teşekkürler

mesaj birleştirme:: 22 Mart 2015, 16:03:25

@mufitsozen Hocam Sorun Çözüldü Birebir Bahsettiğiniz gibi çırpınıp duruyorum saatlerdir  :)
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Gerekir