Подключаем сдвиговый регистр 74hc595 ардуино

1Описание и назначение сдвигового регистра 74HC595

Сдвиговый регистр 74HC595 и ему подобные используются в качестве устройств преобразования последовательных данных в параллельные, а также может использоваться как «защёлка» для данных, удерживая заданное состояние.

Схема выводов («распиновка») приведена на рисунке слева.

Назначение выводов сдвигового регистра 74HC595 и внешний вид в выводном корпусе DIP-16

Назначение выводов микросхемы 74HC595 такое.

Обозначение вывода Назначение
Q0…Q7 выходы параллельных данных;
GND земля (0 В);
Q7′ выход последовательных данных;
MR сброс ведущего устройства (активный низкий);
SHCP вход тактовых импульсов сдвигового регистра;
STCP вход тактовых импульсов «защёлки»;
OE разрешение вывода (активный низкий);
DS вход последовательных данных;
VCC питание +5 В.

Конструктивно микросхема выполняется в нескольких типах корпусов; я буду использовать микросхему в выводном корпусе DIP-16, т.к. его проще использовать с макетной платой (бредбордом).

74HC595

Самым популярным является восьмиразрядный (8 управляемых выходов) сдвиговый регистр 74HC595 (отечественный аналог КР1564ИР52), который можно встретить в стартовых наборах или купить отдельно.

Схема

  • Выводы Q0 — Q7 (15 и 1..7)
  • GND (8) — земля
  • Q7′ (9) — выход регистра, который необходимо соединить с Q0 следующего регистра для создания цепочки
  • MR (10) — сброс значений регистра. Сброс происходит при получении LOW
  • SH_CP (SRCLK) (11) — линия синхроимпульса для передачи данных из DS во внутренние ячейки (вход для тактовых импульсов). SH — shift, CP — clock pin
  • ST_CP (RCLK) (12) — линия синхроимпульса для передачи данных из внутренних ячеек, во внешние (синхронизация выходов). ST — storage, CP — clock pin
  • OE (13) — инверсный, разрешение на вывод данных с внешних ячеек (вход для переключения состояния выходов из высокоомного в рабочее)
  • DS (SER) (14) — линия последовательных данных (Data Serial)
  • VCC (16) — питание, 5В

74HC595 — восьмиразрядный сдвиговый регистр с последовательным вводом, последовательным или параллельным выводом информации, с триггером-защёлкой и тремя состояниями на выходе. Другими словами этот регистр позволяет контролировать 8 выходов, используя всего несколько выходов на самом контроллере. При этом несколько таких регистров можно объединять последовательно для каскадирования.

74HC595 может отдавать сигналы не только параллельно, но и последовательно. Это необходимо при объединении нескольких регистров, для получения 16 и более выходов. В этом случае первые 8 бит сигнала передаются на следующий регистр для параллельного вывода на нём.

Соберём схему, для которой понадобится сдвиговый регистр и восемь светодиодов с резисторами

При этом обратите внимание, что в нашем распоряжении восемь выводов регистра для светодиодов, а на плате используем только три цифровых вывода (экономия пяти выводов)

Установите сдвиговый регистр в центре макетной платы, чтобы ножки разделяла центральная разделительная дорожка.

Подключим контакты 16 (VCC) и 10 (MR) к выводу 5V на Arduino.

Соединяем контакты 8 (GND) и 13 (OE) с выводом GND на Arduino.

Соединяем три контакта, которыми мы будем управлять сдвиговым регистром:

  • Вывод 11 (SH_CP, SRCLK) на вывод 11 на Arduino (синхронизация)
  • Вывод 12 (ST_CP, RCLK) на вывод 12 на Arduino (защёлка)
  • Вывод 14 (DS, SER) на вывод 9 на Arduino (данные)

Далее подключаем все восемь светодиодов с резисторами

Обратите внимание, что у регистра с одной стороны идут семь выводов подряд, а восьмой находится на выводе 15

Вариант подключения (используются другие выводы платы).

Включаем один светодиод

Попробуем включить один светодиод. Сначала указываем используемые выводы платы (тактовая линия — clockPin, данные — dataPin, защёлка — latchPin).

В setup() устанавливаем для них режим OUTPUT и ставим защёлке высокий уровень, чтобы регистр не принимал сигналов.

В loop() попробуем что-нибудь отправить на регистр. Сначала ставим LOW на защёлку (начинаем передачу данных. Теперь регистр принимает сигналы с Arduino). Далее отправляем данные в двоичном виде. Например, отправим байт 0b10000000 (должен будет загореться первый светодиод). В конце выставляем HIGH на защёлку (заканчиваем передавать данные).

Если в shiftOut() поменять LSBFIRST на MSBFIRST, то включится не первый, а последний светодиод в цепочке схемы.

При работе с несколькими светодиодами не очень удобно постоянно писать три строчки кода для каждого светодиода в отдельности. Поэтому оформим код в виде функции и будем мигать третьим светодиодом.

5Временная диаграмма работы микросхемы 74HC595

Общий вид временной диаграммы – на рисунке. Голубой пунктирной линией показаны 4 линии SPI, красной пунктирной – 8 каналов параллельных данных регистра сдвига. Точка A на шкале времени – это момент передачи в регистр сдвига числа «210», B – момент записи числа «0», C – завершение текущей итерации цикла и начало новой.

Временная диаграмма работы микросхемы 74HC595

Как видно, от А до B – 10,03 миллисекунд, а от B до С – 90,12 миллисекунд, почти как мы и задали в скетче. Небольшая добавка в 0,03 и 0,12 мс – время передачи последовательных данных от Arduino, поэтому мы тут имеем не ровно 10 и 90 мс.

Рассмотрим подробнее участок A.

Обратите внимание на временной масштаб. Теперь это микросекунды, а на предыдущем были миллисекунды

То есть это сильно укрупнённый по сравнению с первой диаграммой участок.

Диаграмма передачи числа «11010010» по SPI

В первом канале сверху – длинный импульс с нулевым уровнем, которым Arduino инициализирует передачу по линии SPI — ENABLE – выбор ведомого. В это время начинают генерироваться тактовые импульсы SPI — CLOCK (см. второй сверху канал). Для передачи одного байта генерируется 8 тактовых импульсов.

Третий канал сверху – SPI — MOSI – данные, которые мы передаём от Arduino к сдвиговому регистру. Это наше число «210» в двоичном виде – «1101 0010».

После завершения передачи линия SPI — ENABLE поднимается в высокое состояние, и мы видим, что сдвиговый регистр выставил на своих 8-ми ножках значение «1101 0010». Я выделил это голубой пунктирной линией и подписал значения для наглядности.

Теперь обратим внимание на участок B. Диаграмма передачи числа «00000000» по SPI

Диаграмма передачи числа «00000000» по SPI

Опять всё начинается с выбора ведомого и генерирования 8-ми тактовых импульсов (первый и второй каналы сверху). Данные на линии SPI — MOSI теперь – «0000 0000» (3-ий сверху канал). То есть мы записываем в этот момент в регистр число «0». Но пока передача не закончена, в регистре по прежнему хранится значение «1101 0010», которое мы выставили ранее. Оно выводится на параллельные выводы Q0..Q7 (8 нижних каналов на рисунке), а также, при наличии тактовых импульсов в линии SPI — CLOCK, выдаётся в линию SPI — MISO (см. 4-ый канал сверху) c последовательного выхода регистра Q7′, что мы тут и видим.

Пример 1: Использование одного сдвигового регистра

Сначала сдвиговый регистр нужно обеспечить питанием и включить. Для этого нужно подключить следующие контакты:

  • GND (контакт 8) на регистре к «земле» на Arduino
  • Vcc (контакт 16) на регистре к 5V на Arduino
  • OE (контакт 13) на регистре к «земле» на Arduino
  • MR (контакт 10) на регистре к 5V на Arduino

Это сделает все выходные контакты активными и всегда доступными. Впрочем, есть и один недостаток – до того, как скетч запустится, светодиоды получат значения, которые отправлялись им в самый последний раз, или даже произвольные значения. Решить эту проблему можно, выделив для OE и MR дополнительные контакты на Arduino, однако в этом случае свободных контактов на Arduino, что очевидно, станет на два меньше.

Затем к Arduino нужно подключить 3 «интерфейсных» контакта:

  • DS (контакт 14) на регистре к цифровому контакту 11 на Arduino (синий провод)
  • SH_CP (контакт 11) на регистре к цифровому контакту 12 на Arduino (желтый провод)
  • ST_CP (контакт 12) на регистре к цифровому контакту 8 на Arduino (зеленый провод)

В скетчах эти контакты будут называться dataPin (контакт для данных), clockPin (тактовый контакт) и latchPin (контакт-защелка) соответственно

Обратите внимание, что к контакту-защелке подключен конденсатор на 0,1 фарад – он нужен для того, чтобы смягчить возможные колебания от импульсов.

Теперь подключаем светодиоды. Катод (короткая ножка) каждого светодиода подключается к общей «земле», а анод (длинная ножка) – к соответствующему выходному контакту сдвигового регистра. В результате получается, что регистр не только управляет светодиодами, но и питает их энергией, т.е. он является для них «источником тока». У некоторых регистров такой функции нет, они могут только «потребителями тока». Если вам попался именно такой регистр, то светодиоды к нему нужно подключать по-другому: аноды – к питанию, а катоды (т.е. заземляющие контакты светодиодов) – к выходным контактам сдвигового регистра. Если это чип, не принадлежащий к семейству «595», то лучше свериться с даташитом. И не забывайте про 220-омовые резисторы, чтобы защитить светодиоды от перегрузки.

Так будет выглядеть вся схема:

Код

Ниже – три скетча-примера. Первый – это «Простая передача битов», который просто выводит на светодиоды байт со значением от «0» до «255». Второй скетч одновременно зажигает все светодиоды. Третий циклами проходит по массиву.

Все эти скетчи базируются на информации из даташита – диаграмме синхронизации и таблицы с описанием логики (см. ниже)

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

Попав в сдвиговый регистр, данные сохраняются во внутреннем регистре памяти. Кроме того, когда состояние переключается из LOW в HIGH на контакте latchPin, эти данные из регистра памяти перемещаются к выходным контактам, подключенным к светодиодам.

Вот диаграмма синхронизации:

Вот таблица, описывающая логику:

ВВОД ВЫВОД Функция
SH_CP ST_CP OE MR DS Q7’ Qn
X X L L X L б.и. Состояние LOW на MR затрагивает только сдвиговый регистр
X ˄ L L X L L Пустой сдвиговый регистр загружается в регистр памяти
X X H L X L Z Сдвиговый регистр очищается; параллельные выходы переключаются в высокоимпедансное состояние
˄ X L H H Q6 б.и. 0-ой триггер сдвигового регистра получает значение HIGH; содержимое всех триггеров сдвигового регистра движется дальше; к примеру, предыдущее значение 6-го триггера (внутренний Q6) перемещается на последовательный выход (Q7’’)
X ˄ L H X б.и. Qn Содержимое триггеров сдвигового регистра (внутренние Qn) переходит в регистр памяти и в триггеры последовательного выхода
˄ ˄ L H X Q6 Qn Содержимое сдвигового регистра перемещается дальше; предыдущее содержимое сдвигового регистра перемещается в регистр памяти и триггеры параллельного выхода

Условные обозначения:

H – уровень напряжения HIGH

L – уровень напряжения LOW

˄ – переход от LOW к HIGH

˅ – переход от HIGH к LOW

Z – высокоимпедансное состояние

б.и

– без изменений

X – не важно. Ниже – скетчи, которые можно использовать вместе с этой цепью:

Ниже – скетчи, которые можно использовать вместе с этой цепью:

  • 1.1 – Простая передача битов
  • 1.2 – Один за одним
  • 1.3 – Использование массива

16 светодиодов

Теперь перейдем к более сложной схеме используем 74hc595 Arduino для 16 светодиодов.

Детали

По большому счету в данном случае количество всех комплектующих увеличиваем вдвое, кроме, конечно, Ардуино Уно:

  • Arduino UNO (x1)
  • 74HC595 сдвиговый регистр (x2)
  • Светодиоды (x16)
  • 220 ом резисторы (x16)
  • Провода/перемычки
  • Две макетные платы (одна с 400 пинами, вторая с 830 пинами)
  • Потенциометр для контроля яркости (по желанию)

Схема соединения

Схема соединения получилась уже больше, чем при 8 светодиодах и одном регистре сдвига 74HC595.

Соберите схему как на рисунке выше и подключите первый регистр сдвига следующим образом:

  • GND (контакт 8) на землю
  • Vcc (контакт 16) — 5В
  • OE (контакт 13) на землю (GND)
  • MR (контакт 10) — 5 В
  • DS (контакт 14) — пин 11 Arduino
  • SH_CP (контакт 11) на контакт Arduino 12
  • ST_CP (контакт 12) к контакту 8 Arduino

Подключите второй регистр сдвига точно так же, но подключите DS (контакт 14) к первому выходу 9 регистра. После этого соедините контакты 1, 2, 3, 4, 5, 6, 7 и 15 из обоих регистров и светодиоды. Это соединение делает все контакты всегда активными и адресными, однако при включении Arduino некоторые из светодиодов могут быть включены. Решение для этого — подключить MR (контакт 10) и OE (контакт 13) к Arduino напрямую, но таким образом вы должны пожертвовать 2 выводами ардуины.

Чтобы добавить больше регистров сдвига, соедините их, как второй регистр. Всегда подключайте контакты MR и OE непосредственно к контакту Arduino и DS к предыдущему регистру. Если вы хотите отрегулировать яркость светодиодов, подключите потенциометр, как показано на рисунке выше, для управления сопротивлением для всех светодиодов. Однако это необязательно, и вы можете обойтись без него.

Скетч для ардуино

Варианты скетчей обычно предназначены для ограниченного числа регистров сдвига, т.к. для этого нет универсальной функции/метода. Данный код ниже переработан так, чтобы вы могли использовать неограниченное количество регистров сдвига:

int latchPin = 8;
int clockPin = 12;
int dataPin = 11;

int numOfRegisters = 2;
byte* registerState;

long effectId = 0;
long prevEffect = 0;
long effectRepeat = 0;
long effectSpeed = 30;

void setup() {
	//Initialize array
	registerState = new byte;
	for (size_t i = 0; i < numOfRegisters; i++) {
		registerState = 0;
	}

	//set pins to output so you can control the shift register
	pinMode(latchPin, OUTPUT);
	pinMode(clockPin, OUTPUT);
	pinMode(dataPin, OUTPUT);
}

void loop() {
	do{
		effectId = random(6);
	} while (effectId == prevEffect);
	prevEffect = effectId;

	switch (effectId)
	{
	case 0:
		effectRepeat = random(1, 2);
		break;
	case 1:
		effectRepeat = random(1, 2);
		break;
	case 3:
		effectRepeat = random(1, 5);
		break;
	case 4:
		effectRepeat = random(1, 2);
		break;
	case 5:
		effectRepeat = random(1, 2);
		break;
	}

	for (int i = 0; i < effectRepeat; i++) {
		effectSpeed = random(10, 90);

		switch (effectId)
		{
		case 0:
			effectA(effectSpeed);
			break;
		case 1:
			effectB(effectSpeed);
			break;
		case 3:
			effectC(effectSpeed);
			break;
		case 4:
			effectD(effectSpeed);
			break;
		case 6:
			effectE(effectSpeed);
			break;
		}
	}
}

void effectA(int speed){
	for (int i = 0; i < 16; i++){
		for (int k = i; k < 16; k++){
			regWrite(k, HIGH);
			delay(speed);
			regWrite(k, LOW);
		}

		regWrite(i, HIGH);
	}
}

void effectB(int speed){
	for (int i = 15; i >= 0; i--){
		for (int k = 0; k < i; k++){
			regWrite(k, HIGH);
			delay(speed);
			regWrite(k, LOW);
		}

		regWrite(i, HIGH);
	}
}

void effectC(int speed){
	int prevI = 0;
	for (int i = 0; i < 16; i++){
		regWrite(prevI, LOW);
		regWrite(i, HIGH);
		prevI = i;

		delay(speed);
	}

	for (int i = 15; i >= 0; i--){
		regWrite(prevI, LOW);
		regWrite(i, HIGH);
		prevI = i;

		delay(speed);
	}
}

void effectD(int speed){
	for (int i = 0; i < 8; i++){
		for (int k = i; k < 8; k++)
		{
			regWrite(k, HIGH);
			regWrite(15 - k, HIGH);
			delay(speed);
			regWrite(k, LOW);
			regWrite(15 - k, LOW);
		}

		regWrite(i, HIGH);
		regWrite(15 - i, HIGH);
	}
}

void effectE(int speed){
	for (int i = 7; i >= 0; i--){
		for (int k = 0; k <= i; k++)
		{
			regWrite(k, HIGH);
			regWrite(15 - k, HIGH);
			delay(speed);
			regWrite(k, LOW);
			regWrite(15 - k, LOW);
		}

		regWrite(i, HIGH);
		regWrite(15 - i, HIGH);
	}
}

void regWrite(int pin, bool state){
	//Determines register
	int reg = pin / 8;
	//Determines pin for actual register
	int actualPin = pin - (8 * reg);

	//Begin session
	digitalWrite(latchPin, LOW);

	for (int i = 0; i < numOfRegisters; i++){
		//Get actual states for register
		byte* states = &registerState;

		//Update state
		if (i == reg){
			bitWrite(*states, actualPin, state);
		}

		//Write
		shiftOut(dataPin, clockPin, MSBFIRST, *states);
	}

	//End session
	digitalWrite(latchPin, HIGH);
}

В коде добавлено несколько эффектов для этих 16 светодиодов. Если вы хотите добавить больше светодиодов, подключите больше регистров сдвига по примеру выше и измените значение numOfRegisters в коде.

7Каскадное подключение регистров сдвига к Arduino

Давайте подключим три регистра сдвига 74HC595 к Arduino и попробуем управлять ими по SPI.

В разделе 3 этой статьи была дана схема подключения одного регистра 74HC595 к Arduino. Схема, когда к Arduino подключены несколько ведомых устройств в каскадном режиме, отличается не сильно. Основное отличие в том, что используется один пин выбора ведомого, который активирует одновременно все подключённые устройства (пин SS Arduino подключён ко всем входам STCP), а также данные из ведущего (выход MOSI Arduino) передаются первому в цепочке ведомому 74HC595 на вход последовательных данных DS, тот в свою очередь из последовательного порта Q7′ передаёт данные следующему ведомому на последовательный вход DS, и так далее. Последний ведомый из своего порта Q7′ передаёт данные ведущему в линию MISO, но в нашем случае это не обязательно. Остальные выводы сдвиговых регистров подключены так же, как на предыдущей схеме. У Arduino же используются те же 4 стандартных пина SPI, что и при подключении к единственному регистру сдвига.

Соберём в соответствии с этим нашу схему. У меня получилось как-то так:

Каскадное подключение трёх сдвиговых регистров к Arduino – вид со стороны параллельных выходов 74HC595 Каскадное подключение трёх сдвиговых регистров к Arduino – вид со стороны пинов управления 74HC595

Теперь напишем скетч для «бегущей волны», но теперь она будет немного длиннее. В моём случае – из 19-ти светодиодов, каждый из которых будет представлять один из разрядов параллельных выходов (на все 24 не хватило места на монтажке).

#include <SPI.h>

void setup() {
  pinMode(PIN_SPI_SS, OUTPUT);
  SPI.begin();
  Serial.begin(9600);
}

void loop() {
  for (int i=0; i<20; i++) { //вообще, тут нужно писать i<25, т.к. всего параллельных выходов у трёх регистров 24

    unsigned long num = (long)1<<i; // "гоним" горящий огонёк по разрядам, сдвигая единицу на 1 разряд влево каждую итерацию 
    /* 
    * 19 (или 24) разрядов числа поместятся только в беззнаковый long 
    * unsigned long может хранить до 32-х разрядов. 
    * Т.к. у нас три сдвиговых регистра или 3*8=24 бит, то используем этот тип данных 
    */

    /* 
    * Реализация SPI в Arduino такова, что можно передавать числа либо байтами, либо словами по 2 байта.
    * Поэтому делим наше число на байты, их получается 3, как и регистров сдвига:
    */
    byte a = (byte)num; //младшие 8 бит числа
    byte b = (byte)(num>>8);//средние 8 бит числа
    byte c = (byte)(num>>16); //старшие 8 бит числа

    digitalWrite(PIN_SPI_SS, LOW); // начинаем передачу по SPI
    SPI.transfer(c); //передаём старший байт числа
    SPI.transfer(b); //передаём средний байт числа
    SPI.transfer(a); //передаём младший байт числа
    digitalWrite(PIN_SPI_SS, HIGH); // завершаем передачу по SPI

    // Контрольный вывод в COM-порт:
    Serial.print((String)i + ": ");
    Serial.print(num, HEX);
    Serial.print("=");
    Serial.print(c, HEX);
    Serial.print(",");
    Serial.print(b, HEX);
    Serial.print(",");
    Serial.println(a, HEX);

    delay(100); // задержимся немного
  }
}

Обратите внимание, мы обращались к параллельным выходам 3-х сдвиговых регистров как к большому 24-разрядному числу. Но что делать, если вы подключили к Arduino большее количество 74HC595? Такими большими числами Arduino, конечно же, оперировать не умеет

В таком случае придётся работать с байтами. То есть передавать в каждый регистр своё 8-разрядное значение.

А вот так это выглядит в действии:

Каскадное подключение трёх сдвиговых регистров к Arduino в действии

На видео в конце статьи результат наглядно показан в динамике. К каждому из трёх сдвиговых регистров подключены светодиоды своего цвета – красные, зелёные и синие, и видно, как наше число «перескакивает» с регистра в регистр.

Таким образом, мы детально изучили вопрос информационного обмена между ведущим устройством, в роли которого выступил Arduino, и сдвиговым регистром 74HC595. Научились подключать сдвиговый регистр, записывать в него данные и считывать из него данные.

Как работает регистр сдвига?

Прежде чем мы начнем подключать чип, давайте рассмотрим, как этот процесс работает.

Первое, что нужно прояснить, – это понятие «биты» для тех из вас, кто не знаком с двоичным кодом. Когда мы говорим о «битах», мы имеем в виду одно из чисел, составляющих двоичное значение. В отличие от обычных чисел, мы обычно считаем, что первый бит является самым большим. Итак, если мы берем двоичное значение 10100010, первый бит на самом деле равен 0, а восьмой бит равен 1. Следует также отметить, если это не подразумевалось, каждый бит может быть только 0 или 1.

Чип содержит восемь контактов, которые мы можем использовать для вывода, каждый из которых связан с битом в регистре. В случае сдвигового регистра 74HC595 мы рассматриваем их от QA до QH.

Чтобы записать эти выходы через Arduino, мы должны отправить двоичное значение в регистр сдвига, и из этого числа сдвиговый регистр может определить, какие выходы использовать. Например, если мы отправили двоичное значение 10100010, контакты, выделенные зеленым цветом на изображении выше, будут активными, а выделенные красным цветом будут неактивными.

Это означает, что самый правый бит сопоставляется как QH, а левый бит сопоставляется с QA. Выход считается активным, когда бит, сопоставленный с ним, установлен на 1

Важно помнить об этом, так как иначе вам будет очень сложно узнать, какие контакты вы используете

Теперь, когда у нас есть основное понимание того, как мы используем смещение битов, чтобы указать, какие контакты использовать, мы можем начать подключать его к нашему Arduino.

ШИМ

Как же использовать ШИМ, ведь мы же часто управляем при помощи регистра светодиодами, а выходы регистра могут иметь только 3 состояния — логический ноль LOW, логическая единица HIGH и высокоимпедансное состояние (пин не имеет физического контакта с электрической цепью). И действительно ШИМ сдвиговым регистром не поддерживается, но есть одна небольшая хитрость — мы можем использовать выход регистра OE (Output Enable input) — он отвечает за переключение из высокомного состояния в ноль. Выход OE — можно назвать логическим нолем для всех выходов. Таким образом, если мы подключим этот пин к ШИМ-выходу Arduino, то сможем таким образом смещать логический ноль, тем самым имитировать ШИМ на светодиодах.

Читайте на сайте Codius

Минус данного подхода заключается в том, что в этом случае регулируется яркость всех светодиодов, подключённых к одному сдвиговому регистру. А что же делать, если нам нужно показать разную яркость светодиодов, подключённых к одному сдвиговому регистру. Здесь снова нужно будет пойти на хитрость — создать карту яркостей светодиодов, и зажигать каждую группу со своей яркостью по очереди, так быстро, чтобы создавалось ощущение постоянного свечения:

Но если вы начнёте экспериментировать с задержками и большим количеством карт яркости, то столкнётесь с очень неприятным эффектом мерцания — это связно с большим временем исполнения стандартных для языка Arduino функций-обёрток типа digitalWrite, digitalRead, analogWrite, analogRead и т.д.

Другие регистры, например, STP16C596 могут управлять 16 светодиодами одновременно без использования дополнительных резисторов.

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

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

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

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

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

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

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

Выходы 74HC595

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

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

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

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

Это схема с динамической индикацией, то есть в каждый момент времени загорается только одна цифра счетверенного семисегментного индикатора, потом загорается следующая и так по кругу. Но так как смена происходит очень быстро, то глазу кажется, что горят все цифры. Кроме того одновременно эта схема и опрашивает 4 кнопки S1-S4. Добавив два сдвоенных диода можно опрашивать 8 кнопок. А добавив 4 транзистора и резистора можно подключить дополнительный 4-х знаковый индикатор. Чтобы динамическая индикация заработала в регистры нужно послать два байта: первый байт определяет, какой из 4-х индикаторов будет работать и какую кнопку будем опрашивать. А второй, какие из сегментов загорятся.

12 thoughts on “ Сдвиговый регистр 74HC595 и семисегментный индикатор ”

По моему — это тот случай, когда объяснение простого может выглядеть сложным, а не наоборот. Что может быть проще, чем два бита переслать? В данном примере, биты, пересылаемые микроконтроллером в последовательном виде — преобразуются регистрами в параллельный. Один подает на матрицу, в роли которой выступает индикатор, данные, другой — адрес. Приведен один из примеров интерфейса периферии, обслуживаемой микроконтроллером. Я бы только добавил, что счетверенный семисегментныйт индикатор, чаще всего, используют в роли часов.

В приведенной схеме динамической индикации светодиоды семисегментного индикатора должны быть на напряжение не более 4 В. В больших индикаторах часто используется последовательное включение нескольких светодиодов: например в индикаторах высотой 5см — 4 светодиода.

Поэтому стоит сделать регистру 74HC595 высоковольтный выход: подключить по MosFET на каждый выход. Затвор на выход микросхемы, исток на землю, а к стоку — «высоковольтную» нагрузку.

А действительно, часто такие схемы обслуживают таблоиды и поболее 5 см. Там может и предложенные MosFET (КМОП, полевики с изолированным затвором) будут рентабельны — цена-то у них, как правило, кусючая. В большинстве-же случаев, достаточно будет DD1, как и DD2 подсоединить к токовым ключам, а не напрямую. Этого не сделано на приведенной схеме, так как на DD2 может падать нагрузка одновременно с семи сегментов, а на DD1 — только с одного. А экономичность схематического решения — далеко не последнее дело, в каждом, конкретном случае.

Datasheet 74HC595 и 74HCT595 от NXP.

Если не нужно каскадирование, регистр хранения и высокоимпедансное состояние на выходах то можно обойтись 74HC164N.

А зачем, если цена фактически одна? Купить сразу несколько сотен 74HC595 по 1,50 за штуку и ставить их везде и всюду, где нужны последовательно-параллельные регистры.

Мне в 74HC595 нравится именно возможность организации статической индикации, с одновременным переключением индикаторов. Так шумов меньше, чем у индикации динамической или у статической индикации без промежуточного (буферного) регистра. К тому же во втором случае имеется паразитная засветка индикатора при частой смене показаний.

А кто и как интересно опрашивает состояние кнопок на такой схеме, регистр же не контроллер он не понимает нажата кнопка или нет, его дело просто подать соответсвующие сигналы навыходных ножках, обратной же связи нет, или я чего-то не понимаю?

Тот микроконтроллер что дает сигнал на включение разрядов индикатора. Например логическим нулем зажигаем разряд который подключен к выводу Q0 микросхемы DD2 , тогда при нажатии кнопки S1 на 9-том контакте X1 разъема появляется логический ноль, этот сигнал и считывает микроконтроллер.

А кто и как будет считывать значения с кнопок?

В этом схеме нет алгоритм для считывание состояние кнопок. Для управление 7сег. индик. лучше включить после 595 микросхему 2003.

Применяйте микросхему TPIC6B595DWR, которая уже содержит полевики с открытым стоком на выходе.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector