Урок №6. Настраиваем сенсорные кнопки.

В данном уроке мы подключим 2 сенсорные копки и 2 светодиода, которые будут светится в зависимости от нажатой кнопки.

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

В качестве модуля для подключения сенсорных кнопок будем использовать модуль CSD.

Данный модуль позволяет:

  • Сканирование от 1 до 28 сенсоров.
  • Детектирование вплоть до 15-миллиметрового стеклянного покрытия
  • Детектирование приближения до 20см с использованием провода в качестве сенсора
  • Высокая устойчивость к AC-, EMC-шумам и изменениям питающего напряжения
  • Поддержка различных комбинаций независимых сенсоров и слайдеров
  • Удвоение разрешающей способности слайдеров с помощью диплексирования.
  • Поддержка панелей прикосновения (touch-pad) при применении двух слайдеров.
  • Поддержка детектирования при применении высоко-резистивных материалов (например ITO-пленки).
  • Использование защитного электрода для обеспечения стабильного функционирования даже при наличии водяной пленки или капель.
  • Интегрированный алгоритм для отслеживания изменений температуры, влажности, электростатических разрядов. 

Параметры настройки нашего модуля CSD:  

Finger Threshold. Порог срабатывания при прикосновении. Этот параметр используется для определения состояния каждого сенсора. Для не сгруппированных сенсоров (обычных кнопок, а не полос прокрутки), этот параметр является переменной, хранящейся в массиве baBtnFThreshold[], и может быть задан индивидуально для каждого сенсора при настройке. Возможные значения — от 5 до 255.
Noise Threshold. Порог шума. Для отдельных сенсоров этот параметр определяет значение, свыше которого не будет обновляться уровень baseline. Для элементов полос прокрутки этот параметр устанавливает пороговое значение результата, которое будет использовано для вычисления позиции. Возможные значения — от 5 до 255.
Debounce. Этот параметр добавляет счетчик, реализующий гистерезис активного состояния сенсора. Это необходимо для устранения возможных помех, связанных
с электростатическими разрядами. Счетчик инкрементируется при вызове функций API, возвращающих состояние сенсора. Возможные значения от 1 до 255.
BaselineUpdate Threshold. Если результат измерения оказывается свыше опорного значения, но разница между ними ниже порога шума, то при параметре Sensors
Autoreset, установленном в Disabled, эта разница аккумулируется. Если накопившееся значение превышает значение параметра BaselineUpdate Threshold, то уровень
baseline увеличивается на какое-то значение, а накопленное значение сбрасывается. Возможные значения — от 0 до 255. Большие значения означают медленное изменение уровня baseline.
NegativeNoiseThreshold. Этот параметр задает порог отрицательной разницы результата и уровня baseline, свыше которого не будет происходить обновление baseline. Однако если результат оказывается ниже baseline в течение нескольких выборок, число которых определяется параметром LowBaselineReset, то уровень baseline будет сброшен.
LowBaselineReset. Этот параметр работает совместно с NegativeNoiseThreshold и предназначен в первую очередь для того, чтобы отработать ситуацию, когда было прикосновение пальца в момент инициализации устройства и уровень baseline был вычислен неверно.
Sensors Autoreset. Этот параметр определяет, будет ли уровень baseline обновляться постоянно (Enabled) или только когда текущая разница результата и baseline ниже Noise Threshold (Disabled). В первом случае максимальное время нахождение сенсора в активном состоянии ограничивается 5–10 секундами. Рекомендуется оставлять этот параметр в состоянии Enabled, за исключением случаев, когда требуется, чтобы сенсоры долго находились в активном состоянии. 
Hysteresis. Значение этого параметра вычитается из Finger Threshold или добавляется к нему в зависимости от того, активен или неактивен сенсор в данный момент.
Возможное значение — от 0 до 255, но оно должно быть меньше, чем значение параметра Finger Threshold. Правильный выбор этих параметров позволяет эффективно скомпенсировать влияние окружающей среды (температуры, влажности), а также сигналов помех (ESD, нестабильность питания).
Scanning Speed. Этот параметр устанавливает скорость сканирования сенсоров как быструю (Fast), нормальную (Normal) и медленную (Slow). Медленная скорость
улучшает соотношение «сигнал/шум», а также в меньшей степени нагружает процессор.
Resolution. Данный параметр определяет разрядность результата в битах. Вариант схемы с тактированием от PRS16 допускает разрядность от 9 до 16 бит, остальные
варианты — только 8, 10, и 12. Увеличение разрядности увеличивает чувствительность и улучшает «сигнал/шум». Высокая разрядность используется при реализации датчика приближения. Разрядность 16 бит, медленная скорость сканирования и 20-сантиметровая проволочная антенна позволяют определить присутствие руки на расстоянии свыше 20 см.
Modulator Capacitor Pin. Параметр устанавливает контакт, к которому подключается конденсатор модулятора (Cmod).
Feedback Resistor Pin. Этот параметр задает контакт для подключения резистора Rb.
Reference. Параметр, определяющий источник опорного напряжения для компаратора в версии CSD для CY8C21x34.
Ref Value. Параметр устанавливает уровень Vref, если используется источник, допускающий выбор уровня напряжения. Значение 0 соответствует минимуму, равному 1/4 Vdd. 8 — максимуму в 3/4 Vdd. С увеличением Vref уменьшается чувствительность, но увеличивается влияние защитного электрода. Если в проекте есть сенсоры с различной емкостью, то количество отсчетов в результате может быть сбалансировано установкой большего Vref для сенсоров с большей емкостью.
Prescaler Period. Период делителя частоты в версиях с PRS8. Рекомендуемые значения равны 2n–1 для получения максимального соотношения «сигнал/шум».
PRS Polynomial. Длина полинома PRS в версии PRS8. Короткая (Short) дает лучшее отношение «сигнал/шум», но устройство может быть более чувствительно
к внешним помехам. Длинная (Long) ухудшает отношение «сигнал/шум», но устройство более устойчиво к внешним помехам.
ShieldElectrodeOut. Задает выходную цифровую шину, которая будет использоваться для подключения защитного электрода.
 
Для подключения наших ножек к сенсорным кнопкам используем CSD Wizart, где перетаскиваем нужную ножку на выбранный сенсор:
 
а так же настраиваем наш модуль:
 
FingerThreshold = 40
NoiseThreshold = 20
BaselineUpdateThreshold = 200
Sensor Autoreset = Enabled
Hysteresis = 10
Debounse = 3
NegativeNoiseThreshold = 20
LowBaselineReset = 50
Scannning Speed = Fast
Resolution = 9
Ref Value = 2
 
Рекомендации по изготовлении сенсорных кнопок можно посмотреть здесь.
 
Наша программа:
 

#include   // part specific constants and macros
#include «PSoCAPI.h» // PSoC API definitions for all User Modules

BYTE btn=3;

void main(void)
{
M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
// Insert your main routine code here.

LED1_Start();LED2_Start();

CSD_Start();
CSD_InitializeBaselines();
CSD_SetDefaultFingerThresholds();

while (1)
{
CSD_ScanAllSensors(); // сканируем наши сенсоры
CSD_UpdateAllBaselines(); // обновляем данные

if (CSD_bIsAnySensorActive()) //если нажат любой сенсор
{
if (CSD_bIsSensorActive(0)){btn=0;} // нажат 0 сенсор
else if (CSD_bIsSensorActive(1)){btn=1;}// нажат 1 сенсор
}

do { CSD_ScanAllSensors(); CSD_UpdateAllBaselines();} while (CSD_bIsAnySensorActive()); // ждем пока отожмут сенсор

switch(btn) // действие в зависимости от нажатого сенсора
{
case 0: LED1_On();LED2_Off();break;
case 1: LED1_Off();LED2_On();break;
default: LED1_Off();LED2_Off();break;
}

}
}