yaklaşım sensoru çevirme

Başlatan onurinci, 28 Temmuz 2021, 02:32:16

onurinci

hocam hurdalardan bir sensor buldum, 0..30 CM'ye 0...5 Volt çıkarıyor ,ışığı görünmüyor sanırım IR. buna bir ne kadar yaklaşıkdığı bilgisi için kendinden öten 650 Hz civarı bir DC buzzer bağladım,yaklaştıkça ses sıklaşacağı halde uzaklaşınca sıklaşıyor ADCON registerindem 7'nci biti 1 idi bunu 0 yaptım değeri terslesin diye farklı yerlere ötelediği için buzzer'de sustu. kod ve simulasyon ektedir hocam..

elektro77

Bu sensörün linkini atabilirmisiniz. Bende almak isterim.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Bir konuya açıklık getirelim. ADCON0 registeri 7 nolu bit ADC işlem sonucunun nasıl verileceğini ayarlıyor. Biliyorsunuz ADC işlemi 10 bit buna karşılık kullandığımız değişken ise 16 bit.
Şayet ADCON0.7=0 olur ise işlem sonucu sağa yaslı geliyor. 16 Bitliik değişken içinde yer alış şekli şöyle oluyor. %000000xxxxxxxxxx sonuçta ilk 10 bit sonucu göstereceği için maksimum değer 1023 ve min değer de 0 oluyor.
ADCON0.7=1 olur ise bu sefer 10 bitlik ADC değeri sola yaslı geliyor. 16 bit içindeki yerleşimi şöyle, %xxxxxxxxxx000000  bu durumda okunan ADC karşılığı %1111111111000000 değerine karşılık gelen desimal olarak 65472 ile sıfır arasında değişmektedir.
Hemen belirteyim sola yaslı kullanım şeklinin kullanıcıya hiç bir faydası olacağını sanmıyorum.
Okunan değer terslenmiş falan da değil. Yanlızca 10 bitlik değerin 16 bit içinde sola yaslanması nedeni ile daha yüksek değerli gözükmesinden kaynaklanıyor. Bu nedenle tavsiye olark söylüyorum sola yaslı kullanmayın daima sağa yaslı (ADCON0.7=0) kullanın.
Gelelim programa ve sonuç meselesine, Hemen belirteyim sensör çıkışı HIGH - LOW şeklinde çalışınca bunu ADC okuyarak tespit etmek de yanlış olur diye düşünürüm. Zira çıkış LOW iken ADC den sıfır okuyacak, çıkış HIGH olduğunda ise maksimum ADC değerini okuyacaksın.
Verdiğin programda ADCON0,7=1 olduğundan sensör çıkışı HIGH olduğunda ADC değerin 65472 olacaktır. Buna birde 1 ekleyip 10 ile çarparak 256 ya bölersen (*/10 işlemi) 2.557 gibi bir sonuç bulursun. CNT değerimiz 2.557 iken program ne yapacak ona bakalım.
Buzzer 100 ms süre ile çalacak. BU süre sabit okunan adc değerine göre değişmiyor.
SOnra timing kısmında  2557 adet 10 ms lik gecikme uygulanacak. Bu 2557*10=25570 ms yani yaklaşık 25-26 saniyelik bir süre bekleme yapılacak. Ancak döngü sayısının fazla olması nedeni ile bu gecikme yaklaşık 30-35 saniye şeklinde algılanacaktır.
Muhtemelen bu işlem sonucunda buzzer sustu algısı sende oluşmuş oluyor. Zira 30-35 sn buzzer sesi beklemek zor.

Şimdi aynı hesabı ADCON0.7=0 iken yapalım. Okunan adc değeri 1023 olacak 1 eklenince 1024 bulunacaktır.
CNT=1024 * 10/256= 40 değeri bulunacaktır. Bu değer timing kısmında 40x10=400  ms lik bir gecikme yaratacak ve bu gecikme döngü nedeni ile yaklaşık 500 ms olacaktır. BU se her yarım saniyede bir buzzerin ötmesi şeklinde algılanacaktır.

BU açıklamaya göre sonucu sen değerlendir artık.
Ben olsam sensör çıkışındaki puls süresini ölçerdim. O süre kadar da buzzeri çaldırırdım.

@elektro77,
Bütün PIR sensörleri, Radar sensörleri benzer mantık ile çalışıyor. İllaki sensör adı aramana gerek yok.  Yanlızca Ultrasonik sensörler mesafeye bağlı puls süresi uzunluğunu değiştirmektedir. BU sensörün mesafesi epeyce kısa bu durumda bildiğin bir Infrared sensör olsa gerek. Başka bir şey değildir.

Ete

onurinci

sensorün adı falan yok,bir otel musluğu hurdasından çıkarılmış, birde fiber optik boru içine yerleştirilmiş.RGB led devresi mevcut ,başta bu led ısı farkından suyu boyuyor diye düşündüm, buraları sıvı alıp çürümüş,onardıktan sonra anladımki musluğa ne kadar yanaşırsan okadar su akıyor, 0.....5 arası bir DC voltaj çıkarıyor. 0 1 logic yada Pulse değil.bu çıkışı benim devreye uyarladığımda kusursuz çalışıyor fakat istediğimin tam tersi. ben bunu bir LM358 opAmp ile 5....0V arası terslediğimde  herşey yerine oturuyor.fakat ayrıca negatif 5 Volt gerekiyor.buda sıkıntı o yüzden hocam size danıştım,benim kod'da zamanlamalara dokunmadan,sadece simulasyondaki gibi pot gnd'ye yaklaşırken ses sıklığının yavaşlaması,pot voltajı +5 volta yaklaşırken sesin sıklığının artması gerekiyor.kısaca hocam sadece ADC in pinine gelen voltaj tam tersi çalışsın istiyorum,benim kodda buna müdahele edebilirseniz.bende nasıl olduğunu ,ne değişmiş onu görebilirim..

elektro77

#4
BASLA:
ADCIN 0,HAM
ham=ham+1
tone=((HAM*/1378)/100)+100 


Sound GPIO.1,[tone,1]


goto basla
Sound komutu ile denedinizmi?Yukarıdaki kod dizinini deneyip bir görün isterseniz. Ynalız bu kodlar 0-2 volt adc ye göre hesaplı. Daha önce bir işim için ete hocam yazmıştı bu kodları. 0-5 VOLT için 1378 değeri 550 olarak yazılmalı.
Bu kodlar okunan adc ye göre  100 ile 122 arasında tone oluşturur.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Onur,
İlla işin tersini yapmak istiyorsan ;
ADCON0.7=0 iken
     adcin 0, Val  :val=1023-Val         
     Cnt=((Val+1)*/10)     

ADCON0.7=1 iken
     adcin 0, Val  :val=65472-Val         
     Cnt=((Val+1)*/10) 
şeklinde kullan işin tersini elde etmiş olursun.

Ete

onurinci

hocam biliyorum havada sıcak,ama iki formülde çalışan kod'da değişiklik yaptığımda tek beep yapıp duruyorlar,neyse bir başka zaman uğraşırız teşekkürler..

ete

#7
Aşağıdaki kodu ilgili kısma yerleştir tekrar dene istersen.
Start: 
     adcin 0, Val  
     val=1023-val         
     Cnt=((Val+1)*/10)    ' Calculation  

     GPIO.1=1             ' Sound DC Buzzer 
  
     PAUSE 70            ' 0,1 sn. BEKLE
     GPIO.1=0             ' Silent DC Buzzer

     Gosub Timing         ' Timing Label Go
     Goto Start

Timing:
 For I=0 to Cnt           ' "0" then Cnt Count
     Pause 3            '  10 ms wait
 Next
 
 Return
Ben denedim çalışıyor.

Ayrıca aşağıdaki kodu da bir dene istersen. Daha basit ve sade.

#CONFIG
 __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF
#ENDCONFIG 
DEFINE OSC 4
DEFINE OSCCAL_1K 1

DEFINE ADC_BITS 10 ' Set number of bits in result
DEFINE ADC_CLOCK 3 	' Set clock source (3=rc)
DEFINE ADC_SAMPLEUS 50 	' Set sampling time in uS
' Set AN0 analog

TRISIO= %00000001 : GPIO= 0
CMCON= 7 : ANSEL= %00010001 : ADCON0= %10000001



Val  var WORD 56
Cnt var WORD  58
I    VAR WORD  


Start: 
     adcin 0, Val  
     val=1023-val         
     Cnt=((Val)*/60)+20    ' Calculation   

     GPIO.1=1             ' Sound DC Buzzer 
     pause 70
     
     GPIO.1=0             ' Silent DC Buzzer
     PAUSE cnt
     Goto Start

onurinci

hocam çok teşekkür ederim,

aslında mesajımı enter'ledikten sonra çalıştırdım,çokta güzel çalışıyor tam'da hayal ettiğim gibi olmuş,aralık kısa olduğu için site sistemimi yeni mesaj göndermeme engel oldu, bende düzenleyi açıp çalıştı mesajı yazdım göndere bastım ,ilginçtirki site mesajımı göndermemiş.

asıl ilginç olanı
ADCON0.7=0 iken
     adcin 0, Val  :val=1023-Val         
     Cnt=((Val+1)*/10)

ilk bunu denedim olmadı,zira kendi kodum reel devrede ters'de olsa çalışıyordu,yani bir sorun yoktu,sonra bu formüle   ADCON0.7=1 ekledim ve mükemmel çalıştı.tekrar teşekkür ederim sayenizde OpAmpı ve DC-DC konverteri söktüm attım. 

Powered by EzPortal