Mục lục:

Cảm ứng điện dung với vi điều khiển PIC16F886: 3 bước
Cảm ứng điện dung với vi điều khiển PIC16F886: 3 bước

Video: Cảm ứng điện dung với vi điều khiển PIC16F886: 3 bước

Video: Cảm ứng điện dung với vi điều khiển PIC16F886: 3 bước
Video: Mạch đếm sử dụng vi điều khiển PIC16F886 2024, Tháng bảy
Anonim
Cảm ứng điện dung với vi điều khiển PIC16F886
Cảm ứng điện dung với vi điều khiển PIC16F886

Trong hướng dẫn này, chúng ta sẽ xem xét cách bạn có thể sử dụng vi điều khiển PIC16F886 để phát hiện sự khác biệt về điện dung, điều này sau này có thể được sử dụng để biết liệu touch pad có đang được nhấn hay không. Thật tốt khi làm quen với vi điều khiển pic trước khi thực hiện dự án này.

Bước 1: Nối dây mạch của bạn

Lên dây cho mạch của bạn
Lên dây cho mạch của bạn

Đầu tiên, chúng ta hãy bắt đầu bằng cách đấu dây mạch theo sơ đồ trên. Để làm bàn phím cảm ứng, bạn có thể gấp lá nhôm thành hình vuông và dán trên dây. Bạn có thể thử nghiệm xung quanh với các giá trị khác nhau cho điện trở 100k, tôi thấy 100k hoạt động tốt đối với tôi.

Chân RC4 được sử dụng để bắt đầu sạc / xả điện dung cần đo. C12IN0 được kết nối với mặt - của một bộ so sánh bên trong và chân C1IN được kết nối với mặt + của cùng một bộ so sánh. Bộ vi điều khiển coi điện dung được sạc đầy khi điện áp C12IN0 đạt trên điện áp C1IN. Bộ phân áp điện trở đảm bảo C1IN gần 5 volt.

Vì bàn phím cảm ứng phụ thuộc vào việc có một điện dung đáng kể giữa bạn và mặt đất mạch điện nên có khả năng pin không hoạt động.

Bước 2: Tệp tiêu đề

Tệp tiêu đề
Tệp tiêu đề

Đã kết thúc với tất cả các kết nối? Tốt, chúng tôi sẽ tiếp tục với tệp tiêu đề. Chúng tôi sẽ sử dụng trình biên dịch XC8 và như tiêu đề cho thấy bây giờ bạn sẽ tạo một tệp tiêu đề mới trong dự án của mình và sao chép-dán đoạn mã sau. Bạn cũng có thể sao chép và dán nó lên trên mã chính của mình mà không cần bất kỳ tệp tiêu đề nào.

#define CALIBRATION_SAMPLE 20 # xác định TOUCH_SAMPLE 10 #define DISCHARGE_TIME 5

số int;

int calibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int trànCount = 0; // phóng điện dung cần đo RC4 = 0; _delay_ms (DISCHARGE_TIME); // cung cấp đủ độ trễ để hoàn toàn (gần như hoàn toàn thực sự) xả "tụ điện" // xóa cờ tràn bộ định thời T0IF = 0; // đợi bộ đếm thời gian tràn, bắt đầu đếm từ 0 while (! t0IF); T0IF = 0; // bắt đầu sạc điện dung cần đo RC4 = 1; // đợi điện dung nạp đến điện áp giới thiệu while (C1OUT) {timerCount = TMR0; if (T0IF) {trànCount ++; T0IF = 0; }} count = (256 * trànCount) + timerCount; // đặt lại timerCount timerCount = 0; trànCount = 0; số lần trả lại; }

int isTouching (int dung sai) {

// trung bình của nhiều mẫu double average = 0; for (int i = 0; i calibrationValue +rance) trung bình ++; } trung bình / = TOUCH_SAMPLE; // trung bình sẽ là một số từ 0 đến 1 nếu (trung bình> 0,2) return 1; trả về 0; }

void hiệu chỉnh () {

int trung bình = 0; int mẫu [CALIBRATION_SAMPLE]; // lấy giá trị trung bình for (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); trung bình + = mẫu ; } trung bình / = CALIBRATION_SAMPLE; calibrationValue = trung bình; // lấy giá trị max / min maxCalibrationValue = samples [0]; minCalibrationValue = mẫu [0]; for (int i = 0; i maxCalibrationValue) maxCalibrationValue = mẫu ; if (samples <minCalibrationValue) minCalibrationValue = samples ; }}

void setupCapacitiveTouch () {

// thiết lập chân sạc / xả làm đầu ra, trong trường hợp này là RC4 TRISCbits. TRISC4 = 0; // thiết lập timer0 T0CS = 0; PSA = 1; // thiết lập bộ so sánh C1CH0 = 0; C1CH1 = 0; C1R = 0; C1ON = 1; C1POL = 0; // xóa các giá trị đếm count = 0; // xóa các giá trị hiệu chuẩn calibrationValue = 0; maxCalibrationValue = 0; minCalibrationValue = 0; // chạy hiệu chuẩn khi bắt đầu hiệu chỉnh (); }

Bước 3: Viết mã chính

Bắt đầu với mã chính, bạn sẽ cần bao gồm tệp tiêu đề đã tạo ở bước trước. Đoạn mã sau là một ví dụ về cách bạn có thể sử dụng hàm isTouching như một công tắc. Trong trường hợp của tôi, tôi đã đặt tên cho tiêu đề là CapitiveTouch.h.

#bao gồm

#include "CapitiveTouch.h"

// biến này cho biết nút đã được nhấn hay chưa

int lastState = 0;

void main () {

// thiết lập RC5 làm đầu ra TRISCbits. TRISC5 = 0; // bạn cần gọi hàm này khi khởi động chương trình setupCapacitiveTouch (); _delay_ms (1000); // hiệu chỉnh sau khi thiết lập chính xác của bạn calibrate (); while (1) {// kiểm tra xem nút có được nhấn không if (isTouching (15) && lastState == 0) {if (RC5) RC5 = 0; khác RC5 = 1; lastState = 1; } // kiểm tra xem nút có được phát hành không if (lastState == 1 &&! isTouching (15)) lastState = 0; _delay_ms (20); }}

hiệu chỉnh:

Khi hàm này được gọi là các biến calibrationValue, maxCalibrationValue và minCalibrationValue sẽ được cập nhật. Calue được sử dụng bởi chức năng isTouching. Hãy nhớ rằng bàn di chuột phải được để yên trong quá trình hiệu chuẩn.

setupCapacitiveTouch:

Cần được gọi trong phần đầu của chương trình của bạn. Nó thiết lập các bit cần thiết được sử dụng bởi các chức năng khác. Nó cũng chạy một callibration. Tuy nhiên, tôi đã nhận được kết quả tốt hơn bằng cách chờ một giây và chạy hiệu chuẩn lại riêng lẻ.

isTouching:

Hàm này trả về 1 nếu nó phát hiện thấy sự gia tăng điện dung trên C12IN0 và trả về 0 nếu điện dung gần với điện dung trong quá trình hiệu chuẩn. Nói một cách đơn giản, nếu ai đó chạm vào pad, hàm isTouching sẽ trả về 1. Hàm cũng muốn một tham số làm đầu vào, đây là dung sai để nó kích hoạt. Giá trị dung sai càng cao thì độ nhạy càng kém. Trong thiết lập của tôi, tôi thấy 15 hoạt động tốt, nhưng vì điều này phụ thuộc vào tần số ocsillator và bao nhiêu điện dung được thêm vào khi bạn nhấn nó, bạn nên thử nghiệm xung quanh giá trị này cho đến khi bạn tìm thấy thứ gì đó phù hợp với mình.

getChargeTime:

Khi bạn muốn biết mất bao lâu để sạc điện dung đến điện áp CVREF, hàm này sẽ kiểm tra nó và trả về một số nguyên. Để tính thời gian tính bằng giây, bạn sử dụng công thức sau: (4 * getChargeTime) / OscillatorFrequency = chargeTimeInSeconds Công thức này cũng có thể được sử dụng để lấy đầu vào dung sai từ hàm isTouching thành giây.

Đề xuất: