Mündəricat:

PIC16F886 Mikrokontrolörlü Kapasitif Toxunuş: 3 addım
PIC16F886 Mikrokontrolörlü Kapasitif Toxunuş: 3 addım

Video: PIC16F886 Mikrokontrolörlü Kapasitif Toxunuş: 3 addım

Video: PIC16F886 Mikrokontrolörlü Kapasitif Toxunuş: 3 addım
Video: 🛜Neil Degrasse Tyson, WRONG about Tesla?!? 🛜 ​⁠@joerogan (30min) 2024, Noyabr
Anonim
PIC16F886 Mikro nəzarətçi ilə Kapasitiv Toxunuş
PIC16F886 Mikro nəzarətçi ilə Kapasitiv Toxunuş

Bu təlimatda, kapasitans fərqlərini aşkar etmək üçün bir PIC16F886 mikro nəzarətçisindən necə istifadə edə biləcəyinizə baxacağıq, daha sonra bir toxunma yastığının basıldığını söyləmək üçün istifadə edilə bilər. Bu layihəni etməzdən əvvəl şəkil mikrokontrolörləri ilə tanış olmaq yaxşıdır.

Addım 1: Dövrənizi bağlayın

Dövrənizi bağlayın
Dövrənizi bağlayın

Əvvəlcə yuxarıdakı sxemə uyğun olaraq dövrə bağlayaraq başlayaq. Toxunma yastığı düzəltmək üçün alüminium folqa bir kvadrat halına qatlana və telə bantlana bilər. 100k müqavimət üçün fərqli dəyərlərlə təcrübə edə bilərsiniz, 100k mənim üçün yaxşı işlədiyini gördüm.

Ölçüləcək kapasitansı doldurmağa/boşaltmağa başlamaq üçün RC4 pinindən istifadə olunur. C12IN0 daxili müqayisə cihazının yan tərəfinə, C1IN pimi isə eyni müqayisənin + tərəfinə bağlıdır. Mikro nəzarətçi, C12IN0 gərginliyi C1IN gərginliyinin üstünə çıxdıqda, kapasitansın tam dolu olduğunu görür. Rezistiv gərginlik bölücü C1IN -in 5 volta yaxın olmasını təmin edir.

Toxunma paneli aranızda və dövrə arasında əhəmiyyətli bir tutum olduğundan asılı olaraq, batareyanın işləməməsi ehtimalı var.

Addım 2: Başlıq Dosyası

Başlıq faylı
Başlıq faylı

Bütün əlaqələri bitirdinizmi? Yaxşı, başlıq faylına davam edəcəyik. XC8 kompilyatorundan istifadə edəcəyik və başlıqdan da göründüyü kimi, indi layihənizdə yeni bir başlıq faylı yaratmalı və aşağıdakı kodu kopyalayıb yapışdırmalısınız. Heç bir başlıq faylı olmadan əsas kodunuzun üstünə kopyalayıb yapışdıra bilərsiniz.

#CALIBRATION_SAMPLE 20 təyin edin #TOUCH_SAMPLE 10 təyin edin #DISCHARGE_TIME 5 təyin edin

int sayı;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // boşalma kapasitansı ölçülməlidir RC4 = 0; _ gecikmə_ms (DISCHARGE_TIME); // "kondansatörü" tam (demək olar ki, tam olaraq) boşaltmaq üçün kifayət qədər gecikmə verin // taymer daşma bayrağını sil T0IF = 0; // taymerin daşmasını gözləyin, 0 -dan başlayaraq saymağa başlayın (! T0IF); T0IF = 0; // ölçüləcək kapasitansı doldurmağa başlayın RC4 = 1; // kapasitansın (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // sıfırla timerCount timerCount = 0; overflowCount = 0; qaytarma sayı; }

int isToching (int tolerantlığı) {

// birdən çox nümunənin ortalaması ikiqat orta = 0; for (int i = 0; i calibrationValue+tolerance) orta ++; } orta /= TOUCH_SAMPLE; // orta, 0 ilə 1 arasında bir rəqəm olacaq (əgər orta> 0.2) 1 qaytararsa; qaytarma 0; }

boş kalibrləmə () {

int orta = 0; int nümunələri [CALIBRATION_SAMPLE]; // (int i = 0; i <CALIBRATION_SAMPLE; i ++) {nümunələri = getChargeTime (); orta += nümunələr ; } orta /= CALIBRATION_SAMPLE; calibrationValue = orta; // max/min dəyərləri əldə maxCalibrationValue = nümunələr [0]; minCalibrationValue = nümunələr [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = nümunələr ; əgər (nümunələr <minCalibrationValue) minCalibrationValue = nümunələr ; }}

void setupCapacitiveTouch () {

// şarj/boşaltma pinini çıxış olaraq təyin etmək, bu halda RC4 TRISCbits. TRISC4 = 0; // taymerin qurulması0 T0CS = 0; PSA = 1; // müqayisə aparatının qurulması C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // sayma dəyərlərinin silinməsi count = 0; // kalibrləmə dəyərlərinin silinməsi calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // start calibrate -də kalibrləmə apar (); }

Addım 3: Əsas Məcəllənin yazılması

Əsas koddan başlayaraq əvvəlki addımda yaradılmış başlıq faylını daxil etməlisiniz. Aşağıdakı kod isTouching funksiyasını bir keçid olaraq necə istifadə edə biləcəyinizə bir nümunədir. Mənim vəziyyətimdə başlığa capacitiveTouch.h adını verdim.

#daxil edin

#"capacitiveTouch.h" daxil edin

// bu dəyişən düymənin basılmadığını və ya basılmadığını bildirir

int lastState = 0;

void main () {

// RC5 -i TRISCbits. TRISC5 = 0 olaraq təyin etmək; // setupCapacitiveTouch () proqramının başlanğıcında bu funksiyanı çağırmaq lazımdır; _ gecikmə_ms (1000); // dəqiq qurduqdan sonra kalibr edin calibrate (); while (1) {// (isTouching (15) && lastState == 0) {əgər (RC5) RC5 = 0 əgər düymənin basıldığını yoxlayır; başqa RC5 = 1; lastState = 1; } // düymənin başqa bir şəkildə buraxılıb -buraxılmadığını yoxlamaq (lastState == 1 &&! isTouching (15)) lastState = 0; _ gecikmə_ms (20); }}

kalibr edin:

Bu funksiya calibrationValue dəyişənləri adlandırıldıqda maxCalibrationValue və minCalibrationValue yenilənəcək. calibrationValue isTouching funksiyası tərəfindən istifadə olunur. Kalibrləmə zamanı toxunma panelinin tək qalması lazım olduğunu unutmayın.

setupCapacitiveTouch:

Proqramın əvvəlində zəng etmək lazımdır. Digər funksiyalar tərəfindən istifadə olunan zəruri bitləri təyin edir. Həm də bir kalibrləmə aparır. Ancaq bir saniyə gözləyərək daha yaxşı nəticələr əldə etdim və yenidən ayrı -ayrı kalibrləmə apardım.

toxunur:

Bu funksiya, C12IN0 üzərindəki kapasitans artımını algılarsa 1 -i, tutum kalibrləmə zamanı olduğu funksiyaya yaxın olarsa 0 -u qaytarır. Sadəcə olaraq, kimsə yastığa toxunarsa isTouching funksiyası 1 -ə qayıdacaq. Funksiya eyni zamanda giriş olaraq bir parametr istəyir, bu onun tətiklənməsi üçün tolerantlıqdır. Dözümlülük dəyəri nə qədər yüksəkdirsə, bir o qədər həssas olur. Quraşdırma zamanı 15 -in yaxşı işlədiyini gördüm, amma bu osilatorun tezliyindən və ona basdığınızda nə qədər tutum əlavə olunacağından asılı olaraq sizin üçün işləyən bir şey tapana qədər bu dəyərlə təcrübə aparmalısınız.

getChargeTime:

Kapasiteyi CVREF gərginliyinə doldurmağın nə qədər vaxt aparacağını bilmək istəsəniz, bu funksiya onu sınayacaq və tam ədəd qaytaracaq. Zamanı saniyələrlə əldə etmək üçün bu düsturu istifadə edirsiniz: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds Bu düstur, isTouching funksiyasından tolerantlıq girişini saniyələrə çatdırmaq üçün də istifadə edilə bilər.

Tövsiyə: