Реклама ⓘ
Главная » Микроконтроллеры
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Реклама ⓘ

Универсальная основа для контроллера с графическим интерфейсом на ATmega8 c OLED дисплеем

В статье рассмотрены следующие вопросы:

  1. последовательная передача данных посредством интерфейса TWI (I2C) и аппаратная реализация этой технологии в микроконтроллерах (МК) AVR;
  2. программа для поиска адреса устройства, подключённого к шине I2C;
  3. подключение, настройка и применение OLED дисплея с разрешением 128*64 пикселей и со встроенным драйвером SSD1306;
  4. работа аппаратной ШИМ AVR в режиме Normal;
  5. схема безопасной коммутации микроконтроллера и мощной нагрузки;

Последовательная передача данных посредством интерфейса I2C (TWI) и аппаратная реализация этой технологии в МК AVR.

Последовательные интерфейсы позволяют значительно экономить выводы МК, место на печатной плате и количество проводов. Так, например, подключение дисплея в данном проекте осуществляется посредством интерфейса TWI (он же I2C), который подразумевает всего два контакта. При этом схемотехническая простота сильно замедляет передачу данных, ведь за такт может быть передан максимум один бит информации, которую надо ещё и подготовить, что так же усложняет алгоритм работы МК.

I2C имеет следующие отличительные особенности:

  1. возможность объединять до 127 устройств на одной шине (практически это величина гораздо ниже из-за особенностей распространения сигнала, но всё равно этого более, чем достаточно);
  2. подтверждение приёма сигнала в виде бита ACK/NACK, что открывает дополнительные возможности, которые будут рассмотрены ниже;
  3. отсутствие аппаратной привязки к тому, кто на шине ведущий, а кто ведомый – в любой момент всё можно переопределить.

Работа этого интерфейса подробно освещена во всевозможных литературных источниках и видеоматериалах, но отдельные моменты всё же стоит оговорить. Особенности начинаются с того, что в МК AVR все события, происходящие с аппаратным I2C, сопровождаются всего одним(!) прерыванием. Этого мало, но так решили проектировщики AVR. Нам же остаётся создавать switch, в котором следует подробно описывать, что означают конкретные состояния статусного регистра, ведь от этого зависит, куда по прерыванию направится программа. В целом же передача по I2C сводится к действиям, указанным на рис. 1:

Рисунок 1 - Работа с шиной I2C

Рисунок 1 - Работа с шиной I2C

  1. определить скорость передачи в процессе инициализации. Так же можно (но не обязательно) определить и адрес нашего МК, если в будущем предполагается работа рабом (slave);
  2. сделать СТАРТ;
  3. отправить байт, где старшие 7 бит – уникальный адрес устройства, который можно узнать из datasheet’а или определить перебором, а младший бит – указание на запись(0) или чтение(1);
  4. подождать подтверждение того, что устройство с таким адресом есть на шине и оно готово к взаимодействию (оно ответит низким уровнем на линии SDA, т.е. битом ACK);
  5. теперь можно посылать или требовать любую информацию;
  6. сделать СТОП.

Если адрес устройства неизвестен, то можно найти его последовательным перебором всевозможных значений до тех пор, пока устройство не пришлёт ACK. Учитывая частоту работы МК, нетрудно понять, что поиск адреса займёт совершенно незаметное количество времени. Исходный код программы, основанной на таком переборе, приложен к статье. При этом стоит учесть, что никакой индикации не предусмотрено и найденный адрес просто выводится на свободный порт МК.

Больше подробностей можно узнать из прилагаемого исходного кода.

Подключение, настройка и применение OLED дисплея с разрешением 128*64 пикселей и со встроенным драйвером SSD1306.

В разных проектах одна и та же особенность может быть как плюсом, так и минусом, поэтому следует учесть следующее:

  1. этот дисплей по размеру не более циферблата наручных часов (рис. 2), поэтому текстовую информацию на нём выводить почти бессмысленно. Основной упор следует делать на наглядные пиктограммы или крупные символы;
  2. монохромное изображение (есть варианты подобных дисплеев с несколькими цветами, но восприятие от этого улучшается незначительно);
  3. каждый пиксель является источником излучения, поэтому общая подсветка не требуется, что обуславливает низкое потребление тока и высокую контрастность;
  4. нетребователен к питанию: от 3,3 до 5 В;
  5. большое количество проектов с применением этого дисплея позволяет найти исчерпывающую информацию почти по любому вопросу.

OLED

Рисунок 2 - Геометрические параметры и расположение выводов

Процесс взаимодействия с дисплеем состоит из передачи байтов команд и байтов данных. При этом возникает необходимость определять, что чем является. С этой целью после адреса дисплея посылается контрольный байт, у которого первые шесть разрядов всегда равны нулю, а два самых старших бита определяют, что будет следовать за контрольным байтом: команда, один байт данных, много байт данных. Причём в последнем случае после данных обязательно следует сделать СТОП.

Вывести что-то на дисплей можно если:

  1. сделать СТАРТ;
  2. послать байт с адресом и битом, указывающим на запись (0);
  3. послать набор команд для инициализации дисплея. При этом перед каждой командой необходимо посылать контрольный байт команд;
  4. послать контрольный байт с указанием на запись много байт данных;
  5. байт за байтом передать всё изображение;
  6. сделать СТОП.

Необходимо учитывать, что одна картинка для дисплея с разрешением 128*64 занимает 1024 байта, что равноценно объёму не очень сложной программы. Однако, существует возможность сэкономить память и перерисовывать не весь экран целиком, а отдельные пиксели, для этого существуют команды 0x21 и 0x22.

При создании своих шрифтов нужно учесть, что при режиме горизонтальной развёртки высота строки составляет один байт, при этом младший разряд находится сверху, то есть байт как бы повёрнут на 90 градусов против часовой стрелки. Таким образом, пяти или шести байт, стоящих рядом, достаточно для отображения одного символа.

Основные функции, необходимые для работы с дисплеем и функция инициализации дисплея описаны в исходном коде.

Работа аппаратной ШИМ AVR в режиме Normal.

В данном проекте в качестве примера продемонстрирована возможность МК имитировать аналоговый сигнал. Это осуществимо из-за способности МК периодически переключать состояние вывода с низкого на высокий уровень как на рис. 3. Причём настолько быстро, что для достаточно инертной нагрузки (вентиляторы, нагреватели, лампы и т.п.) создаётся видимость некоторого промежуточного напряжения между минимальным и максимальным, соответствующего логическому нулю и единице. Однако, фактически нагрузка то включена на полную, то совсем выключена. При этом важным параметром ШИМ является именно соотношение продолжительности импульса к времени паузы между соседними импульсами. Так, например, чтобы поделить напряжение пополам, необходимо добиться одинаковой длительности импульса и паузы (при этом скважность равна 0,5).

ШИМ. Скважноть. Период.

Рисунок 3 - Основные параметры ШИМ

В любом МК можно реализовать ШИМ программно, но это полностью уничтожит производительность. По этой причине рациональнее использовать встроенный таймер/счётчик. Инициализировав его определённым образом, можно добиться полной разгрузки процессора МК. В Atmega8 есть три таймера/счётчика, но в данном проекте для ШИМ выбран Timer/Counter1, потому что Timer/Counter2 будет подсчитывать время, а Timer/Counter0 не предназначен для ШИМ.

Вся инициализация состоит из настройки двух регистров управления и одного регистра сравнения. При том необходимо разрешить прерывание по переполнению Timer/Counter1, ведь у счётного регистра TCNT1 Timer/Counter1 слишком большая разрядность (16 бит), из-за чего ШИМ получается медленный. Чтобы это исправить, необходимо по переполнению установить значение счётного регистра ближе к концу, тогда период ШИМ уменьшится хоть до продолжительности нескольких тактов. Между начальным значением TCNT1 и 0xFFFF необходимо выбрать значение 16 битного регистра сравнения OCR1A, чтобы по совпадению TCNT1 и OCR1A логический уровень на выводе OC1A изменялся на противоположный.

Более подробно о настройке ШИМ можно узнать из документации на МК.

Схема безопасной коммутации микроконтроллера и мощной нагрузки.

При работе с МК следует учитывать, что сила тока одного вывода не должна превышать десятков миллиампер, иначе МК выйдет из строя. В случае, когда требуется ток больше, следует применять всевозможные транзисторы, реле, ОУ и их комбинации. Но при этом остаётся риск повредить МК, например, при неожиданном скачке сетевого напряжения, неисправности силового ключа и т.д. Чтобы полностью обезопасить МК и сделать схему максимально надёжной, достаточно предусмотреть опторазвязку. В данном проекте рассмотрено применение транзисторной оптопары. При зажигании светодиода в одной цепи, ток начинает идти по транзистору из второй цепи, которая как бы замыкается. Так происходит управление силовой частью схемы посредством света и электрический контакт МК имеет лишь со светодиодом (рис. 4), что совершенно безопасно для обоих, если использовать токоограничивающий резистор с сопротивлением 100-300 Ом. Отдельно стоит отметить, что для цепей переменного тока следует применять оптопары с симисторным выходом.

Схема с применением оптопары с симисторным выходом и снабберной цепи

Рисунок 4 - Схема с применением оптопары с симисторным выходом и снабберной цепи

Итог

Рассмотренных возможностей ATmega8 достаточно для создания на его основе контроллера несложного электротехнического устройства (рис.5). При этом не задействованной осталась большая часть выводов МК, вплоть до целых портов, что увеличивает гибкость схемы при дальнейшей доработке.

Рисунок 5 - Общий вид на макетной плате

Рисунок 5 - Общий вид на макетной плате

В исходном коде также решена проблема с дребезгом, что в совокупности с остальными функциями даст возможность из элементарных блоков достроить свой графический интерфейс, свой обработчик нажатия кнопки, геркона, датчиков света и т.д. (всё, что работает на включение/выключение) и подключить любое другое устройство по I2C.

Пример реализации рассмотренных возможностей указан на видео.

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 Участие в конкурсе 2
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.5 Проголосовало: 2 чел.

Комментарии (9) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
+1
wanowar #
Немного запечатались.
На рисунке 3 и описании в тексте есть разбежность.
ак, например, чтобы поделить напряжение пополам, необходимо добиться одинаковой длительности импульса и паузы (при этом скважность равна 0,5).
Скважность будет 2. т.к. (1/2+1/2)/(1/2)=2. А вот коэффициент заполнения будет 0,5.
Скважность не может быть меньше 1, как и коэффициент заполнения больше 1.
Ответить
0
Semic #
А я всегда думал, что скважность это отношение длительности импульса к периоду следования.
Ответить
0
BARS_ #
компактную и относительно универсальную основу для контроллеров с самым разнообразным назначением
Поясните данный набор слов

При незначительной доработке представленное устройство может стать уникальной и высокопроизводительной не избыточной микроконтроллерной схемой.
При всем своем желании не сможет.
Ответить
0

[Автор]
BRVIT #
Примерно такая схема была основной частью моей дипломной работы, посвящённой вопросу о гидропонных системах. Теперь она же (с доработкой) является контроллером воздухоочистителя, проектируемого мной на работе. И её же я собираюсь использовать как основу для разработки устройства для замешивания алкогольных коктейлей. Поэтому было решено не привязываться к конкретному применению, а просто указать на относительную универсальность.
Ответить
+1

[Автор]
BRVIT #
Компактную и относительно универсальную основу для контроллеров с самым разнообразным назначением.
Тут я имел ввиду, что последнее время при разработке цифровых устройств применяют готовые платы вроде ардуино, малины pi и пр., что в большинстве проектов совершенно нерационально и Избыточно Гораздо дешевле накидать что-то из мк и небольшой обвязки, как в данной работе,
Ответить
+1
sergej_shaggy #
В упор не вижу компактной ОСНОВЫ. Просто статья, что можно использовать МК. Точно также можно написать статью, что используя набор логических элементов можно создать электронную схему. А используя пару транзисторов и несколько деталей можно создать мигалку с лампочкой, так что в этом варианте Ваша затея тоже избыточна. Но есть разница между словами "МОЖНО" и "СОЗДАЛ". Вся прелесть Ардуино (хотя я тоже недолюбливаю эти конструкторы) в том, что позволяет ничего не паяя создавать РАБОТАЮЩИЕ схемы, что очень хорошо для начинающих именно как конструктор для изучения основ.
Самое смешное, что все больше именно таких статей появляется на сайте. Да это и не удивительно, что-то придумать новое действительно сложно.
Ответить
+1

[Автор]
BRVIT #
Ардуино - это очень хорошая вещь, Многие с него начали и мало кто жалеет об этом.
Другое дело, что, пытаясь освоить МК, новичок (кем я себя считаю) сталкивается с постоянными недомолвками, ведь для опытного электронщика "и так всё очевидно". Однако, не всё так прозрачно, как хотелось бы. И когда возникла производственная необходимость в таком изделии, которое описано выше, - пришлось по крупицам собирать новую для себя информацию в течение долгих часов, а потом ещё отлаживать всё это до адекватной стабильности.
Поэтому мне показалось разумным сэкономить хоть кому-нибудь пару человеко-часов подобной статьёй.
Ответить
0
SanNik #
Здравствуйте, скачал ECOS.c, посмотрел, там настраиваются только регистры относящиеся к TWI, а как на счет отстальных регистров контроллера? Таймер/каунтеры надо инициализировать? В каком IDE писали программу?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Программатор Pickit3
Программатор Pickit3
FM-модуль RDA5807M Набор для сборки - LED лампа
вверх