martes, 22 de mayo de 2012

[CÓMPUTO INTEGRADO] Multiplexación

En mi proyecto utilicé 3 displays y un solo decodificador, sin embargo un decodificador solo tiene 7 salidas para los 7 pines del display, y comprar un decodificador por display es algo no muy óptimo tanto en cuestión de energía como en cuestión económica.

La forma correcta de utilizar estos es utilizando una técnica llamada multiplexación. La multiplexación es la combinación de dos o más canales de información en un solo medio de transmisión usando un dispositivo llamado multiplexor.

La multiplexación permite utilizar un decodificador para una cantidad de displays dada, esta cantidad depende del total de microsegundos que asignes entre cada display.

Una vez que ya tengas tu programa que haga algo relacionado con contar números puedes proceder a multiplexar. La técnica funciona de esta manera:
  1. Se enciende el pin del display a utilizar.
  2. Se llama a la parte del programa que muestra el primer dígito.
  3. Se encienden los pines del decodificador.
  4. Se hace un delay de unos cuantos microsegundos.
  5. Se apaga el pin del display.
  6. Se repite el proceso.
Algo importante a tomar en cuenta es que el delay que se hace entre displays afecta la forma en que se muestran los dígitos. Para 3 displays, un delay de 10 ms funciona perfecto, pero al aumentarlo a 15, se puede ver como parpadean los leds de los displays.

Para una cantidad mayor de displays se requiere un delay menor, 6 displays se verían bien con 5 ms. para cantidades mayores de displays, podría haber problemas de visualización, por lo que se puede agregar un segundo decodificador y hacer una doble multiplexación, o bien mediante el mismo método multiplexar los decodificadores, ya que sirve para cualquier componente, no solo displays.

Existen multiplexores TTL que ya hacen el trabajo por nosotros, pero bien se pueden programar multiplexores en cualquier microcontrolador.

Desde el mismo arduino se puede hacer este proceso, y de una manera más sencilla.

En el siguiente sketch de arduino se muestra la forma en que se multiplexa 3 displays para un contador, está basado en mi proyecto que es precisamente un contador de correos pero modificado para que solo sea un contador por tiempo, cabe destacar que entre mayor sea el delay entre displays, el contador se vuelve más lento y se nota el parpadeo.

// Pines del decodificador
int A = 13;
int B = 12;
int C = 11;
int D = 10;

int x = 0, y = 0, z = 0; // Cifras del valor serial individuales
int time1 = millis();
int time2= time1;
void setup()
{
  pinMode(A, OUTPUT); // Pines del decodificador como salidas
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(9, OUTPUT);  
  digitalWrite(9, HIGH);
  
}

void loop() {
    display_values();
    multiplex();
}

void display_values() {
    x++;
    if (x == 10){
      x = 0;
      y++;
    }
    if (y == 10){
      y=0;
      z++;
    }
    if (z == 10){
      x=0;
      y=0;
      z=0;
    }
}

void dec_bin(int value){
  if (value == 0){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 1){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 2){
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 3){
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, LOW);
    digitalWrite(D, LOW);
  }
    else if (value == 4){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 5){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 6){
    digitalWrite(A, LOW);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 7){
    digitalWrite(A, HIGH);
    digitalWrite(B, HIGH);
    digitalWrite(C, HIGH);
    digitalWrite(D, LOW);
  }
    else if (value == 8){
    digitalWrite(A, LOW);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
  }
    else if (value == 9){
    digitalWrite(A, HIGH);
    digitalWrite(B, LOW);
    digitalWrite(C, LOW);
    digitalWrite(D, HIGH);
  }
}

void multiplex(){
        dec_bin(x);
        digitalWrite(3, HIGH);
        delay(10);
        dec_bin(y);
        digitalWrite(3, LOW);
        digitalWrite(4, HIGH);
        delay(10);
        dec_bin(z);
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        delay(10);
        digitalWrite(5, LOW);
      }

1 comentario: