Андрей Смирнов
Время чтения: ~8 мин.
Просмотров: 0

Сдвиговый регистр 74HC595

$_12.JPG

  • Цена: $1,62 за 20 штук

Этот обзор посвящен, собственно, начинающим пользователям Arduino или желающим приобщиться к этому делу. Речь пойдёт об увеличении количества выходов микроконтроллера при помощи сдвигового регистра, причём что это не требует больших затрат (по сравнению с покупкой Arduino Mega, например). Самое простое применение — помигать светодиодами, вот и попробуем это на практике. Когда начинал знакомство с микроконтроллерами (собственно и сейчас всё ещё продолжаю «начинать знакомиться»), один из первых вопросов был: как же имея всего десяток выходов на контроллере управлять той же сотней, тысячей светодиодов? Да, можно использовать мультиплексирование сигнала, встречное включение и множество других ухищрений, но всё равно максимальное количество подключаемых светодиодов ограничено, и необходимо искать другое решение. И подсказали мне один из вариантов — «возьми одну, две, десяток микросхем сдвиговых регистров и развлекайся». Было решено сразу же их заказать, а в перспективе даже собрать светодиодный куб с их применением. От последнего правда пришлось отказаться, нашёл более простой вариант, но это — тема другого обзора. Заказал сразу 20 штук 74HC595N, благо стоят сущие копейки. Буква N в конце маркировки обозначает, что микросхема в корпусе DIP-16, очень удобно для экспериментов на макетной плате, ничего даже паять не надо. Выглядит вот так:

Что же собой представляет эта микросхема? Это восьмиразрядный сдвиговый регистр с последовательным вводом, последовательным или параллельным выводом информации, с триггером-защелкой и тремя состояниями на выходе. Проще говоря, используя всего 3 выхода контроллера можно управлять 8 выходами сдвигового регистра. А если микросхемы соединить последовательно друг за другом, то количество контролируемых выходов можно наращивать до любого разумного предела (не нашёл предельного количества, но сотнями вроде как объединяются без проблем; если кто знает, от чего зависит предельное количество включенных в каскад микросхем — интересно было бы узнать в комментариях). Данные к микросхеме передаются последовательно. Биты 0 и 1 передаются в регистр друг за другом, считывание битов происходит при поступлении синхроимпульса. Передал 8 бит — получил 8 выходных состояний на выходах регистра. При каскадном включении 74HC595 (при необходимости получения 16, 24 и т.д. выходов) данные от первого регистра передаются к следующему. Выход регистра может находиться не только в состоянии логических 0 или 1, но и быть в высокоимпедансном состоянии, когда выход отключен от схемы. В это состояние могут быть переведены только все выходы сразу. Это редко используется, но может быть полезно при переключении управления на другой контроллер, например. Распиновка входов/выходов7b17e9.jpg Q0…Q7 – выходы регистра, могут быть в состоянии 0, 1 или высокоимпедансном GND – земля Q7′ – выход для последовательного соединения регистров. MR – сброс значений регистра SH_CP – вход тактовых импульсов ST_CP – вход «защёлкивающий» данные OE – вход переводящий выходы из высокоимпедансного в рабочее состояние DS – вход данных VCC – питание 2-6 вольт Остаётся проверить работу, для этого соберем популярную среди новичков схему. GND (пин 8) подключаем на землю, Vcc (пин 16) к питанию 5В, OE (пин 13) на землю, MR (пин 10) к питанию 5В. Теперь к сдвиговому регистру подключено питание и все выходы активны. Теперь время подключить микросхему к Arduino: вход данных DS (пин 14) подключим к 9-ому цифровому выходу ардуино, вход тактовых импульсов SH_CP (пин 11) к 10-ому цифровому выходу, вход-защелку ST_CP (пин 12) к 8-ому пину ардуино. Между землёй и защелкой рекомендуется поставить конденсатор на 0,1 мкФ для минимизации шумов. Осталось подключить светодиоды — через резисторы 150-300 Ом подключаем их от выходов регистра к земле. Собственно и всё. Вот нашёл схему, кто любит наглядные материалы (обратите внимание, распиновка реальной микросхемы и схематическое изображение на данной схеме различаются!) Собрал схему на макетной плате, у меня получилось вот так.собранная схема
В ардуино удобно воспользоваться функцией shiftOut(), которая выводит байт информации на порт вход/выхода последовательно (побитно). Почитать можно тут. Загружаем тестовый код в Arduino и получаем счётчик от 0 до 255 в двоичном виде: Вот так получилось у меня, всё работает как положено: Таким образом, при минимальном использовании пинов контроллера можно управлять большим количеством светодиодов (или ещё чем-нибудь). Всё бы хорошо, но расскажу и о недостатках. Как видим, ток для каждого светодиода необходимо ограничивать резистором, и при построении больших светодиодных матриц это становится достаточно трудоёмко. Есть более интересное решение для управления светодиодами — драйвер DM13A, который представляет собой сдвиговый регистр, при этом ещё и ограничивает ток на каждом выходе. Про него расскажу в следующий раз, а в качестве бонуса — тот самый мой первый LED куб, 5x5x5, собранный на упрощенной элементной базе, уже без применения 74HC595.

Преимущества использования сдвигового регистра 74HC595:

  • не требует никакой обвязки кроме конденсатора по питанию;
  • работает через широкораспостраненный интерфейс SPI;
  • для самого простого включения достаточно двух выходов микроконтроллера;
  • возможность практически неограниченного расширения количества выходов без увеличения занятых выходов микроконтроллера;
  • частота работы до 100 МГц;
  • напряжение питания от 2 В до 6 В;
  • дешевый — стоит менее 5 центов;
  • выпускается как в планарных корпусах (74HC595D удобен для производства), так и в DIP16 (74HC595N удобен для радиолюбителей и макетирования).

Для понимания работы регистра стоит взглянуть на функциональную схему. Она состоит из:

  • 8-битного регистра сдвига,
  • 8-битного регистра хранения,
  • 8-битного выходного регистра.

74hc595_functional.png

Рассмотрим какие выводы есть у сдвигового регистра 74hc595.

Общего вывод и вывод питания объяснений не требуют.

  • GND — земля
  • VCC — питание 5 вольт

Входы 74HC595:

OE

MR — сброс регистра

DS – вход данных

Последовательно подаваемые сюда данные будут появляются на 8-ми выходах регистра в параллельной форме.

SHCP – вход для тактовых импульсов

Когда на тактовом входе SHCP появляется логическая единица, бит находящийся на входе данных DS считывается и записывается в самый младший разряд сдвигового регистра. При поступлении на тактовый вход следующего импульса высокого уровня, в сдвиговый регистр записывается следующий бит со входа данных. Тот бит который был записан ранее сдвигается на один разряд (из Q0 в Q1) , а его место занимает вновь пришедший бит. И так далее по цепочке.

STCP – вход «защёлкивающий» данные

Что бы данные появились на выходах Q0…Q7 нужно подать логическую единицу на вход STCP. Данные поступают в параллельный регистр который сохряняет их до следующего импульса STCP.

Выходы 74HC595

  • Q0…Q7 – выходы которыми будем управлять. Могут находится в трёх состояниях: логическая единица, логический ноль и высокоимпедансное состояние
  • Q7′ – выход предназначенный для последовательного соединения регистров.

Временная диаграмма на которой показано движение логической единицы по всем выходам регистра.

Как говориться лучше один раз увидеть, чем семь раз услышать. Я сам впервые применяя регистр 74HC595 не до конца понимал его работу и чтобы понять смоделировал нужную схему в Proteus.

Вот такая схема подключения семисегментных индикаторов к микроконтроллеру ATMega48 по SPI получилась:

Иногда требуется ОЧЕНЬ много выходных портов. Особенно если хотим сделать что нибудь на светодиодах. Гирлянду какую-нибудь навороченную. Что делать? Брать под это дело ATMega128 с ее полусотней выводов? Избыточно — для ламеров. Ставить i2с расширитель портов? Дорого. Для мажоров. Тут на помощь из вековых глубин выплывает старая добрая дискретная логика. На этот раз нас выручит грошовый сдвиговый регистр. Возьму, для примера, 74HC164 он же, для любителей совковых трешевых микросхем в неубиваемом каменном корпусе, наш КM555ИР8.

У него есть 8 выходов и четыре входа. R-сброс, С-тактовый, А1 и А2 вход. На самом деле, внутри они заведены через логический элемент 2И-НЕ и идут на D триггеры. D — это такой тип триггера, который по тактовому импульсу схватывает и отправляет на выход то, что у него на входе. Как видишь, тут они цепью стоят ,передавая бит от одного к другому и нет принципиальной разницы сколько их тут будет, восемь штук или восемь миллиардов. Но чем больше, тем дольше по этой эстафете гнать данные до конца. Поэтому мы смело можем эти регистры соединять последовательно.Получается вот такая схема:

Наполнять регистр просто: 1) Поднимаем и держим RESET в 1 2) Выдаем первый (старший) бит на Data. 3) Опускаем в 0 и поднимаем в 1 тактовый выход. На восходящем фронте происходит занос в регистр и сдвиг всей цепочки на один шаг. 4) Повторить со второго пункта пока все биты не выдадим.

А для сброса достаточно уронить Reset в ноль на пару микросекунд. Все просто 🙂

З.Ы. Кружок на входе регистра означает, что вход инверсный. Т.е. подал ноль — сработало Треугольник на входе показывает по какому фронту произойдет срабатывание. Запомнить просто: _/ _ — это, типа, импульс. А треугольник, как стрелочка, указывает на нужный фронт. ->_/ _ передний (восходящий фронт) и _/ _<- задний (нисходящий фронт)

Ну и даташитик напоследок, а еще протеусовская модель, где можно вручную переключателем поперетыкать уровень на входе и потыкать кнопку тактового входа. Правда я там поленился на диоды питание заводить — там по квадратикам логических уровней итак все видно хорошо 🙂

Используемые источники:

  • https://mysku.ru/blog/ebay/35339.html
  • http://hardelectronics.ru/74hc595.html
  • http://easyelectronics.ru/sdvigovyj-registr.html

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации