Circuitos digitais, Circuitos integrados, Componentes eletrônicos, Microcontroladores, Projetos

Registrador de deslocamento

O registrador de deslocamento é útil para aumentar o número de saídas de um microcontrolador e converter dados binários paralelo em serial e vice-versa.

O que é um registrador de deslocamento?

É um conjunto de flip-flops conectados de forma que possam armazenar e transferir dados binários. Um flip-flop transfere bits para o próximo a cada pulso de clock. A saída de um circuito sequencial é conectada à entrada de outro.

exemplo de registrador de deslocamento
Exemplo de registrador de deslocamento de 4 bits. Fonte: ASIC Design.

Caso não saiba o que são flip-flops, leia o post sobre o assunto antes de continuar.

Flip-flopsClique aqui

Um exemplo de aplicação do registrador de deslocamento está nas calculadoras eletrônicas, onde um número é deslocado para a esquerda quando você pressiona outra tecla de número.

Paralelo e serial

Os tipos de registradores são divididos de acordo com as entradas e saídas.

tipos de registradores de deslocamento
Nas siglas mostradas, SI = Serial na entrada, SO = Serial na saída, PI = Paralelo na entrada e PO = Paralelo na saída. Fonte: CircuitDigest.

Contador em anel

A saída do último flip-flop é ligada à entrada do primeiro.

Neste circuito, o padrão de saídas se repete a cada determinado número de pulsos, igual ao número de flip-flops. Por exemplo, se tiver 4 flip-flops, o padrão se repetirá a cada 4 pulsos de clock

Registrador de deslocamento bidirecional

Alguns circuitos integrados podem transferir dados em ambas as direções, dependendo da configuração. Possui circuitos combinacionais, uma entrada para determinar a direção da transferência e duas saídas: uma para cada direção.

O circuito integrado 74HC595

Este é um dos circuitos mais populares para projetos com registrador de deslocamento. Tem 8 bits (1 byte), tecnologia CMOS, usa flip-flops tipo D e a tensão de operação é de 2 a 6 V.

pinagem do 74hc595
O diagrama de pinos do 74HC595. Fonte: Conrad.

Explicando a função de cada terminal do chip.

  • Vcc (16) é o pino de alimentação e GND (8) é o terra.
  • Q0 (15) a Q7 (7) são as saídas dos flip-flops.
  • Q7S (9), a saída serial de dados.
  • SHCP (11), a entrada de clock do registrador de deslocamento.
  • DS (14), a entrada serial.
  • OE (13), o habilitador da entrada.
  • STCP (12), o clock do registrador de armazenamento, também conhecido como latch.
  • MR (10), o master reset.

Dentro do 74HC595, há 8 flip-flops que são o registrador de deslocamento, os outros 8 são o registrador de armazenamento. Cada saída (QA a QH) tem um buffer, amplificador de ganho 1. O buffer não amplifica o sinal, mas serve para controlar cargas de maior potência, isolando-as de portas lógicas de potência menor.

diagrama lógico do 74hc595
Diagrama lógico do 74hc595. Fonte: Datasheet do 74HC595.

Projeto com 74HC595 e Arduino

Neste projeto, 16 LEDs são controlados com apenas 3 terminais do Arduino. Conectando 2 74HC595 em cascata.

Projeto-74HC595-e-Arduino
zoom
Imagem ampliada das conexões para melhor visualização.

Para este projeto, você precisa abaixar a biblioteca ShiftOut.h, clique aqui para fazer o download.

#include <ShiftOutMega.h> //Inclui a bilioteca ShiftOutMega.h

int number=0;
//Variáveis de uso dos registradores 74HC595
int latchPin = 8;  //Pino 12 conectado ao pino 12 do 74HC595 (Latch).
int dataPin = 11;  //Pino 13 conectado ao pino 14 do 74HC595 (Data).
int clockPin = 12; //Pino 11 conectado ao pino 11 do 74HC595 (Clock).

//Quantidade de registradores (74HC595).
int qtdRegistradores = 2;

//Um vetor de LEDs
byte leds[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
//Variável que determina a direção.
int direction=1;
int returnled=15;

ShiftOutMega mega(latchPin, dataPin, clockPin, qtdRegistradores); //Inicia a biblioteca passando os parametros de uso.

void setup(){
  Serial.begin(9600);
}

void loop(){
  //Inicializa todos os LEDs como apagados.
  for(int i=0;i<16;i++){
    mega.shiftWrite(leds[i],LOW);
  }
  //Acende o primeiro LED.
  mega.shiftWrite(leds[number],HIGH);
  number += direction; //Segue em uma direção.
  if(number==16){  //Se chega até o último, muda a direção.
    direction=-1;
  }
  if(number==0){ //Se chega até o primeiro, muda a direção.
    direction=1;
  }
}

About Pedro Ney Stroski

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *