Ёмкостный датчик касаний без внешней обвязки на STM32 Discovery


В начале этого года достойный гражданин Ariman написал статью о том, как прикрутить к микроконтроллеру ёмкостный сенсор прикосновения. Эта идея показалась мне довольно перспективной, некоторым приборам сенсорные клавиши подошли бы куда лучше механических. В этой статье я расскажу о своей реализации этой полезной технологии на основе отладочной платы STM32 Discovery.

Итак, только начав осваивать STM32, я решил в качестве упражнения добавить устройству способность определять прикосновения. Начав разбираться с теорией и практикой по вышеупомянутой статье, я повторил схему товарища Ariman'a. Она работала идеально, но мне, любителю минимализма, захотелось её упростить, избавившись от лишних элементов. Лишними на мой взгляд оказались внешний резистор и дорожка к питанию. Всё это уже есть в большинстве микроконтроллеров, в том числе в AVR и в STM32. Я имею в виду подтягивающие резисторы портов ввода/вывода. Почему бы не заряжать пластинку и наши пальцы через них? В ожидании подвоха я собрал на макетке схему, которая, к моему удивлению, заработала с первого же раза. Собственно говоря, схемой это называть даже смешно, ведь всё что нам нужно — это просто подсоединить контактную пластинку к ножке отладочной платы. Всю работу на себя возьмёт микроконтроллер.

Что же из себя представляет программа? Во первых две функции:
Первая выводит на ножку сенсора (нулевой пин регистра C) логический «0»

void Sensor_Ground (void)
{
	GPIOC->CRL = 0x1;
	GPIOC->BRR |= 0x1;
}


Вторая настраивает тот же вывод на вход, с подтяжкой к питанию.

void Sensor_InPullUp (void)
{
	GPIOC->CRL = 0x8;
	GPIOC->BSRR |= 0x1;
}


Теперь в начале цикла опроса вызовем Sensor_Ground(), и подождём некоторое время чтобы разрядить на землю весь остаточный заряд на сенсоре. Затем обнулим переменную count, которой будем считать время зарядки сенсора и вызовем Sensor_InPullUp().

Sensor_Ground();
Delay(0xFF);    //простой пустой счётчик
count = 0;
Sensor_InPullUp();


Теперь сенсор начинает заряжаться через внутренний подтягивающий резистор номиналом порядка десятков КОм (30..50КОм у STM32). Постоянная времени такой цепи будет равняться считанным тактам, поэтому я поменял кварцевый резонатор на отладочной плате на более быстрый, 20МГц (кстати, я не сразу заметил, что оказывается на STM32 Discovery кварц меняется без пайки). Итак считаем такты процессора, пока на входе не появится логическая единица:

while(!(GPIOC->IDR & 0x1))
    	{
    		count++;
    	}


После выхода из этого цикла в переменной count будет храниться число, пропорциональное ёмкости сенсорной пластинки. В моём случае с чипом на 20МГц значение count равняется 1 при отсутствии нажатия, 7-10 при самом лёгком касании, 15-20 при нормальном прикосновении. Остаётся лишь сравнить её с пороговым значением и не забыть снова вызвать Sensor_Ground(), чтобы к следующему циклу опроса сенсор уже был разряжен.
Полученной чувствительности хватает для уверенного определения прикосновений к голым металлическим площадкам. При прикрытии сенсора листом бумаги или пластика чувствительность падает в три — четыре раза, хорошо определяются только уверенные нажатия. Чтобы увеличить чувствительность в случае, когда сенсор необходимо прикрыть защитным материалом, можно повысить тактовую частоту микроконтроллера. С чипом серии STM32F103, способном работать на частотах до 72МГц, помехой не будут и миллиметровые преграды между пальцем и сенсором.
По сравнению с реализацией Ariman'a, мой подход работает гораздо быстрее (порядка десятка тактов на опрос одного сенсора), поэтому я не стал усложнять программу, настраивая прерывания по таймеру.

Напоследок видео с демонстрацией работы сенсора.


Main.c тестовой программы.

Reference Manual на микроконтроллер

Cпасибо пользователю ALPINE63rus за очень полезную статью ARM-микроконтроллеры STM32F. Быстрый старт c STM32-Discovery, пользователю Ariman за идею и доходчивое теоретическое описание.

UPD. После комментариев ew1abz'a я решил разобраться с тактированием и обнаружил, что по умолчанию STM32 Discovery настроен на тактовую частоту
(HSE / 2) * 6 = 24 MHz, где HSE — частота внешнего кварца. Соответственно поменяв кварц с 8 на 20 МГц, я заставил бедную STM'ку работать на 60 МГц. Так что во-первых, некоторые из выводов очевидно не совсем верны, во-вторых то чем я занимался может привести к сбоям чипа. На случай таких сбоев в микроконтроллере есть HardFault прерывание, воспользовавшись им, я проверил более высокие частоты. Так вот, сбоить чип начинает только на 70 МГц. Но хотя эту конкретную программу контроллер переваривает на 60МГц, при использовании периферии или работе с Flash памятью он может повести себя непредсказуемо. Вывод: относитесь к данному топику как к эксперименту, повторяйте только на свой страх и риск.

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 20

    +2
    Всё хорошо, только если предположить что кнопконажиматель может являться потенциальным носителем некоторого статического потенциала, который будет весело разряжаться на сенсор и тем может вызвать повреждения ключей осуществляющих подтяжку ноги, как миниму, и мало ли чего ещё по соседству. Напряжение то большое, расстояния маленькие, ну вы меня понимаете…

    ИМХО за резюк вне корпуса микроконтроллера, жаба разработчика совсем не задушит, тем более что за здоровье МК она будет спокойна.
    • UFO just landed and posted this here
        0
        И проиграть таки, без того не фонтан, чувствительность :-)
        • UFO just landed and posted this here
            0
            Ээто он через бумажку ловит, а через нормальный диэлектрик, лбом с разбегу не почувствует :-)
            • UFO just landed and posted this here
        0
        Да, согласен. Не подумал об этом совсем. В защиту статьи скажу лишь, что судя по даташиту, микросхемки прошли довольно варварское тестирование JESD22-A114 на 2й класс защищённости (т.е. выдерживает разряд в 2000 В между каждыми ножками), так что вероятность что «пронесёт» достаточно велика.
          0
          В быту зимой, обычно 3-6 киловольт статики, бывает и больше, если рядом какая нибудь синтетика.
          Так, что как раз хватит, а внешний резистор, вполне обезопасил.
        +3
        если площадку замкнуть на массу, то цикл получится вечным.
          +4
          Друг на дешёвом контроллере делал управление светодиодом через ёмкостной датчик так, чтобы светодиод вёл себя как свеча:
          we.easyelectronics.ru/msp430/touch-candle.html
            +1
            Кварц можно было не менять. У STM32 есть встроенный PLL. По вашему исходнику совершенно не видно на какой частоте и от какого генератора (встроенного или внешнего) работает контроллер. Есть смысл выложить проект полностью.
              0
              Да, действительно, есть возможность разогнать встроенный генератор до 24МГц. Я правда ещё не разобрался с тактированием, так что всё осталось настроенным по умолчанию (внешний кварц, если не заводится, то внутренний генератор, без фазовой подстройки).
                0
                Разобрался. Оказалось по умолчанию PLL было включено, давая 24МГц из кварца на 8МГц. Соответственно с 20МГц кварцем получился hardcore overclocking. В следующий раз постараюсь не упускать таких вещей.
                0
                оформите код в тег
                 ... 

                будет лучше восприниматься
                  0
                  блин, тег схавало в комментарии.
                  (source lang=«язык»)...(/source)
                  вместо круглых скобок() поставьте знаки <>
                    0
                    Готово, спасибо
                  –3
                  UPD: больше, больше болда!!!
                  А ЕЩЁ МОЖЕТЕ ВОТ ТАК ПоПРобОВаТь — Говорят, «И ЗРАЗУ ПОМОГАЕ»!
                    0
                    Отличный академический пример, но… ИМХО, использовать микроконтроллер в качестве выключателя, — это как использовать микроскоп в качестве подпорки корыта, из которого кормят свиней.
                      0
                      В следующем эксперименте микроскоп из под корыта вытащу, отряхну и пойду блошек в него рассматривать. Всё это ради площадки с линейкой сенсоров, воспринимающих свайпы и прочий одномерный мультитач.
                        0
                        Это же академический пример. Для него такое применение более чем уместно.

                      Only users with full accounts can post comments. Log in, please.