Как работает резистивный сенсорный экран на примере контроллера XPT2046.

Как работает резистивный сенсорный экран на примере контроллера XPT2046.

Как известно, на сегодняшний день сенсорные экраны делятся на 2 вида, резистивные и ёмкостные. Главное их отличие для пользователя состоит в том, что резистивный экраны чувствителен к нажатию, а ёмкостной к касанию. Давайте рассмотрим как устроен каждый из них.
Резистивный экран представляет собой стеклянный жидкокристаллический дисплей, на который наложена гибкая мембрана. На соприкасающиеся стороны нанесён резистивный слой, а пространство между плоскостями разделено диэлектриком. По краям пластин закреплены электроды. При нажатии экран и мембрана соприкасаются в точке касания и, таким образом создаётся обычный делитель напряжения. Напряжение с нижнего плеча делителя поступает на АЦП, которое, в свою очередь, преобразует его в координату. Теперь становится понятно почему такой экран реагирует именно на нажатие и то что на него можно нажимать любым твёрдым предметом: стилусом, карандашом.
Как работает резистивный сенсорный экран на примере контроллера XPT2046.

Резистивные сенсорные экраны обладают:
  • высокой прочностью;
  • небольшой стоимостью;

Ёмкостный сенсорный экран представляет собой стеклянную панель, на которую нанесён слой прозрачного резистивного материала. В каждом углу панели установлен электрод, который подаёт на слой переменное напряжение. Таким образом, при касании пальцем, так как тело человека обладает некоторой ёмкостью, происходит утечка заряда с панели. Величина утечки зависит от расстояния точки касания до электродов в углах экрана, таким образом, можно определить точку касания.
Как работает резистивный сенсорный экран на примере контроллера XPT2046.

Емкостные сенсорные экраны обладают:
  • низкой прочностью, так как в них применяется стекло;
  • высокой стоимостью;

Последний фактор и определяет почему в модуле с TFT дисплеем, заказанным мной на али стоит резистивный экран.
И ещё, на резистивном и простом ёмкостном экране, нельзя организовать мультитач, это возможно сделать на проекционно-ёмкостном дисплее, в котором на обратную сторону экрана нанесена сетка электродов.
Как работает резистивный сенсорный экран на примере контроллера XPT2046.

Давайте теперь перейдём к контроллеру XPT2046. Для начала рассмотрим какие выводы контроллера производитель вывел на колодку.

Выводы управления Touch Screen контроллером:
T_CS (Chip Select) – активация/дезактивация Touch контроллера.
T_CLK (Clock) – линия тактирования.
T_DIN (Data Input) – линия ввода команд.
T_DO (Data Output) – линия вывода данных.
T_IRQ (Interrupt Flag) – линия запроса прерывания (Interrupt request line).

Из названия выводов становится понятно, что контроллер управляется по SPI, плюс вывод запроса на прерывание. При касании дисплея на этом выводе появляется логический ноль. Важно отметить, что максимальная тактовая частота SPI на которой может работать XPT 2046 не должна превышать 2 MHz, при этом частота выборок АЦП будет равна 125 KHz.
Теперь давайте разберёмся как нам получить координаты точки касания, на самом деле с помощью XPT2046 можно получить не только координаты, а также давление нажатия, температуру, напряжения питания, но мы будем разбираться только с координатами. Ещё необходимо сказать, что физический АЦП в XPT2046 всего один, а измерения всех выше перечисленных величин производятся с помощью мультиплексора.
Сначала мы должны включить АЦП.
Формат посылки для XPT2046 выглядит следующим.
Как работает резистивный сенсорный экран на примере контроллера XPT2046.

PD1 - PD0 отвечают за режимы энергопотребления и за подключение опорного напряжения. Мы хотим включить АЦП, при этом измерения производить в режиме дифференциального входа, поэтому выбираем режим, отмеченный на картинке ниже.
Как работает резистивный сенсорный экран на примере контроллера XPT2046.

SER/DFR определяет тип входа АЦП, несимметричный или дифференциальный. Нам нужен дифференциальный поэтому устанавливаем ноль.
MODE определяет разрядность следующего преобразования 8 или 12 бит, давайте порассуждаем, так как по оси Y у TFT дисплея 320 точек, то разрядность 8 бит, с помощью которой можно получить координаты точек от 0 до 255 нам не подойдёт. Выставляем MODE равным нулю.
A2-A0 отвечают за настройку мультиплексора, подключение touch драйвера и источника опорного напряжения, но так как мы хотим только включить АЦП, то шлём нули.
Как работает резистивный сенсорный экран на примере контроллера XPT2046.

S – стартовый бит, указывающий на начало управляющего байта. Контроллер реагирует на посылку только когда установлен стартовый бит, поэтому устанавливаем его в единицу.
Давайте подведём итоги, нам надо послать контроллеру число 0х80, в ответ он отправит нам два байта, содержимое которых нас не интересует. Проделав эту операцию, мы имеем полное право полагать, что АЦП запустилось и мы можем получать данные. Так как SPI синхронный интерфейс, то для того чтобы контроллер отправил нам ответ, мы должны послать ещё 0х00, лучше два раза, потому что не известно какой разрядности будет преобразование и сколько бит он нам пошлёт в ответ.
SPI у нас будет аппаратный, потом, может, переделаем на программный, когда будем подключать SD карточку потому, что она то же подключается по SPI.
Ниже приведен код для отправки байта по SPI

uint8_t Spi_Master_Transmit(uint8_t out_data)
{
      // Начало передачи
     SPDR = out_data;
      // Ожидание окончания передачи
      while(!(SPSR & (1<<SPIF))) ;
      return SPDR; //возвращаем принятый байт
}

Для инициализации SPI нам понадобятся 4 регистра:
SPE – включает/выключает модуль SPI. Если бит установлен в 1, модуль SPI включен.
MTSR – определяет режим работы микроконтроллера. Если бит установлен в 1, микроконтроллер работает в режиме Master (ведущий). Если бит сброшен – в режиме Slave (ведомый).
SPR1 и SPR0 – определяют частоту тактового сигнала SPI модуля.
Как работает резистивный сенсорный экран на примере контроллера XPT2046.

Коэффициент деления устанавливаем максимальный, чтобы избежать ошибок из-за слишком высокой скорости обмена, потом можно будет поменять. Код инициализации XPT2046 для Atmega16 в режиме мастера выглядит следующим образом.

        SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);
        Spi_Master_Transmit(0X80);
	Spi_Master_Transmit(0X00);
	Spi_Master_Transmit(0X00);

На этом все, в следующей статье мы рассмотрим как получить координаты точки касания и откалибровать сенсорную панель.
комментарии
4