avatar_Hattuşa

sinyal kaymasını algılatmak

Başlatan Hattuşa, 24 Eylül 2019, 12:00:11

elektro77

#30

Alıntı yapılan: pro-TR - 30 Eylül 2019, 15:02:21ben bir pcb hazırladım istersen bunu kullan istersen kendin çizip bir tane oluşturabilirsin




bu da sprintlayout 60 çizimi


layout Viwerı yeni indirdim.pcb nin ölçüleri tam istediğim gibi olmuş hocam. Teşekkürler. Ellerinize sağlık
"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"

Hattuşa

Alıntı yapılan: elektro77 - 30 Eylül 2019, 21:15:10hocam siz proton kullana kullana herşeye en sondan başlamayı adet edinmişsiniz galiba. protondada öyle değilmi. ıf sorguları sonlarda return döngüleri başlarda oluyordu değilmi?
pcb yi yaptık ama ne devre simülasyonu ne de yazılım var ortada.
kusura bakmayın komiğime gitti.

hocam ben proton kullanmıyorum artık  ;D
STM32F serilerini keille kullanıyorum. şimdi bu devreyi STM ile yapalım deseydim kod karmaşası olacaktı, aslında simülasyon dosyası var bende de simülasyon dosyasını verseydim biraz karmaşık gelecekti, zira kod ile algılama yaptırmak isisde zor ben genelde adc girişine pot koyup voltaj okutarak kodu test ediyorum. haftasonu bende bu pcb yi basıp deneme yapacağım eğer müsade edersen bittiğinde de site üzerinden yayınlayacağım zira adımız nedeniyle talep çok oluyor isteyeni siteye yönlendireyim istiyorum

elektro77

estağfirullah hocam müsade sizin. ne demek.
"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"

Hattuşa

#33
test yazılımını kısmen yazdım

edit koda 1-2 ekleme yaptım

elektro77

Ellerinize ve aklınıza sağlık.10 numara 5 yıldız. ama gelde bunu şimdi bu bilgi seviyesi ile pbp ye çevir.
"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"

Hattuşa

#35
Alıntı yapılan: elektro77 - 01 Ekim 2019, 17:18:37Ellerinize ve aklınıza sağlık.10 numara 5 yıldız. ama gelde bunu şimdi bu bilgi seviyesi ile pbp ye çevir.

aslında hiç zor değil şöyle ki;



yukarıda ki skop görüntüsüne  dikkatli bak

If TMR1IF =1 Then
    Toggle sAy
        If sAy =1 Then
            TMR1L =pULsDuTY.LowByte
            TMR1H =pULsDuTY.HighByte
            pULs =0
        EndIf
        If sAy =0 Then
            TMR1L =PuLsCyCLe.LowByte
            TMR1H =PuLsCyCLe.HighByte
            pULs =1
                    DelayUS 40
                    tItReT =1
                        aDc =ADIn 1
                        While ADCON0.1 ==1 :Wend
                    tItReT =0 
                        tOtaLaDc =((tOtaLaDc *9) +aDc) /10
                            If tOtaLaDc >tUnE Then
                                sEsDeGeR =tOtaLaDc -tUnE
                                Else
                                sEsDeGeR =20
                            EndIf
                                
        EndIf
TMR1IF =0
EndIf
  burada kodu adım adım ele alırsak;

skobun sarı kanalı (ilk kanalda) 1 khz lik %90 oranında bir kare oluşturduk onu da
belirleyen "say" değeridir.

If sAy =1 Then
            TMR1L =pULsDuTY.LowByte
            TMR1H =pULsDuTY.HighByte
            pULs =0
        EndIf

say =1 iken
TMR1L =pULsDuTY.LowByte
          TMR1H =pULsDuTY.HighByte

tmr1 =100uS a ayarlandı ve ilgili pin sıfıra çekildi.

pULs =0

sonra kesmeden çıkıldı.
100 us sonra bir kesme oluştu bu sefer say değeri = 0 oldu toggle say yüzünden
If sAy =0 Then
            TMR1L =PuLsCyCLe.LowByte
            TMR1H =PuLsCyCLe.HighByte
            pULs =1
                    DelayUS 40
                    tItReT =1
                        aDc =ADIn 1
                        While ADCON0.1 ==1 :Wend
                    tItReT =0 
                        tOtaLaDc =((tOtaLaDc *9) +aDc) /10
                            If tOtaLaDc >tUnE Then
                                sEsDeGeR =tOtaLaDc -tUnE
                                Else
                                sEsDeGeR =20
                            EndIf
                                
        EndIf
ikinci kesmede say =0 olduğundan hemen timeri 900 uS a ayarladık. böylece 100+900 =1000uS yani 1mS yani 1 khz lik frekans oluşturuldu.
TMR1L =PuLsCyCLe.LowByte
            TMR1H =PuLsCyCLe.HighByte
ve peşinden puls pinini tekrar high yaptık.

verdiğim resimde mavi (2. skop kanalındaki) sinyal oluştu. beyaz kısım yani opampın doyumdan çıkıp sinyalin uygun noktasından adc okuma almak için beklettik
DelayUS 40

peşinden ben
tItReT =1
resimdeki kırmızı (3. skopta) kanal. bu kanalın amacı adc okumasının nereden yapıldığını görmek için titret adlı işlemci pinini aktif ettim. sinyalin hangi noktasından adc okutursam sağlıklı olur diye. bu pin gerçekte titreşim motorunun pini ama önce sağlıklı çalışır hale getirmek için test pini olarak kullandık, gerçek çalışan kodda bu kısım olmayacak

aDc =ADIn 1
                        While ADCON0.1 ==1 :Wend
adc okumasını yaptık ve
tItReT =0
  gözlemlediğimiz pini kapattık.

 tOtaLaDc =((tOtaLaDc *9) +aDc) /10
                            If tOtaLaDc >tUnE Then
                                sEsDeGeR =tOtaLaDc -tUnE
                                Else
                                sEsDeGeR =20
                            EndIf

bu kısımda okunan adc yi loww pass ile bir miktar stabil etmeye çalışıp algılama yaptırmak için tune adlı bir referans değerinden çıkartıp metalin mesafesine göre sesdeğerinin süresini belirledik. hepsi bu..
son  kısımda hata yapmışım doğrusu;
  If tOtaLaDc >tUnE Then
    if sEsDeGeR<20 then sEsDeGeR =21-(tOtaLaDc -tUnE)
                                Else
                                sEsDeGeR =20
                            EndIf
[/code]

olmalıydı. yani mesafe ile sesin şiddeti ters orantılı olduğu ve sesdeğerinin 1 in altına düşmemesi için bu şekilde olması lazım











elektro77

çok açıklayıcı bir anlatım olmuş teşekkür ederim. Bu arada simülasyondaki osiloskopta ölçüm değer cursors larını nasıl ortaya çıkardınız.
"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"

Hattuşa

Alıntı yapılan: elektro77 - 01 Ekim 2019, 21:36:37çok açıklayıcı bir anlatım olmuş teşekkür ederim. Bu arada simülasyondaki osiloskopta ölçüm değer cursors larını nasıl ortaya çıkardınız.


sorunuzu anlamadım.

şimdi test yazılımı bitti devre kurulduktan sonra test yazılımı yüklenecek ve gerçek uygulamada kod denenecek burdaki amacımız sönüm eğrisi oluşuyor mu? oluşuyorsa adc okuma noktası uygun yerden yapılıyormu? sesi ve titreşimi oluşturan frekansların süreleri uygun mu? bunlar test edilecektir. eğer bu yapılanlar tamamen doğru şekilde gerçekleşiyor mu? gerçekleşiyorsa test pini olarak kullandığımız yerler silinecek ve devre normal olarak çalıştırılmaya devam edilecektir.

'miniPulse test yazılımı

Device 12F1822
Config1 FOSC_INTOSC, WDTE_OFF, PWRTE_OFF, MCLRE_OFF, CP_OFF, CPD_OFF, BOREN_OFF, CLKOUTEN_OFF, IESO_OFF, FCMEN_OFF
Config2 WRT_OFF, PLLEN_On, STVREN_OFF, BORV_25, LVP_OFF
Xtal 32
OSCCON  =%11110010
OSCTUNE =%00011111
Declare All_Digital TRUE

TRISA =%00001010               'an1= adc için RA3 =buton için giriş diğerleri çıkış
PORTA =0                       'bütün pinler sıfırlandı

Symbol pULs   =PORTA.0
Symbol LeDyAk =PORTA.2
Symbol tItReT =PORTA.4
Symbol bUzZer =PORTA.5
Symbol tBuTon =PORTA.3

Input tBuTon
Output pULs      :pULs =1
Output LeDyAk    :LeDyAk =0
Output tItReT    :tItReT =0
Output bUzZer    :bUzZer =1

WPUA =0                        'bütün pulluplar kapatıldı
DACCON0 =0                     'dac çıkışı kapatıldı
CM1CON0 =0                     'comparatorler kapatıldı
OPTION_REG =%10000000

ANSELA =%00000010              'an1 kanalı analog ayarlandı
ADCON0 =%00000101              'adc kanalı aktif edildi
ADCON1 =%11000000              'fosc 4 seçildi

Symbol TMR0IF =INTCON.2
Symbol TMR0IE =INTCON.5
Symbol PEIE = INTCON.6 ' Peripheral Interrupt Enable
Symbol GIE = INTCON.7  ' Global Interrupt Enable
Symbol TMR1IE =PIE1.0
Symbol TMR1IF =PIR1.0

PEIE =1
TMR0IF =0
TMR0IE =0
TMR1IF =0
TMR1IE =1
GIE =0

T1CON =%00000001
DelayMS 100
On_Hardware_Interrupt GoTo kEsMe

Dim sAy As Bit
Dim aDc As Word
Dim tOtaLaDc As Word
Dim tUnE As Word
Dim tItRetbIt As Bit
Dim sEsSaYaC As Byte
Dim sEsDeGeR As Byte
Dim bUtOnSaYac As Byte
Dim X As Byte
Symbol pULsDuTY =64743         '100 us luk süre
Symbol PuLsCyCLe=58343         '900 us luk süre

sEsDeGeR =20
OnMaIn:
GIE =1

For X =0 To 50
DelayMS 1
Next
tUnE =tOtaLaDc +3
MaIn:

If tBuTon =0 Then
bUtOnSaYac =0
    While tBuTon ==0 
    Inc bUtOnSaYac
        DelayMS 100
    Wend
    tUnE =tOtaLaDc +3
    sEsDeGeR =20
    If bUtOnSaYac <20 Then
         tItRetbIt =0
         Else
         tItRetbIt =1
         For X =0 To 10
             tItReT =1
             DelayMS 100
             tItReT =0
             DelayMS 200
         Next
         EndIf
EndIf
DelayMS 100
GoTo MaIn

kEsMe:
Context Save
If TMR1IF =1 Then
    Toggle sAy
        If sAy =1 Then
            TMR1L =pULsDuTY.LowByte
            TMR1H =pULsDuTY.HighByte
            pULs =0
        EndIf
        If sAy =0 Then
            TMR1L =PuLsCyCLe.LowByte
            TMR1H =PuLsCyCLe.HighByte
            pULs =1
                    DelayUS 40
                    LeDyAk =1
                        aDc =ADIn 1
                        While ADCON0.1 ==1 :Wend
                    LeDyAk =0 
                        tOtaLaDc =((tOtaLaDc *9) +aDc) /10
                            If tOtaLaDc >tUnE Then
                                If sEsDeGeR <20 Then sEsDeGeR =23-(tOtaLaDc -tUnE)
                                Else
                                sEsDeGeR =20
                            EndIf
                                
        EndIf
TMR1IF =0
EndIf
If TMR0IF =1 Then
     Inc sEsSaYaC             'sesi oluşturan sayacı 1 artır yani sessayac =sessayac +1
          If sEsSaYaC =1 Then
            bUzZer =1
                If tItRetbIt =1 Then tItReT =1
          EndIf
          If sEsSaYaC = 2 Then
            bUzZer =0
                If tItRetbIt =1 Then tItReT =0
          EndIf
          If sEsSaYaC =sEsDeGeR Then sEsSaYaC =0

TMR0 =0              '8 mS süre oluşturuldu 
TMR0IF =0
EndIf
Context Restore
End

Hattuşa

bu noktada 2 kod parçacığının işlevini de izah etmeye çalışayım.
1. kısım butona veilen 2 işlem

If tBuTon =0 Then
bUtOnSaYac =0
    While tBuTon ==0 
    Inc bUtOnSaYac
        DelayMS 100
    Wend
    tUnE =tOtaLaDc +3
    sEsDeGeR =20
    If bUtOnSaYac <20 Then
         tItRetbIt =0
         Else
         tItRetbIt =1
         For X =0 To 10
             tItReT =1
             DelayMS 100
             tItReT =0
             DelayMS 200
         Next
         EndIf
EndIf

burada kullanıcı butonu 2 kısımda kullanabiliyor. birinci işlem okunan anlık adc değerinin artışı bize metalin varlığını tespit etmekte olup bunu kesme içinde yaptığımız adc artışının olup olmadığını belirten aynı zamanda buzzerin şiddeti ve titreşimin şiddetini belirten matematiğin
 tOtaLaDc =((tOtaLaDc *9) +aDc) /10
                            If tOtaLaDc >tUnE Then
                                If sEsDeGeR <20 Then sEsDeGeR =23-(tOtaLaDc -tUnE)
                                Else
                                sEsDeGeR =20
                            EndIf

tune değerini butonla belirliyoruz. devremiz gerçek kullanımda kararsızlaştığında butona uzun süreli veya kısa süreli basımda elde edilen tune değeridir. bunu ;
tUnE =tOtaLaDc +3

ile belirliyoruz.

2. işlem ise butona kısa basarsak sadece buzeri aktif edip, titreşimi iptal ediyoruz. uzun süreli bastığımızda ise hem titreşim hemde buzzer aktif olmuş oluyor. bunu kullanıcıya belirtmek içinde 10 kez titreterek kullanıcıyı uyararak yapıyoruz.

tabi burada
If bUtOnSaYac <20 Then
20 değeri butona basım süresi ile belirledik gerçekte uygulama esnasında bu değerle oynayarak basım süresini değiştirebiliriz

elektro77

Hocam güzel oldu. Daha neler çıkaracaksınız bakalım. Şu osiloskopu hala nasıl bu şekilde kullabiliyoruz anlamadım.Resimdeki cursor çizgilerini nasıl ortaya çıkarabiliyoruz. Çok inceledim ama başaramadım.

"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"

elektro77

#40
Konu biraz geride kaldı. Araya başka başka işler girince devam edemedim.
Pro-tr hocam siz bu dedektörü gerçekte yapıp çalıştırdınız galiba.
Performans konusunda eksik yönleri ne oldu.Eğer oldu ise bunları gidermek için ne gibi değişiklikler yaptınız. Açıklarmısınız. Pcb tarafında filan değişiklik yaptıysanız eğer bende ona göre düzenleyip yapıcam.
"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"

Hattuşa

Alıntı yapılan: elektro77 - 25 Aralık 2019, 14:00:05Konu biraz geride kaldı. Araya başka başka işler girince devam edemedim.
Pro-tr hocam siz bu dedektörü gerçekte yapıp çalıştırdınız galiba.
Performans konusunda eksik yönleri ne oldu.Eğer oldu ise bunları gidermek için ne gibi değişiklikler yaptınız. Açıklarmısınız. Pcb tarafında filan değişiklik yaptıysanız eğer bende ona göre düzenleyip yapıcam.

hocam bende o zamanlar biraz uğraştım ancak üzerine gitmedim. şu aralar androd studio ile uygulama yapma derdindeyim

Powered by EzPortal