תוכן עניינים:

מגע קיבולי עם מיקרו -בקר PIC16F886: 3 שלבים
מגע קיבולי עם מיקרו -בקר PIC16F886: 3 שלבים

וִידֵאוֹ: מגע קיבולי עם מיקרו -בקר PIC16F886: 3 שלבים

וִידֵאוֹ: מגע קיבולי עם מיקרו -בקר PIC16F886: 3 שלבים
וִידֵאוֹ: Part 3 - The War of the Worlds Audiobook by H. G. Wells (Book 2 - Chs 1-10) 2024, נוֹבֶמבֶּר
Anonim
מגע קיבולי עם מיקרו -בקר PIC16F886
מגע קיבולי עם מיקרו -בקר PIC16F886

במדריך זה נעבור כיצד ניתן להשתמש בבקר מיקרו PIC16F886 כדי לזהות הבדלים בקיבול, מאוחר יותר ניתן להשתמש בו כדי לדעת אם לוחצים על לוח מגע. טוב להכיר מיקרו -בקרי תמונות לפני ביצוע הפרויקט הזה.

שלב 1: חיבור המעגל שלך

חבר את המעגל שלך
חבר את המעגל שלך

ראשית, נתחיל בחיווט המעגל בהתאם לסכימה למעלה. להכנת משטח המגע ניתן לקפל רדיד אלומיניום לריבוע ולהדביק על חוט. אתה יכול להתנסות בערכים שונים לנגד 100k, מצאתי ש- 100k עובד לי טוב.

סיכת RC4 משמשת לטעינה/פריקה של הקיבול שיש למדוד. C12IN0 מחובר לצד - של משווה פנימי וסיכת C1IN מחוברת לצד + של אותו משווה. המיקרו -בקר רואה בקיבול טעון מלא כאשר מתח C12IN0 מגיע מעל מתח C1IN. מחלק המתח ההתנגדות מוודא כי C1IN קרוב ל -5 וולט.

מכיוון שמשטח המגע תלוי בקיבול משמעותי בינך לבין קרקע המעגל, קיימת אפשרות שסוללה לא תעבוד.

שלב 2: קובץ הכותרת

קובץ הכותרת
קובץ הכותרת

סיימת עם כל החיבורים? טוב, נמשיך עם קובץ הכותרת. אנו נשתמש במהדר XC8 וכפי שהכותרת מרמזת כעת תיצור קובץ כותרת חדש בפרויקט שלך והעתק והדבק את הקוד הבא. אתה יכול גם להעתיק ולהדביק אותו מעל הקוד הראשי שלך ללא קובץ כותרת.

#הגדר CALIBRATION_SAMPLE 20 #הגדר TOUCH_SAMPLE 10 #הגדר DISCHARGE_TIME 5

ספירת int;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // קיבול פריקה למדוד RC4 = 0; _ עיכוב_מס (DISCHARGE_TIME); // לתת מספיק עיכוב כדי לפרוק באופן מלא (כמעט לגמרי) את "הקבל" // לנקות את דגל הצפת הטיימר T0IF = 0; // המתן עד שהטיימר יעלה על גדותיו, התחל לספור מ -0 בעוד (! T0IF); T0IF = 0; // התחל טעינת קיבולת למדידה RC4 = 1; // המתן עד שקיבול יטען עד למתח ההפניה בעוד (C1OUT) {timerCount = TMR0; if (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // אפס timerCount timerCount = 0; overflowCount = 0; ספירת החזרה; }

int isTouching (int tolerance) {

// ממוצע מספר דגימות ממוצע כפול = 0; עבור (int i = 0; i calibrationValue+סובלנות) ממוצע ++; } ממוצע /= TOUCH_SAMPLE; // הממוצע יהיה מספר בין 0 ל -1 אם (ממוצע> 0.2) החזרה 1; החזר 0; }

כיול חלל () {

ממוצע int = 0; דוגמאות int [CALIBRATION_SAMPLE]; // לקבל ערך ממוצע עבור (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); ממוצע += דוגמאות ; } ממוצע /= CALIBRATION_SAMPLE; כיול ערך = ממוצע; // לקבל max/min ערכים maxCalibrationValue = samples [0]; minCalibrationValue = דוגמאות [0]; עבור (int i = 0; i maxCalibrationValue) maxCalibrationValue = דוגמאות ; if (דוגמאות <minCalibrationValue) minCalibrationValue = דוגמאות ; }}

void setupCapacitiveTouch () {

// הגדרת סיכת תשלום/פריקה כפלט, במקרה זה RC4 TRISCbits. TRISC4 = 0; // הגדרת טיימר 0 T0CS = 0; PSA = 1; // הגדרת משווה C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // ניקוי ערכי ספירה count = 0; // ניקוי ערכי כיול calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // הפעל כיול על התחל כיול (); }

שלב 3: כתיבת הקוד הראשי

החל מהקוד הראשי, עליך לכלול את קובץ הכותרת שנוצר בשלב הקודם. הקוד הבא הוא דוגמה לאופן בו תוכל להשתמש בפונקציית isTouching כמתג. במקרה שלי נתתי לכותרת את השם capacitiveTouch.h.

#לִכלוֹל

#כלול "capacitiveTouch.h"

// משתנה זה אומר אם הכפתור כבר נלחץ או לא

int lastState = 0;

void main () {

// הגדרת RC5 כפלט TRISCbits. TRISC5 = 0; // עליך להפעיל את הפונקציה הזו עם תחילת התוכנית setupCapacitiveTouch (); _ עיכוב_מס (1000); // כיול לאחר ההתקנה המדויקת שלך כיול (); בעוד (1) {// בודקים אם הכפתור נלחץ אם (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; אחרת RC5 = 1; lastState = 1; } // לבדוק אם הכפתור משתחרר אחרת אם (lastState == 1 &&! isTouching (15)) lastState = 0; _ עיכוב_מס (20); }}

לְדַרֵג:

כאשר פונקציה זו נקראת המשתנים calibrationValue, maxCalibrationValue ו- minCalibrationValue יעודכנו. כיול ערך משמש את הפונקציה isTouching. זכור כי משטח המגע צריך להישאר לבד במהלך הכיול.

setupCapacitiveTouch:

צריך להתקשר בתחילת התוכנית שלך. הוא מגדיר את הביטים הדרושים המשמשים את הפונקציות האחרות. הוא גם מפעיל קליברציה. עם זאת קיבלתי תוצאות טובות יותר בהמתנה שנייה והפעלת הכיול שוב בנפרד.

isTouching:

פונקציה זו מחזירה 1 אם היא מזהה עלייה בקיבול ב- C12IN0 ומחזירה 0 אם הקיבול קרוב לזה שהיה במהלך הכיול. בפשטות, אם מישהו נוגע בכרית הפונקציה isTouching תחזור 1. הפונקציה רוצה גם פרמטר כקלט, זו הסובלנות שהיא תפעיל. ככל שערך הסובלנות גבוה יותר הוא הופך להיות פחות רגיש. בהתקנה שלי מצאתי ש 15 עובד היטב, אך מכיוון שזה תלוי בתדר אוסילטור וכמה קיבול מתווסף בעת לחיצה עליו עליך להתנסות בערך זה עד שתמצא משהו שעובד עבורך.

getChargeTime:

אם אתה רוצה לדעת כמה זמן יידרש לטעון את הקיבול למתח CVREF, פונקציה זו תבדוק אותו ותחזיר מספר שלם. כדי לקבל את הזמן בשניות אתה משתמש בנוסחה הבאה: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds ניתן להשתמש בנוסחה זו גם בכדי לקבל את קלט הסובלנות מהפונקציה isTouching לשניות.

מוּמלָץ: