Algoritma Mantığı ADC

Başlatan oguztkn, 19 Ağustos 2018, 21:34:06

oguztkn

Merhaba Arkadaşlar,

Resimdeki gibi orta noktada duran bir pedalım var. 3 adette referans noktam var. Pedalı ileri doğru hareketlendirdiğim de 1. ref noktasına geldiğinde bir çıkış verdiriyorum (PORTB.1=1 gibi). Buraya kadar problemim yok. Pedalımın geri konumunda iki adet referans noktam var. Pedal geriye doğru hareket ederken ilk referans noktasına geldiğinde  PORTB.2=1 olacak diyelim. Devamında ikinci referans noktasına geldiğinde ise bu çıkış kapanacak. Sorunun kaynağı burada bu işlem pedal birden en sona basıldığında aynı işlemin 1 sn gecikmeli olmasını istiyorum. Bu iki farkı nasıl ayırt ettirebilirim pic'e ? . Umarım anlatabilmişimdir. (Pic:16f876a)

Şimdiden Teşekkürler...

furkan41

pedalın altında bir adet mekanik sonlandırma anahtarı koy en sona kadar bastığında sonlandırma anahtarından aldığın bigliye göre işini yaparsın adc okuma işleri bukadar hassas olmuyor malasef sıkıntılar yaşatabilir.

F®T

adc değeri gerideki ilk noktayı gördüğü anda bir zamanlayıcı çalıştırırsın ikinci noktanın çekmesi için o zmaan sayıcınında şartını koyarsın adc 2. gerideki noktaya gelse bile zaman dolmadan 2. nokta çekmez.zaten belli bir sürede gelirse o zmaan dolmuş olur ve 2. nokta çeker.ani gelmelerdede zaman sonunda çeker.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Sürekli olarak bir önceki okunan ADC değerini hafıza da tutman gerekiyor. Adc okuma işinide belirli zaman aralığında yapman ve hızlı gidişlerde bu zaman raalığından daha az sürede değişen ADC değerini dikkate almaman gerekir.
Bir önceki ile son okunan arasında 512 den büyük bir okuma farkı meydana gelirse bu birden sona gidildiği anlamına gelir.
Açıklarken kolay gibi geliyor ama olası sorunlar program üzerinde çalışırken çözülebilir diye düşünüyorum.
Tek sorun hızlı kayma anında ADC okuma devrede olduğu için ara değerler okunacaktır. Ancak her bir okumayı örneğin 100 ms aralık ile yaparsan iki okuma arasında net farklar yakalayabilirsin.

Ete

oguztkn

#4
Hocam şöyle bir kod yazdım bu hali ile çalışıyor diyebilirim. Pedal basılmaya başladı ilk referansa gelince led yanıyor tamam ikinci referansı geçince sönüyor ama ama burada bekler isem yanıp sönüyor taa ki pedal ortaya tekrar gelene kadar. Hızlı basmalarda da düzgün çalışıyor gibi duruyor. (Reel'de deniyorum). Kodları ekliyorum sizce mantık hatası var mı bir yerde bakabilir misiniz ? 


Not: Sureyi bir pot ile belirleyeceğim şimdilik programda adc okuma bölümünde süreyi okuyorum ama işlem yaptırmıyorum. Süreyi el ile 2sn olarak girdim. Programı düzene oturturabilirsem hesabını ekleyeceğim programa,0-2sn aralığında olacak.) Devrede üst alt1 ve alt2 referanslarınıda pot ile belirliyorum onun sınırlamaları ise basla etiketinden sonra bulunmakta.

'*******************************************************************************
yukref VAR word:yuktoplam var word:yukort var word
orta VAR word:ortatoplam var word:ortaorta var word
altref1 VAR word:altref1top var word:altref1ort var word
altref2 VAR word:altref2top var word:altref2ort var word
sure VAR word:suretop var word:sureort var word:bekleme var bit
x VAR byte:y VAR word:sureHesap VAR word:sayac var byte
;*******************************************************************************
DEFINE ADC_BITS 10     
DEFINE ADC_CLOCK 3     
DEFINE ADC_SAMPLEUS 50 
;*******************************************************************************
ADCON1=%10000010:TRISA=%00101111
TRISB=%00000000:TRISC=%00000000
CMCON=$07:PORTB=0:x=0:y=0:sayac=0
PORTC=0:Pause 500
;*******************************************************************************
BASLA: 
      x=0
      gosub oku
      if yukort<460     then yukort=460
      if altref1ort>390 then altref1ort=390
      if altref1ort<240 then altref1ort=240
      if altref2ort>235 then altref2ort=235
      if altref2ort<189 then altref2ort=189
;*******************************************************************************
      while ((ortaorta>yukort))     'Yukarı Ref AYARI
           PORTB.2=1:gosub oku:wend
;*******************************************************************************
       while ((ortaorta<altref1ort)and(ortaorta<yukort))
       sayac=sayac+1:pause 50:gosub oku
            if((ortaorta<altref2ort)And(sayac<20)and(ortaorta<yukort))then
             sayac=0:pause 1000:PORTB.3=1:pause 100
             gosub oku:endif;wend
            if((ortaorta<altref1ort)AND(ortaorta>altref2ort)AND(sayac>20)and(ortaorta<yukort))then
                sayac=0:PORTB.3=1
                gosub oku
                endif;wend
            if ((orta<altref2ort)) then
              sayac=0:PORTB.2=0:PORTB.3=0:goto basla:endif   
      wend         
      if ((ortaorta<yukort)AND(ortaorta>altref1ort)AND(ortaorta>altref2ort))then                 
      PORTB.2=0:PORTB.3=0:x=0:endif
     
goto basla
;*******************************************************************************
oku:
      yuktoplam=0:ortatoplam=0
      altref1top=0:altref2top=0
      for x=1 to 10
      ADCIN 3,yukref:ADCIN 4,orta
      ADCIN 2,altref1:ADCIN 0,altref2
      ADCIN 1,sure
yuktoplam=yuktoplam+yukref:ortatoplam=ortatoplam+orta
altref1top=altref1top+altref1:altref2top=altref2top+altref2
      next x
yukort=yuktoplam/10:ortaorta=ortatoplam/10
altref1ort=altref1top/10:altref2ort=altref2top/10
return
;*******************************************************************************
                                    end
;*******************************************************************************

ete

Genel bir mantık hatası yok.  While döngüsü içinde yaklaşık 1100 ms lik gecikme bana fazla geliyor. Umarım bir nedenin vardır bu uzun süreyi eklemek için. Okumaya aralık olsun diye koymuş ise şöyle düşün. Okuma işlemi neredeyse mikrosn ler cinsinden süre alıyor buna saniye bazında gecikme eklemek çok gerekli değil bence. Program akışını yavaşlatır diye ikaz ediyorum.

While - wend döngülerine de dikkat etmek gerek. Şart yerine geldiği sürece program while wend arasında bloke olur. Sorun değilse bu şekil devam edebilirsin. ama aynı zamanda başka kontrollerde gerekli ise while - wend kullanmaktan kaçınmalısın.
Ne yapabilirim ki diye düşünürsen bütün kontrollerin yapıldığı tek bir döngü yaratıp istediğin şeyleri döngü içinde kontrol edebilirsin. Böylece program akar ancak istenen şartlar yerine gelmiş ise while-wend ile yakalamayı hedeflediğin konumları yine yakalarsın.
Her ne kadar dışarıdan ahkam kesemiş olsam da bu sistemi 3 boyutlu olarak bütün detayları ile görmek ve anlamak gerekir. Bu hali ile çok yüzeysel yaklaşabiliyorum. Benim açımdan pek çok bilinmeyeni var.

Ete

oguztkn

#6
Hocam,  kullandığım sistem ve isis'i ekliyorum.

"Genel bir mantık hatası yok.  While döngüsü içinde yaklaşık 1100 ms lik gecikme bana fazla geliyor." = 100ms 'si gereksiz yere yazmışım ama 1000sn program akışı sağlıklı çalışır hale geldiğinde orada pause 1000 yerine pause sure yazacak ve bu ayar 0-2sn arasında değiştirilebilecek. Şimdilik o değeri el ile girdim.

"While - wend döngülerine de dikkat etmek gerek. Şart yerine geldiği sürece program while wend arasında bloke olur. Sorun değilse bu şekil devam edebilirsin. ama aynı zamanda başka kontrollerde gerekli ise while - wend kullanmaktan kaçınmalısın." = Burası içinde pedal geriye doğru hareketlendiği anda program sadece oradaki iki ref noktası ile işlem yapıyor yani başka kontroller yapılmıyor.

Aklıma alt ilk referans noktasına geldiğinde timer1 i başlatayım sonra ikinci referansa geldiğinde kapatayım ve süreye bakayım gibi birşey geldi aklıma ama şuankinden daha mantıklı olur mu bilemedim.

Programın tamamı adc ölçümlerinden oluştuğu için mutlaka sapmalar olacak %100 kararlı çalışmayacaktır bunun farkındayım ama kabul edilebilir aralıkta sağlıklı çalışması için uğraşıyorum. Böyle değilde şu şekilde programın akışını yürüt diyebileceğiniz bir şekil var ise önerilere açığım çünkü program bu akış şekliyle kalmak zorunda değil

5pot_ADC_Time.txt dosyasının uzantısını .DSN yaparak isiste açabilirsiniz zip ile fazladan işlem olmaması için bu şekilde ekledim.

Teşekkürler...

Powered by EzPortal