12F1822 CPS (Capacitive Sensing) modül kullanımı ?

Başlatan mustafa_cmbz, 28 Aralık 2023, 17:49:40

mustafa_cmbz

Merhabalar..

12F1822 iç yapısındaki CPS ( Capacitive Sensing ) modül ile ilgili danışmak istediklerim var.

ilk olarak daha önce buna benzer bir proje yapmak istediğimde ( kapasitif olarak plastik bir kaptaki sıvı seviyesini algılamak )



üzerinde TTP223 olan resimdeki modülden alıp denemiştim.Fakat bu touch button modüllerinin şöyle bir kalibrasyon işlemi olduğunu öğrendiğimde amacıma uygun olmadığını öğrenmiştim.

Bu chipler gayet güzel algılama yapıyor velakin enerjiyi kesip verdiğimizde kabın içinde sıvı var ise şayet enerji tekrar verildiğinde kalibrasyon işlemi sırasında kabın içindeki sıvıya göre kendini kalibre ettiği için kontak vermiyor idi.


Şimdi yine aynı amaç ile 12F1822'nin iç yapısındaki CPS modülü kullanarak birşeyler yapmak istiyorum fakat datasheetin ilgili register kısımlarındaki değişkenlik durumlarının neyi ifade ettiğini anlayamadım.

yani neye göre ayarlayacağım ben bu registeri?

birde bu CPS modülü kullanırken timer kurduklarını gördüm.Bu hususta ( az bir fikir oluştu kafamda bellir bir süre timer ile örnek alıp işliyor sinyal genliğini sanırım ) fakat tam emin olmak ve bilerek yapmak istiyorum.

beni bu konuda aydınlatabilirmisiniz rica etsem.

12F1822 datasheet :

https://pdf.direnc.net/upload/pic12l1822-pic16l1823.pdf

JOKERAS

RC osilatör düşünün, osilatörde osilatörün frekansını belirleyen R,C ve Voltajdır.
Bu üçünden biri değişince Osilatör frekansı değişir.

Kapasitif sensör yapısında C'yi dışarı koyacağınız bir Pad ile temsil edin.
Pad'e elinizi veya Kapasitenin değerini değiştirecek her olay Frekansta bir değişime sebep olur.
İşlemci Devrenin yapısında-joksiyonunda mutlaka kapasite vardır.
Dışarı koyacağınız harici pad,bu Jonksiyonun kapasitesini değiştirir.

Elinizi yaklaştırdığınızda Bu kapasite daha fazla değişir.
(Bazıları Kandaki Demirin Kapasiteyi değiştirdiğini iddia etmektedirler).
Yapıdan Tik alan Timerda değişim olur.Timerdaki bu değişimi Yorumlarsınız.
Kalibrasyonu tamamen Devrenin Donanımına,Empedansına uygun olarak yaparsınız.Kalibrasyon da aslında yorumdur,sizin yorumunuz.

Örenğin...

Pad boşta, Timer 100 değeri ile taşar başa döner,taşar başa döner.
Pad 'e elinizi yaklaştırdığınızda (Dokunduğunuzda değil Dikkat Edin!)
Timer 200 sayar taşar.Sizde bunu yorumlarsınız.

Birde Adc ile Kapsitif okuma yöntemi var.Adc si olan her işlemci ile yapılabilinir.Bir adc okurken Porta genelde bir Kapasite eklersiniz.Bu aslında Gürültü içindir.Adc'yi kararlı hale getirmek içindir.

Bu kapasite yerine Pad eklerseniz ve bu Pad'i işlemci içinden kendi voltajı ile kutuplayıp
sonra Portu İddle'a çekip Adc okuması yaparsanız,Pad büyüklüğüne göre Pad'daki Voltajı-yükü okumuş olursunuz.Emme Basma Tulumda gibi.Pad'a Enerji yükle sonra onu oku.
Pad'e parmak-nesne yaklaşınca doğal olarak Pad'in oluşturduğu kapasite ve Elektrik yüküde değişecektir.

Bu tür yapılarda çok kritik nokta Pad Empedansları.Pad büyük olursa Anten gibi davranır.Kalibrasyonu ona göre revize temek icab eder.Pad ne kadar küçük olursa kararlılık o derece yüksek olur.

Şimdi CPS modulünü bu şekilde düşünerek yorumlayın.İş daha kolaylaşır diye düşünüyorum.
 





mustafa_cmbz

değerli yorumun için çok teşekkür ederim hocam.

2 sorum daha var :

* bu kalibrasyon işi bu işlemci ile olanda yok sanırım.yani tamamen benim kontrolümde anladığım kadarı ile..

* 2. olarak bana timer ile ilgili yazacağım programda izleyeceğim işlem sırasını mantıken yazarmısın rica etsem.

JOKERAS

#3
Rica ederim...

Modülü incelediğim kadarı ile kurulumu şu şekilde olabilir.
Evden yazıyorum kontrol etmedim.Register tanımlamarında sentaks hataları olabilir.
Derleyiciye yazma ortamım evde yok,çocukların Bilgisayarından yazdım.

İnterrupt Servis Rutini siz yazacaksınız.

RA 0'a bağlı Pad' e dokunduğunuzda veya elinizi yaklaştırdığınızda Timer1 Capture Değerlerinin değişmesi gerekir.TMR0, Timer Sayıcısının Timer1 Gateini kontrol eder.
Yani Timer 0 ile ile Timer1 Gate Kontrolü ile değişen değerleri yakalama durumu gibi.

Hayali Scop görüntüsü şöyle.. CPS ile Sürekli Taşan TMR0 Tik atar.Aynı CPS'den beslenen Timer1,
Timer0'dan aldığı Tik ve Timer1 Gate Kontrolü ile  Timer1'in o anki değerini Yakalar.
Eldeki bu değeri siz yorumlayacaksınız.Bu kalibrasyon oluyor.Yakalanan Bu değerler Modüllerin kurulum şekline göre,Donanımın yapısına göre değişkenlik gösterir.
Bu şekilde deneyin bakın durumu görün.Size en azından fikir verecektir diye düşünüyorum.
Olayı çözümleye başladığınızda çok daha kolaylaşacak.
TRISAbits.RA0  = 1; // Touch Pad.
ANSELAbits.AN0 = 1; // Touch Pad pin Analog input.


CPSCON0bits.CPSON = 1;    //CPS Modül ON/OFF
CPSCON0bits.CPSRM = 1;    //1 İnternal Voltaj modülü.0 FVR .İsteğe göre DAC ile bir çalışabilir 
CPSCON0bits.CPSRNG = 0x03; //Buraya atanacak değer CPS osilatörünün voltajını Kontrol eder.
CPSCON0bits.TOXCS = 1;    //Timer 0, Timer1'i kontrol edecek Taban Timer. 1 CPS'den besleniyor.0 External pin
 


T1CONbits.TMR1CS = 0x03; //T1 Clock, Kapasitif sensör Modül.
T1CONbits.T1CKPS = 0x00; //PreScaler 1:1 duruma göre değiştirilir.
T1CONbits.TMR1ON = 1;    //TMR1 ON/OFF 

T1GCONbits.TMR1GE = 1;  //Timer1 Gate Kontrol Blok ON/OFF
T1GCONbits.T1GSS = 0x01; //Timer1 Taban Timer0 Counter. 

OPTION_REGbits.TMR0CS = 0; //T0XCS 1 ise bu bit 0 olmalı.
OPTION_REGbits.PSA = 0    //Timer0  PreScaller Aktif.
OPTION_REGbits.PS = 0x00;  //Timer0 PreScaller değeri.


INTCONbits.PEIE = 1;      //Çevresel İnterrupt modülleri Aktif.  
INTCONbits.TMR0IF = 0;    //False İnterrupt.
INTCONbits.TMR0IE = 1;    //TMR0 İnterrupt ON/OFF

INTCONbits.GIE = 1;        //Global İnterrupt Anahtar. 

CPSCON1bits.CHSPC = 0x00; //CPS Touch Kanal Pad select.    

While(1) {

          if(GlobalCapTouchVal > CalibrationVal) { //Kalibrasyonu burada yapacaksınız.
                  
                        LED = 1;
     
         }else{

                       LED = 0;
         }
}


Edit...

void interrupt isr(void) {

#if 1
    if (INTCONbits.TMR0IF) {

        GlobalCapTouchVal =  (unsigned int) (TMR1H << 8) + TMR1L;
        TMR1H = 0; TMR1L = 0;  // Bu Değerler Silinebilir veya başka bir değer değer
                                                 // ile güncellenebilir.Bu tamamen donanıma ve duruma bağlı. Veya TMR1 Kapatın çıkarken                                                  tekrar açın. 
                                                

        INTCONbits.TMR0IF= 0;
    }
#endif
}
#endif

mustafa_cmbz

Son bir soru ve buna istinaden minik bir pc çizip yaptıracağım ve geldiğinde gerisi yazılıma kaldığı için devam edeceğim.


1 buton  koyup su varken ve yokken okutup elde ettiğim değerler neticesinde ( pcb deki kapasite ölçüsü hep aynı olacak neticede.) okuduğun real veriyor kıyaslayıp su var yok diyebilirim yani.

Çizimide bahsettiğin şekilde uyarak yapacağım. Çok büyük olmayacak hatta mevcutta hazır satılanlar boyutunda çizim yapacağım hatta daha ufak yapacağım.

Kart çiziminde dikkat etmem gereken başka bir durum varmı acaba?

JOKERAS

Valla bu konuda hiç bir fikrim ve tecrübem yok.
Pad büyüklükleri nedir ne değildir bu yapılacak devreye göre değişir sanırım.

Linkte Microchip'in bir AN var.Size Fikir verebilir.
https://ww1.microchip.com/downloads/en/Appnotes/Capacitive-Touch-Sensor-Design-Guide-DS00002934-B.pdf

mustafa_cmbz





hocam kart geldi bunun birde 2 padli olanından yaptırdım onuda test edeceğim yazılımı oturttuğumuzda..



'*********************************
'**** CPS MODÜL AYARLARI *********

CPSCON1=%00000000    ' İLK DÖRT BİT ETKİSİZ SONRAKİ 4 BİT KANAL SEÇİMİ 0000= A0 GİRİŞİ KAPASİTİF SEÇİM
CPSCON0.7=1          ' CPSON enb - disable
CPSCON0.6=1          ' CPSRM
 
CPSCON0.3=1          ' CPSRNG
CPSCON0.2=1          ' CPSRNG
CPSCON0.1=1          ' CPSOUT
CPSCON0.0=1          ' T0XCS 

'********************************
'***** TİMER AYARLARI ***********

T1CON.0      = 1  ' TMR1ON ENB-DİSABLE
T1GCON.7     = 1  ' Timer1 Gate Kontrol Blok ON/OFF
T1GCON.0     = 1  ' Timer1 Taban Timer0 Counter.
T1GCON.1     = 0  ' Timer1 Taban Timer0 Counter.
OPTION_REG.5 = 0  ' T0XCS 1 ise bu bit 0 olmalı. TMR0CS
OPTION_REG.3 = 0  ' PSA Timer0  PreScaller Aktif.   
OPTION_REG.0 = 0  ' PS Timer0 PreScaller değeri.   
OPTION_REG.1 = 0  ' PS Timer0 PreScaller değeri.   
OPTION_REG.2 = 0  ' PS Timer0 PreScaller değeri.   

INTCON.6     = 1  ' PEIE    Çevresel İnterrupt modülleri Aktif. 
INTCON.2     = 0  ' TMR0IF  False İnterrupt.
INTCON.5     = 0  ' TMR0IE  TMR0 İnterrupt ON/OFF
INTCON.7     = 0  ' GIE     Global İnterrupt Anahtar.


ANSELA=%0000001    ' 1 NOLU ANALOG GİRİŞ AKTİF
 

TRISA=%000000:PORTA=%000000
Declare All_Digital= true


Symbol TOUCH = PORTA.0
Input  TOUCH
Symbol BTN   = PORTA.1
Symbol LED   = PORTA.2

Dim GlobalCapTouchVal  As Word
Dim CalibrationVal     As Word




On_Interrupt GoTo KESME
GoTo BASLA


'***************************************************

 BASLA:
 
 


 GoTo BASLA


'***************************************************
 Disable
 KESME:
 Context Save

 High LED
 DelayMS 50
 Low LED
 DelayMS 50


 
 GlobalCapTouchVal =  (TMR1H << 8) + TMR1L
 TMR1H = 0  : TMR1L = 0
 
 

 Context Restore
 Return


@JOKERAS  Verdiğin örnek koddalardan yola çıkarak ve datashhetten anladığım kadarı ile modülü kurduğumu düşünüyorum ama bu timer kurma işini ve taşmalarını tam kafamda oturtamadım yada net bir proton kodu örnek olmadığı için nasıl yapılacağını çözemedim gibi..

basit bir iş olduğu için pic ile ve protonda yazarım ve uyguna maal ederim diye düşünüyorum..