Sensör devresi

1747512720866.png

1 Hz e kadar problemsiz çalışır.

1747512797378.png

5 volt giriş palsi yeterlidir. Ancak senin sensordan daha yüksek gelmesinin de mahzuru yoktur.
 
Merhaba.

Şuan mevcut bir projemde tam da bu modül ile ilgileniyorum. Ancak tek fark, ben NJK 5001 Pozitif çıkışlı olan serisini kullanıyorum.

Stm32f kartımda, sadece algoritma (timer ve mantıksal operatörleri) kullanarak istediğim şeyi yapıyorum zaten, ancak ben bu fonksiyonu yazılımdan çıkartmak istiyorum, sadece donanımla yapmak istiyorum. Main fonksiyonumun sadeliği, anlaşılırlığı için buna ihtiyacım var.

Aradığımız şeyin adı retriggerable monostable multivibrator. Sensörden gelen sinyalin hem yükselen, hem de düşen kenarında yeni bir önceden belirlenmiş sürede çıkış sağlıyor. CD4538 bu iş için imal edilmiş desek yeri.
 
Son düzenleme:
Probleme farklı farklı çözüm yöntemlerinin önerilmesi hoş olmuş.

@Dede beyin önerdiği donanımsal yöntem ile yukarıdaki mesajımda CCS kod örneği ile paylaştığım yöntem biri hardware diğeri software olarak aynı işi (sadece yükselen kenar takibinde) yapıyor.

Çok özel bir nedeni yoksa, benim tercihim zaten bir mcu kullanmak sorundaysam, bu işlemi yazılım tarafında halletmek olurdu.
Mcu lar çok fazla yetenekliler. Özellikle problem çözümü için kullanılabilecek mcunun hardware çevre birimi varsa bunları kullanmak işleri hem kolaylaştırıyor hemde hızlandırıyor.

@subliminal_kuvvet yazılım tarafında zaten problemi çözmüşsünüz, kodu çıkartmak yerine, kesme kullanımı, alt program, unit ( alprg.c, altprg.h vb.) kullanımı, rtos kullanmak gibi yöntemler ile kod okunurluğu ve anlaşılırlığı çok rahat sağlanabilir. Herşeyi main içerisine sıkıştırmak zorunda değilsiniz. :) Onbinlerce satır içeren iyi organize edilmiş bir projede bir iki tıklama ile istenen yere gitmek, yazılım mantığını takip etmek çok zor değil.

Uygulama ihtiyaçlarını tam bilmiyoruz ama, bunun şöyle ilave artıları olurdu:

+ Dönen cismin dönme hızıda ölçülebilir.
+ Dönen cismin hızı değişken ise, durma algılamada kullanılacak zaman değeri dinamik olarak hıza bağlı değiştirilebilir.

Tabi tek doğru yok.
 
Son düzenleme:
sırf bu iş için üretilmiş bir entegre buldum. yükselen kenar algılaması yapıyor. pals yüksek veya düşükte kalırsa 0v, değilse frekansa göre analog dc çıkış üretiyor. sipariş verdim gelince deneyeceğim.

LM2917-8
custom_diagram_1_LM2917-N.gif
 
Son düzenleme:
Eğer mikroişlemcinin güçü yetiyorsa ve diğer kısıtlamalar/şartlar yoksa bu tür işlerin yazılımla yapılması daha mantıklı olur.
Ek kod için 5 saat fazladan harcanır, donanımla yapılınca entegre ve etrafındakı devre elemanların maliyeti (fiyat, tedarik, pcb ölçüsü, dizgi ve s.) üretilen her ürünün fiyatına eklenecek.
 
Eğer mikroişlemcinin güçü yetiyorsa ve diğer kısıtlamalar/şartlar yoksa bu tür işlerin yazılımla yapılması daha mantıklı olur.
Ek kod için 5 saat fazladan harcanır, donanımla yapılınca entegre ve etrafındakı devre elemanların maliyeti (fiyat, tedarik, pcb ölçüsü, dizgi ve s.) üretilen her ürünün fiyatına eklenecek.
çok haklısın, baştan beri niyetim oydu ama yazılımdan çok anlamıyorum chatgpt yardımıyla da bi yere kadar ilerleyebildim. projede ufak bir değişiklik oldu. artık sensörden gelen pals hızına göre pwm duty oranını da değiştirmem gerekiyor.

aşağıda bir örnek var, mantık hataları olabilir. simülasyonda çalışıyor ama henüz kurup denemedim. anlıyorsan veya anlayan biri bakarsa sevinirim.
şöyle;
PIC12F683
  • 100 Hz → PWM duty %100
  • 50 Hz → PWM duty %50
  • 0 Hz → PWM duty 0


Kod:
@ __config _INTOSCIO & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF

DEFINE OSC 4

OSCCON = %01100001
CMCON0 = 7
ANSEL = 0
WPU = 0
GPIO = 0

TRISIO = %00001000      ' GP3 giriş, diğer çıkış
CCP1CON = %00001100     ' PWM modu
PR2 = 249               ' 1 kHz PWM
T2CON = %00000101       ' Timer2 on, prescaler 1:4

' Değişkenler
oldState VAR BIT
newState VAR BIT
kenarSayisi VAR BYTE
dutyDegeri VAR WORD
sayac VAR WORD

PAUSE 100

BASLA:

    kenarSayisi = 0
    oldState = GPIO.3

    FOR sayac = 1 TO 500     ' 500 ms ölçüm
        newState = GPIO.3
        IF (newState = 1) AND (oldState = 0) THEN
            kenarSayisi = kenarSayisi + 1
        ENDIF
        oldState = newState
        PAUSE 1
    NEXT

    IF kenarSayisi > 50 THEN
        kenarSayisi = 50
    ENDIF

    dutyDegeri = kenarSayisi * 1023 / 50

    CCPR1L = dutyDegeri >> 2
    CCP1CON.5 = dutyDegeri.1
    CCP1CON.4 = dutyDegeri.0

    GOTO BASLA
 
Son düzenleme:
basic ve pic kullanmıyorum malesef. C'de interrupt'la 2 opsyon var - polling ve external interrupt (işlemci external interrupt on toggle destekliyorsa).

1ci opsyon

Kod:
#define COUNTER_THRESHOLD = 1000  // bekleme timer'i
static unsigned int counter = 0;

// Pin toggle interrupt'ı
void interrupt pin_change(){
    if(counter == COUNTER_THRESHOLD +1){
        // sensor dönmeye başladı - gereken işlemleri yap
    }

    counter = 0;
}

// Timer interrupt'ı
void interrupt timer(){
    if( counter == COUNTER_THRESHOLD){
          // sensor durdu  - gereken işlemleri yap
        counter++;
    }
    else{
        if (counter != COUNTER_THRESHOLD + 1){
            counter++;
        }
    }
}

2ci opsyon - pin toggle interrupt desteklenmiyor durumu için

Kod:
#define COUNTER_THRESHOLD = 1000  // bekleme timer'i
static unsigned int counter = 0;
static unsigned char input_pin = 0;

void interrupt timer(){
    unsinged char tint = GPIO.3;        // giriş pin'i oku

    if (tint != input_pin){
        if(counter == COUNTER_THRESHOLD + 1){
            // sensör dönmeye başladı - gereken işlemleri yap
        }
        input_pin = tint;
        counter = 0;
    }
    else{
        if(counter == COUNTER_THRESHOLD){
          // sensor durdu - gereken işlemleri yap
            counter++;
        }
        else{
            if(counter != COUNTER_THRESHOLD +1){
                counter++;
            }
        }
    }
}

Not: port external interrupt ve timer interrupt'ların setupları eksik. Kod genel C için yazılmış PİC'e göre ayarlanmalı.

güncelleme: kod'da hata buldum - her timer tiki için sensor durdu oluşuyordu. düzeltildi.
 
Son düzenleme:
@subliminal_kuvvet yazılım tarafında zaten problemi çözmüşsünüz, kodu çıkartmak yerine, kesme kullanımı, alt program, unit ( alprg.c, altprg.h vb.) kullanımı, rtos kullanmak gibi yöntemler ile kod okunurluğu ve anlaşılırlığı çok rahat sağlanabilir. Herşeyi main içerisine sıkıştırmak zorunda değilsiniz. :) Onbinlerce satır içeren iyi organize edilmiş bir projede bir iki tıklama ile istenen yere gitmek, yazılım mantığını takip etmek çok zor değil.

@frmman hocam, bilgilendirmeniz için teşekkür ederim.

Bahsettiğim, retriggerable monostable multivibratör entegresi olan ve geniş voltaj aralığında kullanılabilecek, bu proje için en ideal entegre olan CD4538'i kullanmaktan vazgeçmek üzereyim. Ayrı bir donanım kullanmak, bu donanımı regüle etmek, kalibrasyonu sağlamak, uygun donanım sürücüsünü tasarlamak gibi zorlayıcı etkenler en büyük sebep.

Stm32f denetleyici kartımda zaten bu işlemi istediğim kadar esneterek yapabiliyorum. Tabiki biliyorum, kesme, altp program, rtos gibi fonksiyonlari kullanabileceğimi, fakat donanım açısından modüler bir yapı istemiştim, ancak dediğim gibi zorlayıcı etkenler var.

Geliştirdiğim yazılımı optimizasyonla daraltıp gerekirse .lib oluşturacağım. Yükselen ve düşen kenarı algılayan özel kesme fonksiyonunu baştan yazıp derleyeceğim.

Bu arada arkadaşlar, çoğu gömülü denetleyicide harici kesme kenar seçme fonksiyonu mevcut, örneğin benim kullandığım stm32f103c8t6 blue pill kartımda aynı pin üzerinde EXTI kesmesi (hem yükselen kenarda, hem düşen kenarda) oluşturulabiliyor.

Ayrıca Systick fonksiyonunu programa dahil ederek timere gerek kalmadan, retriggerable multivibratör özelliğine benzer bir yapı oluşturulabiliyor. Örneğin ben bu fonksiyonu kullanacağım.
 
Son düzenleme:

Çevrimiçi personel

Forum istatistikleri

Konular
7,778
Mesajlar
129,156
Üyeler
3,132
Son üye
furkanuzal

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