Sensör devresi

mehmetaliözdemir

Aktif Üye
Katılım
17 Nisan 2021
Mesajlar
959
Resimdeki gibi bir çark ve karşısında endüktif sensör var. amacım çarkın hareketni algılayıp lojik çıkış almak. sensör kendi başına boşlukta pozitif çıkış veriyor dolu yerde ise 0v. harekt algılamasını sensörün dolu olduğu yani pozitif olduğu zaman alsam çark durduğu zaman tam sensörün önünde durursa sürekli hareket ediyormuş gibi olur. keza boşluktan alsam da aynısı olur. bana öyle bir devre lazım ki sürekli pals geldiği zaman lojik1 olsun, sinyal pozitif veya negatif yönde birkaç saniye sabit kalırsa lojik 0 olsun. bir önerisi olan var mı?

Untitled-3.png
 
opamp ile türev alıcı bir devre yapıp çıkışını doğrultabilirsin.

1747317281513.png
 
Stm32lerde timer ile sadece edge algılayarak veri alma var. Giriş filtresini 8'ten yüksek yapınca stabil çalışıyor.
 
Stm32lerde timer ile sadece edge algılayarak veri alma var. Giriş filtresini 8'ten yüksek yapınca stabil çalışıyor.
stm kullanamam. hali hazırda pwm ürettiğim pic12683'ün boştaki dijital pinine bu işi yaptırmak istedim ama beceremedim. zaten hareket algılandığında pwm çalışacaktı.
 
Şöyle bir yaklaşım ile bir algoritma kurulabilir.

  1. Hareketin durduğuna karar vereceğiniz max süre belirlenir. Örneğin 3000ms boyunca yükselen veya düşen kenar bu süre kadar yoksa durdu kabul edilir.
  2. Bir adet timer kurulur. Kesme peryodu 10ms gibi bir değere ayarlanır. (Diğer işlemler için mcu yu çok fazla meşgul etmesin)
  3. Yükselen ve düşen kenarlarda geri sayma için kullanılan bir sayaca 300 değeri atanır (Timer 10ms stepler ile sayacak) Her kenar algılamada bu değer yeniden yüklenecek
  4. Timer kesmesinde sayac değeri sıfırdan büyükse bir azaltır.
  5. Timer kesmesi içinde sayaç değeri sıfıra ulaştığında hareketin durduğu bir değişkene yazılır. (Veya sayac değişkeni == 0 şartı kullanılabilir)
 
Son düzenleme:
Dönen cisim duruyormu sorusunun cevabını sadece yükselen kenar algılama ile tespit edemezsiniz. İki pals arasındaki süreyi bir şekilde işin içine katmak gerekiyor.
 
Dönen cisim duruyormu sorusunun cevabını sadece yükselen kenar algılama ile tespit edemezsiniz. İki pals arasındaki süreyi bir şekilde işin içine katmak gerekiyor.
iki pals asasındaki süre değişken ama hassas bir zamanlama da gerekmiyor. ilk pozitif palsi gördüğü anda lojik 1 olsa bir sonraki pozitif palsi görene kadar 3 saniye beklese, göremezse lojik 0 olsa ve pozitif palsda 3 saniye bekleyip negatif görmezse lojik 0 olsa yeter.
 
Son düzenleme:
T1CKI ile harici kesme oluşturmanız mümkün olabilir. Mesela TMR1'e 65534 sayısını yüklersiniz; iki pals sonra timer1 kesmesi oluşur. Böylece cihaz dönüyor demektir.
 
chatgpt yardımıyla böyle bir şey yaptım. bu kodla GP4 girişi, yani benim sensör girişim oluyor. başlangıçta pwm üretilmiyor. GP4 high olunca pwm başlıyor. low olursa 3 saniye bekleyip pwm i durduruyor. yine 3 saniye boyunca high kalırsa pwm duruyor. buraya kadar tamam ama pwm durunca tekrar başlamıyor. analog girişte (duty değişikliği için) bir değişiklik olursa tekrar başlıyor gibi ama kararlı değil.


Kod:
@ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _CP_OFF

DEFINE OSC 4
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 1
DEFINE ADC_SAMPLEUS 30

OSCCON = %01100001
CMCON0 = 7

' ===== PWM Başlangıç Ayarları =====
PR2 = 249
T2CON = %00000101
CCP1CON = 0
CCPR1L = 0

TRISIO = %00010001       ' GP0: analog giriş, GP4: kontrol girişi
ANSEL  = %00000001       ' GP0 analog, diğerleri dijital
WPU    = 0
GPIO   = 0

' Değişkenler
HAM      VAR WORD
DUTY     VAR WORD
X        VAR WORD
PIN_NOW  VAR BIT
PIN_OLD  VAR BIT
ZAMAN    VAR WORD
PWM_ON   VAR BIT

PAUSE 300

PIN_OLD = GPIO.4
PWM_ON = 0
ZAMAN = 0

ANA:
    ' GP4 değişimi kontrolü (her durumda yapılır)
    PIN_NOW = GPIO.4
    IF PIN_NOW != PIN_OLD THEN
        PIN_OLD = PIN_NOW
        ZAMAN = 0
        
        ' PWM kapalıysa, aç
        IF PWM_ON = 0 THEN
            PWM_ON = 1
            CCP1CON = %00001100
        ENDIF
    ENDIF

    ' PWM açıkken zaman say ve durdur
    IF PWM_ON = 1 THEN
        ZAMAN = ZAMAN + 1
        IF ZAMAN >= 100 THEN
            PWM_ON = 0
            CCP1CON = 0
            CCPR1L = 0
        ELSE
            ' PWM aktifken ADC çalıştır
            ADCIN 0, HAM
            DUTY = (HAM + 1) */ 250
            IF DUTY != X THEN
                X = DUTY
                CCP1CON.4 = X.0
                CCP1CON.5 = X.1
                CCPR1L = X >> 2
            ENDIF
        ENDIF
    ENDIF

    PAUSE 20
GOTO ANA
END
 
Hem yükselen hemde inen sinyalleri kullanırsanız çözünürlüğü 2 kat artar
Bu tür devreler için

edge detection OR detector circuit
yazıp aratın.

Ayrıca, "prosesör" kullanmak zorunda değilsensiz, durup durmadığını,
daha doğrusu ne kadar yavaşlayınca "uyarı" istediğiniz devre için

missing pulse detection OR detector circuit
yazıp aratın.

Çok fazla seçenek göreceksiniz, bunlar komponent sayınızı azaltmaya ve çalışma şekli ile çok fazla fikir verecektir.
 
Hali hazırda zaten mcu kullandığınız için dönme algılama işlemini mcuya yaptırmak mantıklı ve aslında çok basit.

Geliştirme ortamı olarak Pic Basic kullandığınız için kod yardımında bulunamıyorum.

Problem çözümünün bir parçası olan "Timer Kesmesi" işleminin basicde nasıl yapıldığına bakmakla başlayabilirsiniz.
 
Yukarıdaki mesajımda anlatmak istediğim yapı. C (CCS) ile oluşturulmuş örnek. Belki size yol göstermede yardımcı olur.

Zaman ölçümü için Timer2 10ms lik kesme üretecek şekilde kullanıldı.

C:
#include <12F683.h>
#device ADC=10
#fuses NOMCLR         //Master Clear pin used for I/O
#use delay(internal=4MHz)

#use FIXED_IO( A_outputs=PIN_A0, PIN_A2 )

#define LED        PIN_A0
#define SENSOR     PIN_A1
#define PWM_OUT    PIN_A2



//---------------------------------

#include <main.h>

#define TIMEOUT_SET 300  // 300 x 10ms kesme = 3000ms sonra dönme durdu
int16 my_timeout = 0;
int1 old_state = false;   // kenar algılama
int1 donme_durum = false; // true: dönüyor false: durdu

#INT_TIMER2
void  TIMER2_isr(void)
{
   // bu kısımdaki kodlar her 10ms de bir çalışır
   if (my_timeout > 0)
   {
    my_timeout--;
   }
   else
   {
    donme_durum = false; // süre doldu. dönme durdu
   }
}

void main()
{
   //port_a_pullups(0x02);    // SENSOR (PIN_A2) girişi pullup yapılmak istenirse commenti kaldırın
   setup_timer_2(T2_DIV_BY_4,250,10);      //1,0 ms overflow, 10,0 ms interrupt

   setup_ccp1(CCP_PWM); //
   set_pwm1_duty((int16)200); // 10 bit pwm 0..1023 set aralığı verilebilir

   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {
      if (input(SENSOR) && !old_state) // yükselen kenar
      {
       old_state = true;
       my_timeout = TIMEOUT_SET; // geri sayma işlemini yeniden set et
       donme_durum = true; // donme devam ediyor
      }
    
      if (!input(SENSOR) && old_state) // düşen kenar
      {
       old_state = false;
    
       //donme_durum = true;        // düşen kenardada dönme kontol devrede olsun
       // my_timeout = TIMEOUT_SET; // istenirse bu iki satır aktif edilmeli
                                  
      }
    
    
      if (donme_durum)
      {
        // dönme var yapılacak işlemler
        output_high(LED);
        set_pwm1_duty((int16)200); // ~%20 duty pwm sinyali
      }
      else
      {
       // dönme durdu yapılacak işlemler
       output_low(LED);
       set_pwm1_duty((int1)0); // pwmi kapat
      }

 
 
   delay_ms(50); // kontrol peryodu
 
   }

}
 
555 çip tam bu işe göre. :ok1:
EK:
Şimdi aklıma gelenide ekleyeyyim.
İki kapasitör 2 diyot bir transistör ve bir direnç ile aynı sonuca ulaşabilirsin.


Kapasitörden gelen pulsler ile DC üretip transistörü sürersin.
Transistörün çıkışına da bir Logic ekleyip istediğini elde edersin.
 
Son düzenleme:
555 çip tam bu işe göre. :ok1:
EK:
Şimdi aklıma gelenide ekleyeyyim.
İki kapasitör 2 diyot bir transistör ve bir direnç ile aynı sonuca ulaşabilirsin.


Kapasitörden gelen pulsler ile DC üretip transistörü sürersin.
Transistörün çıkışına da bir Logic ekleyip istediğini elde edersin.

bahsettiğiniz transistörlü devre bunun gibi mi?
 

Ekler

  • m30LWV.gif
    m30LWV.gif
    5.6 KB · Görüntüleme: 14
Tam olarak öyle değil.
ama dene bakalım belkiş bu da iş görür.
proteusta simule etmen gerek sanırım.
10 hz civarında simüle ettim olmadı. vo daki gerilimde çok net bir fark gözlemleyenedim. hatta devamına Schmitt Trigger da ekledim ama başaramadım.
bahsettiğiz transistörlü devre kabaca nasıl, veya 555 li devreye spesifik bir örnek gösterebilir misiniz?
 

Çevrimiçi personel

Forum istatistikleri

Konular
7,755
Mesajlar
128,968
Üyeler
3,127
Son üye
emreeee

Son kaynaklar

Son profil mesajları

Mutluluğun resmi illa güzel çizilmiş tablo olmak zorunda değil.Bazen basit bir çizgi,doğru bir renk,yada küçük bir detay
Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
az bilgili çok meraklı
Back
Top