Ємнісний сенсор на мікроконтролерах avr і затримка ітераціями

Вітаю, любитель мікроконтролерів!

вступ
Я продовжую втілювати в життя свій перший, колись занедбаний, проект на мікроконтролері - лампу настрою. І, як і обіцяв минулого разу, по ходу розробки пишу невеликі замітки для початківців. Цього разу розглянемо як реалізується ємнісний сенсор і затримки тих чи інших операцій ітераціями основного циклу. Що стосується самого проекту, можу сказати, що на даний момент написана повністю робоча прошивка. Залишається справа за схемою, печаткою та тестуванням в нормальному залозі. Потім викладу все на ваш суд.

сенсорна кнопка
Принцип сенсорної кнопки простий. Беремо невелику майданчик не важливо якої форми, я взяв шматок фольгованого текстоліту (далі - кнопка). Підпоюємо до неї резистор великого номіналу, близько 1 МОм. І підключаємо кнопку через цей резистор до харчування. Підпоюємо до кнопки провід, який з'єднає кнопку з ніжкою мікроконтролера (далі - МК). Майданчик ізолюємо тонким ізолятором, хоча і без нього буде працювати. Майданчик кнопки має певну ємність, яка збільшується, коли на ній знаходиться палець людини.

Сенсорна кнопка. Зверху покрита скотчем

Алгоритм роботи наступний:
1. Переводимо ногу МК в режим виходу.
2. Подаємо низький рівень, щоб розрядити ємність кнопки.
3. Переводимо ногу МК в режим входу і чекаємо коли ємність кнопки зарядиться через резистор 1 МОм і на вході з'явиться верхній рівень. Очікування проводиться в циклі, в якому инкрементируется лічильник.
4. Сенсор зарядився - за значенням лічильника можна судити про стан сенсора.

Зверніть увагу, що підрахунок ітерацій йде в атомарному блоці. Це означає, що в цей час не будуть спрацьовувати переривання і не зіб'ють нас час заряду сенсора.

Тепер для використання нашого алгоритму нам необхідно визначити поріг спрацьовування кнопки. Для цього при ініціалізації ми виконуємо калібрування. І беремо в якості порогового - значення на чверть більше, ніж повертається при вільному сенсорі.

Я перевіряв, на порожньому сенсорі функція у мене повертає стабільно 15. А коли кладеш на сенсор палець - близько 30. Значить поріг у нас буде десь 15 + 15/4 = 18.

Ну а далі, в основному циклі програми нам залишається перевіряти стан сенсора і порівнювати його з граничним значенням. Якщо перевищило - кнопку натиснуто, потрібно відреагувати.

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

Я, в перебігу декількох днів, користувався кнопкою, поки налагоджував прошивку для лампи - сенсор спрацьовує чітко!

Затримка ітераціями основного циклу
Іноді в основному циклі потрібно періодично проводити якісь дії з великою затримкою. Скажімо 2 секунди. Однак, просто "спати" при цьому не можна, тому що можна прогавити, скажімо, натискання на сенсорну кнопку або інша подія. В цьому випадку є простий вихід. Беремо лічильник, виставляємо його в деяке значення і кожну ітерацію основного циклу декрементіруем. Як тільки лічильник став дорівнює нулю - наша затримка минула і настав час для нашого дії. В основному циклі можна додати мінімальну затримку, яка зробить поява очікуваного події критичним.

Таким чином, за допомогою лічильників легко організувати різні затримки в основному циклі програми, які не проґавивши при цьому критичних подій і не витрачаючи дорогоцінні байти на дорогі функції delay.

результат
Щоб розбавити сухий текст, я хочу показати результат сьогоднішнього уроку наочно. Оскільки я роблю лампу настрою, то я використовував RGB-світлодіод. В основному циклі будемо міняти 7 кольорів веселки + рожевий по колу. А при натисканні на сенсорну кнопку будемо просто моргати білим кольором. Мікроконтролер буде працювати на частоті 9.6 МГц, для цього достатньо від фьюз за замовчуванням прибрати дільник на 8 (зробити CKDIV8 = 1). Фьюз байти зручно розраховувати ось цим калькулятором.

Затримка між змінами квітів реалізована циклами. Регулювання яскравості світлодіода реалізована за допомогою бінарної модуляції, про яку і докладно писав минулого разу.

Схема для модуляції в протеус вийшла трохи відрізняється від реальної картини: довелося реалізувати ємнісний сенсор на двох конденсаторах і перемикачі. Харчування 5В для МК на схемі відсутній, але воно необхідне!