สารบัญ:

Capacitive Touch ด้วยไมโครคอนโทรลเลอร์ PIC16F886: 3 ขั้นตอน
Capacitive Touch ด้วยไมโครคอนโทรลเลอร์ PIC16F886: 3 ขั้นตอน

วีดีโอ: Capacitive Touch ด้วยไมโครคอนโทรลเลอร์ PIC16F886: 3 ขั้นตอน

วีดีโอ: Capacitive Touch ด้วยไมโครคอนโทรลเลอร์ PIC16F886: 3 ขั้นตอน
วีดีโอ: Capacitive Touch PIC Microcontroller Coding 2024, กรกฎาคม
Anonim
สัมผัสแบบ Capacitive ด้วยไมโครคอนโทรลเลอร์ PIC16F886
สัมผัสแบบ Capacitive ด้วยไมโครคอนโทรลเลอร์ PIC16F886

ในบทช่วยสอนนี้ เราจะอธิบายวิธีที่คุณสามารถใช้ไมโครคอนโทรลเลอร์ PIC16F886 เพื่อตรวจจับความแตกต่างของความจุ ซึ่งสามารถนำมาใช้ในภายหลังเพื่อบอกว่ามีการกดทัชแพดหรือไม่ ควรทำความคุ้นเคยกับไมโครคอนโทรลเลอร์ pic ก่อนทำโครงการนี้

ขั้นตอนที่ 1: ต่อวงจรของคุณ

ต่อวงจรของคุณ
ต่อวงจรของคุณ

ขั้นแรก เริ่มต้นด้วยการเดินสายวงจรตามแผนผังด้านบน ในการทำทัชแพด คุณสามารถพับอลูมิเนียมฟอยล์เป็นสี่เหลี่ยมจัตุรัสแล้วพันเทปไว้บนลวด คุณสามารถทดลองกับค่าต่างๆ สำหรับตัวต้านทาน 100k ได้ ฉันพบว่า 100k ทำงานได้ดีสำหรับฉัน

พิน RC4 ใช้เพื่อเริ่มการชาร์จ/คายประจุความจุที่จะวัด C12IN0 เชื่อมต่อกับด้าน - ของตัวเปรียบเทียบภายใน และพิน C1IN เชื่อมต่อกับด้าน + ของตัวเปรียบเทียบเดียวกัน ไมโครคอนโทรลเลอร์มองเห็นความจุเป็นประจุเต็มเมื่อแรงดันไฟฟ้า C12IN0 สูงกว่าแรงดันไฟฟ้า C1IN ตัวแบ่งแรงดันไฟต้านทานทำให้แน่ใจว่า C1IN อยู่ใกล้กับ 5 โวลต์

เนื่องจากทัชแพดขึ้นอยู่กับความจุที่สำคัญระหว่างคุณกับกราวด์ของวงจร จึงมีความเป็นไปได้ที่แบตเตอรี่อาจไม่ทำงาน

ขั้นตอนที่ 2: ไฟล์ส่วนหัว

ไฟล์ส่วนหัว
ไฟล์ส่วนหัว

เสร็จสิ้นการเชื่อมต่อทั้งหมดหรือไม่ ดี เราจะดำเนินการกับไฟล์ส่วนหัว เราจะใช้คอมไพเลอร์ XC8 และตามที่ชื่อเรื่องแนะนำ ตอนนี้คุณจะต้องสร้างไฟล์ส่วนหัวใหม่ในโครงการของคุณและคัดลอกและวางโค้ดต่อไปนี้ คุณสามารถคัดลอกและวางไว้เหนือโค้ดหลักได้โดยไม่ต้องใช้ไฟล์ส่วนหัว

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

จำนวน int;

การสอบเทียบ intValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime(){

int timerCount = 0; int overflowCount = 0; //ความจุการคายประจุที่จะวัด RC4 = 0; _delay_ms(DISCHARGE_TIME); // หน่วงเวลาให้เพียงพอ (เกือบเต็มจริง ๆ แล้ว) ปล่อย "ตัวเก็บประจุ" // ล้างค่าสถานะโอเวอร์โฟลว์ตัวจับเวลา T0IF = 0; //รอให้ตัวจับเวลาล้น เริ่มนับจาก 0 ในขณะที่ (!T0IF); T0IF = 0; //เริ่มชาร์จความจุที่จะวัด RC4 = 1; // รอให้ความจุชาร์จถึงแรงดันอ้างอิงในขณะที่ (C1OUT) { timerCount = TMR0; ถ้า (T0IF) { overflowCount ++; T0IF = 0; } } จำนวน = (256 * overflowCount) + timerCount; // รีเซ็ต timerCount timerCount = 0; overflowCount = 0; นับกลับ; }

int isTouching (ความอดทน int) {

//ค่าเฉลี่ยของหลายตัวอย่าง สองเท่า ค่าเฉลี่ย = 0; for(int i = 0; i calibrationValue + tolerance) เฉลี่ย++; } เฉลี่ย /= TOUCH_SAMPLE; // ค่าเฉลี่ยจะเป็นตัวเลขระหว่าง 0 ถึง 1 ถ้า (เฉลี่ย > 0.2) คืนค่า 1; กลับ 0; }

สอบเทียบเป็นโมฆะ (){

ค่าเฉลี่ย int = 0; ตัวอย่าง int[CALIBRATION_SAMPLE]; // รับค่าเฉลี่ยสำหรับ (int i = 0; i < CALIBRATION_SAMPLE; i++) { sample = getChargeTime(); ค่าเฉลี่ย += ตัวอย่าง; } เฉลี่ย /= CALIBRATION_SAMPLE; ค่าสอบเทียบ = ค่าเฉลี่ย; // รับค่าสูงสุด/นาที maxCalibrationValue = ตัวอย่าง[0]; minCalibrationValue = ตัวอย่าง[0]; สำหรับ (int i = 0; i maxCalibrationValue) maxCalibrationValue = ตัวอย่าง ; if(samples < minCalibrationValue) minCalibrationValue = ตัวอย่าง; } }

เป็นโมฆะ setupCapacitiveTouch (){

//ตั้งค่าขาชาร์จ/คายประจุเป็นเอาต์พุต ในกรณีนี้คือ RC4 TRISCbits. TRISC4 = 0; //ตั้งค่าตัวจับเวลา0 T0CS = 0; PSA = 1; //การตั้งค่าตัวเปรียบเทียบ C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // หักล้างค่านับนับ = 0; //ล้างค่าสอบเทียบ calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // เรียกใช้การสอบเทียบเมื่อเริ่มต้น calibrate(); }

ขั้นตอนที่ 3: การเขียนรหัสหลัก

เริ่มต้นด้วยรหัสหลัก คุณจะต้องรวมไฟล์ส่วนหัวที่สร้างในขั้นตอนก่อนหน้า โค้ดต่อไปนี้เป็นตัวอย่างวิธีที่คุณสามารถใช้ฟังก์ชัน isTouching เป็นสวิตช์ได้ ในกรณีของฉันฉันให้ชื่อ capacitiveTouch.h กับส่วนหัว

#รวม

#include "capacitiveTouch.h"

// ตัวแปรนี้บอกว่าปุ่มนั้นถูกหรือยังไม่ได้กด

int lastState = 0;

เป็นโมฆะหลัก (){

//ตั้งค่า RC5 เป็นเอาต์พุต TRISCbits. TRISC5 = 0; // คุณต้องเรียกใช้ฟังก์ชันนี้เมื่อเริ่มต้นโปรแกรม setupCapacitiveTouch(); _delay_ms(1000); //ปรับเทียบหลังจากการตั้งค่าที่แน่นอนของคุณ calibrate(); while(1){ //ตรวจสอบว่ามีการกดปุ่มหรือไม่ if(isTouching(15) && lastState == 0){ if(RC5) RC5 = 0; อย่างอื่น RC5 = 1; LastState = 1; } //ตรวจสอบว่ามีการปล่อยปุ่มอื่นหรือไม่ if(lastState == 1 && !isTouching(15)) lastState = 0; _delay_ms(20); } }

ปรับเทียบ:

เมื่อเรียกฟังก์ชันนี้ว่าตัวแปร calibrationValue maxCalibrationValue และ minCalibrationValue จะได้รับการอัปเดต calibrationValue ถูกใช้โดยฟังก์ชัน isTouching โปรดทราบว่าควรปล่อยทัชแพดไว้ตามลำพังระหว่างการปรับเทียบ

ตั้งค่า CapacitiveTouch:

จำเป็นต้องเรียกเมื่อเริ่มต้นโปรแกรมของคุณ มันตั้งค่าบิตที่จำเป็นที่ใช้โดยฟังก์ชันอื่นๆ นอกจากนี้ยังเรียกใช้การปรับเทียบ อย่างไรก็ตาม ฉันได้ผลลัพธ์ที่ดีขึ้นโดยรอสักครู่แล้วเรียกใช้การสอบเทียบอีกครั้งแยกกัน

กำลังสัมผัส:

ฟังก์ชันนี้จะคืนค่า 1 หากตรวจพบการเพิ่มความจุใน C12IN0 และคืนค่า 0 หากความจุใกล้เคียงกับค่าที่อยู่ระหว่างการปรับเทียบ กล่าวอย่างง่าย ๆ หากมีคนแตะแผ่นอิเล็กโทรด ฟังก์ชัน isTouching จะส่งกลับ 1 ฟังก์ชันนี้ต้องการพารามิเตอร์เป็นอินพุตด้วยเช่นกัน นี่คือค่าความเผื่อที่จะทริกเกอร์ ยิ่งค่าความคลาดเคลื่อนสูงก็จะยิ่งมีความไวน้อยลง ในการตั้งค่าของฉัน ฉันพบว่า 15 ทำงานได้ดี แต่เนื่องจากสิ่งนี้ขึ้นอยู่กับความถี่ของ ocsillator และความจุที่เพิ่มขึ้นเมื่อคุณกด คุณควรทดสอบด้วยค่านี้จนกว่าคุณจะพบสิ่งที่เหมาะกับคุณ

getChargeTime:

เมื่อคุณต้องการทราบว่าต้องใช้เวลานานเท่าใดในการชาร์จความจุให้กับแรงดันไฟฟ้า CVREF ฟังก์ชันนี้จะทดสอบและคืนค่าจำนวนเต็ม ในการรับเวลาเป็นวินาที คุณใช้สูตรนี้: (4 * getChargeTime) / oscillatorFrequency = chargeTimeInSeconds สูตรนี้ยังสามารถใช้เพื่อรับอินพุตความอดทนจากฟังก์ชัน isTouching เป็นวินาที

แนะนำ: