Оглавление:

Емкостное касание с микроконтроллером PIC16F886: 3 шага
Емкостное касание с микроконтроллером PIC16F886: 3 шага

Видео: Емкостное касание с микроконтроллером PIC16F886: 3 шага

Видео: Емкостное касание с микроконтроллером PIC16F886: 3 шага
Видео: ttp223 сенсорная кнопка. Обзор, подключение, применение. 2024, Сентябрь
Anonim
Емкостный сенсорный экран с микроконтроллером PIC16F886
Емкостный сенсорный экран с микроконтроллером PIC16F886

В этом уроке мы рассмотрим, как вы можете использовать микроконтроллер PIC16F886 для обнаружения различий в емкости, позже это можно будет использовать для определения нажатия на сенсорную панель. Перед созданием этого проекта хорошо ознакомиться с микроконтроллерами pic.

Шаг 1: Подключите вашу схему

Подключите вашу схему
Подключите вашу схему

Во-первых, давайте начнем с подключения схемы в соответствии со схемой выше. Чтобы сделать тачпад, вы можете сложить алюминиевую фольгу в квадрат и закрепить лентой на проводе. Вы можете поэкспериментировать с разными значениями резистора 100 кОм, я обнаружил, что 100 кОм мне подходит.

Вывод RC4 используется для начала зарядки / разрядки измеряемой емкости. C12IN0 подключается к отрицательной стороне внутреннего компаратора, а вывод C1IN подключается к положительной стороне того же компаратора. Микроконтроллер считает емкость полностью заряженной, когда напряжение C12IN0 превышает напряжение C1IN. Резистивный делитель напряжения обеспечивает напряжение C1IN близким к 5 вольт.

Поскольку сенсорная панель зависит от наличия значительной емкости между вами и заземлением цепи, существует вероятность того, что аккумулятор может не работать.

Шаг 2: Заголовочный файл

Заголовочный файл
Заголовочный файл

Закончили со всеми подключениями? Хорошо, приступим к заголовочному файлу. Мы будем использовать компилятор XC8, и, как следует из названия, теперь вы должны создать новый файл заголовка в своем проекте и скопировать и вставить следующий код. Вы можете просто скопировать и вставить его поверх основного кода без какого-либо файла заголовка.

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

int count;

int CalibrationValue, maxCalibrationValue, minCalibrationValue;

int getChargeTime () {

int timerCount = 0; int overflowCount = 0; // измеряемая разрядная емкость RC4 = 0; _delay_ms (DISCHARGE_TIME); // даем достаточно задержки для полного (почти полного) разряда «конденсатора» // сбросить флаг переполнения таймера T0IF = 0; // ждем переполнения таймера, начинаем отсчет с 0 while (! T0IF); T0IF = 0; // запускаем зарядку измеряемой емкости RC4 = 1; // ждем пока емкость зарядится до эталонного напряжения while (C1OUT) {timerCount = TMR0; если (T0IF) {overflowCount ++; T0IF = 0; }} count = (256 * overflowCount) + timerCount; // сбросить timerCount timerCount = 0; overflowCount = 0; счетчик возврата; }

int isTouching (int толерантность) {

// среднее из нескольких выборок double average = 0; for (int i = 0; i калибровочное значение + допуск) среднее ++; } средний / = TOUCH_SAMPLE; // среднее значение будет числом от 0 до 1, если (среднее> 0,2) return 1; возврат 0; }

void calibrate () {

int среднее = 0; int образцы [CALIBRATION_SAMPLE]; // получить среднее значение для (int i = 0; i <CALIBRATION_SAMPLE; i ++) {samples = getChargeTime (); среднее + = образцы ; } средний / = CALIBRATION_SAMPLE; CalibrationValue = среднее значение; // получение макс. / мин. значений maxCalibrationValue = samples [0]; minCalibrationValue = образцы [0]; для (int i = 0; i maxCalibrationValue) maxCalibrationValue = samples ; if (samples <minCalibrationValue) minCalibrationValue = samples ; }}

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; // запускаем калибровку при запуске calibrate (); }

Шаг 3: написание основного кода

Начиная с основного кода, вам необходимо включить файл заголовка, созданный на предыдущем шаге. Следующий код является примером того, как вы можете использовать функцию isTouching в качестве переключателя. В моем случае я дал заголовку имя CapacitiveTouch.h.

#включают

#include "capacityTouch.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; } // проверка отпускания кнопки else if (lastState == 1 &&! isTouching (15)) lastState = 0; _delay_ms (20); }}

откалибровать:

Когда эта функция вызывается, переменные CalibrationValue, maxCalibrationValue и minCalibrationValue будут обновлены. CalibrationValue используется функцией isTouching. Помните, что во время калибровки сенсорную панель следует оставить в покое.

setupCapacitiveTouch:

Должен быть вызван в начале вашей программы. Он устанавливает необходимые биты, используемые другими функциями. Также выполняется калибровка. Однако я получил лучшие результаты, если подождал секунду и снова запустил калибровку отдельно.

isTouching:

Эта функция возвращает 1, если она обнаруживает увеличение емкости на C12IN0, и возвращает 0, если емкость близка к той, которая была во время калибровки. Проще говоря, если кто-то коснется пэда, функция isTouching вернет 1. Функция также хочет параметр в качестве входа, это допуск для его срабатывания. Чем выше значение допуска, тем менее чувствительным он становится. В моей настройке я обнаружил, что 15 работает хорошо, но поскольку это зависит от частоты осциллятора и от того, сколько емкости добавляется при нажатии на него, вам следует поэкспериментировать с этим значением, пока не найдете то, что работает для вас.

getChargeTime:

Если вы хотите узнать, сколько времени потребуется, чтобы зарядить емкость до напряжения CVREF, эта функция проверит его и вернет целое число. Чтобы получить время в секундах, используйте эту формулу: (4 * getChargeTime) / осцилляторFrequency = chargeTimeInSeconds. Эту формулу также можно использовать для получения ввода допуска от функции isTouching в секундах.

Рекомендуемые: