İçindekiler:

PIC16F886 Mikrodenetleyicili Kapasitif Dokunmatik: 3 Adım
PIC16F886 Mikrodenetleyicili Kapasitif Dokunmatik: 3 Adım

Video: PIC16F886 Mikrodenetleyicili Kapasitif Dokunmatik: 3 Adım

Video: PIC16F886 Mikrodenetleyicili Kapasitif Dokunmatik: 3 Adım
Video: Nostalji Köşesi : İlk öğrendiğim mikrodenetleyiciler: PIC'ler 2024, Kasım
Anonim
PIC16F886 Mikrodenetleyicili Kapasitif Dokunmatik
PIC16F886 Mikrodenetleyicili Kapasitif Dokunmatik

Bu derste, kapasitans farklarını tespit etmek için bir PIC16F886 mikro denetleyicisini nasıl kullanabileceğinizi gözden geçireceğiz, bu daha sonra bir dokunmatik yüzeye basılıp basılmadığını söylemek için kullanılabilir. Bu projeyi yapmadan önce pic mikrodenetleyicilere aşina olmak güzel.

Adım 1: Devrenizi Bağlayın

Devrenizi Bağlayın
Devrenizi Bağlayın

İlk önce devreyi yukarıdaki şemaya göre bağlayarak başlayalım. Dokunmatik yüzeyi yapmak için alüminyum folyoyu kare şeklinde katlayabilir ve bir tel üzerine bantlayabilirsiniz. 100k direnç için farklı değerlerle deney yapabilirsiniz, 100k'nin benim için iyi çalıştığını buldum.

RC4 pimi, ölçülecek kapasitansı şarj etmeye/boşaltmaya başlamak için kullanılır. C12IN0, dahili bir karşılaştırıcının - tarafına, C1IN pimi ise aynı karşılaştırıcının + tarafına bağlanır. Mikrodenetleyici, C12IN0 voltajı C1IN voltajının üzerine çıktığında kapasitansı tam olarak şarj edilmiş olarak görür. Dirençli voltaj bölücü, C1IN'in 5 volta yakın olmasını sağlar.

Dokunmatik yüzey, sizinle devre topraklaması arasında önemli bir kapasite olmasına bağlı olduğundan, pilin çalışmama olasılığı vardır.

2. Adım: Başlık Dosyası

Başlık Dosyası
Başlık Dosyası

Tüm bağlantılar bitti mi? Güzel, başlık dosyasıyla devam edeceğiz. XC8 derleyicisini kullanacağız ve başlıktan da anlaşılacağı gibi şimdi projenizde yeni bir başlık dosyası oluşturacak ve aşağıdaki kodu kopyalayıp yapıştıracaksınız. Herhangi bir başlık dosyası olmadan ana kodunuzun üzerine kopyalayıp yapıştırabilirsiniz.

#define CALIBRATION_SAMPLE 20#define TOUCH_SAMPLE 10 #define DISCHARGE_TIME 5

int sayısı;

int kalibrasyonValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime(){

int timerCount = 0; int overflowCount = 0; //ölçülecek deşarj kapasitansı RC4 = 0; _delay_ms(DISCHARGE_TIME); //"kapasitörü" tamamen (aslında neredeyse tamamen) boşaltmak için yeterli gecikmeyi ver //zamanlayıcı taşma bayrağını temizle T0IF = 0; //zamanlayıcının taşmasını bekle, saymaya 0'dan başla while(!T0IF); T0IF = 0; //ölçülecek kapasitansı şarj etmeye başla RC4 = 1; //kapasitansın referans voltajına kadar dolmasını bekleyin while(C1OUT){ timerCount = TMR0; if(T0IF){ overflowCount++; T0IF = 0; } } count = (256 * overflowCount) + timerCount; // timerCount timerCount'u sıfırla = 0; overflowCount = 0; dönüş sayısı; }

int isTouching(int tolerans){

//birden çok örneğin ortalaması çift ortalama = 0; for(int i = 0; i kalibrasyonDeğeri + tolerans) ortalama++; } ortalama /= TOUCH_SAMPLE; //ortalama 0 ile 1 arasında bir sayı olacaktır if(ortalama > 0.2) return 1; 0 döndür; }

geçersiz kalibre(){

int ortalama = 0; int örnekler[CALIBRATION_SAMPLE]; //(int i = 0; i < CALIBRATION_SAMPLE; i++){ örnekleri için ortalama değer alın = getChargeTime(); ortalama += örnekler; } ortalama /= KALİBRASYON_SAMPLE; kalibrasyonDeğeri = ortalama; //maks/min değerlerini al maxCalibrationValue = örnekler[0]; minCalibrationValue = örnekler[0]; for(int i = 0; i maxCalibrationValue) maxCalibrationValue = örnekler; if(samples < minCalibrationValue) minCalibrationValue = örnekler; } }

geçersiz setupCapacitiveTouch(){

//şarj/deşarj pinini çıkış olarak ayarlıyoruz, bu durumda RC4 TRISCbits. TRISC4 = 0; //zamanlayıcının ayarlanması0 T0CS = 0; PSA = 1; //karşılaştırıcının ayarlanması C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; //sayım değerleri temizleniyor count = 0; //kalibrasyon değerlerinin temizlenmesi kalibrasyonValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; //başlangıçta kalibrasyonu çalıştır calibrate(); }

Adım 3: Ana Kodun Yazılması

Ana koddan başlayarak, önceki adımda oluşturulan başlık dosyasını eklemeniz gerekir. Aşağıdaki kod, isTouching işlevini bir anahtar olarak nasıl kullanabileceğinizin bir örneğidir. Benim durumumda başlığa capacitiveTouch.h adını verdim.

#Dahil etmek

#include "capacitiveTouch.h"

// bu değişken butona basılıp basılmadığını söyler

int lastState = 0;

geçersiz ana(){

//RC5'i çıkış olarak ayarlıyoruz TRISCbits. TRISC5 = 0; //programın başlangıcında bu fonksiyonu çağırmanız gerekiyor setupCapacitiveTouch(); _delay_ms(1000); // tam kurulumunuzdan sonra kalibre edin calibrate(); while(1){ //düğmeye basılıp basılmadığı kontrol ediliyor if(isTouching(15) && lastState == 0){ if(RC5) RC5 = 0; yoksa RC5 = 1; sonDurum = 1; } //butonun serbest bırakılıp bırakılmadığı kontrol ediliyor else if(lastState == 1 && !isTouching(15)) lastState = 0; _delay_ms(20); } }

kalibre etmek:

Bu fonksiyona kalibrasyonValue, maxCalibrationValue ve minCalibrationValue değişkenleri çağrıldığında güncellenecektir. kalibrasyonValue, isTouching işlevi tarafından kullanılır. Kalibrasyon sırasında dokunmatik yüzeyin yalnız bırakılması gerektiğini unutmayın.

setupKapasitif Dokunma:

Programınızın başında çağrılması gerekiyor. Diğer fonksiyonlar tarafından kullanılan gerekli bitleri kurar. Ayrıca bir kalibrasyon çalıştırır. Ancak bir saniye bekleyip kalibrasyonu ayrı ayrı çalıştırarak daha iyi sonuçlar aldım.

Dokunma:

Bu işlev, C12IN0'da kapasitansta bir artış tespit ederse 1 döndürür ve kapasitans kalibrasyon sırasındaki kapasitansa yakınsa 0 döndürür. Basitçe ifade edilirse, birisi pede dokunursa isTouching işlevi 1 değerini döndürür. İşlev ayrıca giriş olarak bir parametre ister, bu, tetikleme toleransıdır. Tolerans değeri ne kadar yüksek olursa o kadar az duyarlı olur. Kurulumumda 15'in iyi çalıştığını buldum, ancak bu osilatör frekansına ve bastığınızda ne kadar kapasitans eklendiğine bağlı olduğundan, sizin için çalışan bir şey bulana kadar bu değerle denemeler yapmalısınız.

getChargeTime:

Kapasitansın CVREF voltajına yüklenmesinin ne kadar süreceğini bilmek istediğinizde, bu fonksiyon onu test edecek ve bir tamsayı döndürecektir. Zamanı saniye cinsinden almak için şu formülü kullanırsınız: (4 * getChargeTime) / osilatörFrequency = ChargeTimeInSeconds Bu formül, isTouching işlevinden tolerans girdisini saniyelere almak için de kullanılabilir.

Önerilen: