IC para contar el número de entradas que están activadas?

0

Tengo 8 cables, y quiero contar cuántos de estos están en un estado alto y convertirlos en una señal binaria de 3 bits. Si el recuento de entradas que son altas es mayor que 4, no me importa en qué cantidad exacta de entradas haya superado ese punto, solo necesito saber si más de 4 son altas. Así que solo necesito 3 bits de salida, si eso tiene sentido.

es decir, si 1 cable está encendido, salida 001, si 2 cables están encendidos, salida 010, etc. y si 7 u 8 cables están en la salida 111.

¿Hay algún IC que pueda ayudarme a hacer esto fácilmente?

    
pregunta Gus

3 respuestas

7

Este es un trabajo simple para un microcontrolador. Spehro señala correctamente que se puede lograr con una búsqueda simple. Si puedes tolerar una velocidad más baja, contar los bits en un bucle también lo hará, pero tomará menos espacio de código.

Otra forma es hacer esto en analógico. Coloque una resistencia de 100 kΩ en serie con cada salida digital, luego aliméntela en un comparador. Si 4 de 8 son altos, entonces obtienes 0.50 del voltaje de alimentación. Si 3 de 8 son altos, entonces obtienes 0.38 del voltaje de alimentación. Establezca el umbral del comparador en 0,44 de la oferta y distinguirá entre 4 o más, y 3 o menos.

    
respondido por el Olin Lathrop
7

Un microcontrolador podría hacerlo muy fácilmente. Como solo hay 256 combinaciones posibles, una tabla de búsqueda simple sería la forma más rápida. (Hice lo que se muestra a continuación, obteniendo 8 para todos los altos por coherencia, puede cambiar la última entrada a 7 si lo desea).

El código podría tener este aspecto: -

unsigned char lut[256] = {0x0, 0x1, 0x1, 0x2, 0x1, 0x2, 0x2, 0x3, 0x1, 0x2, 0x2, 0x3, 0x2, 0x3, 0x3, 0x4, 0x1, 0x2, 0x2, 0x3, 0x2, 0x3, 0x3, 0x4, 0x2, 0x3, 0x3, 0x4, 0x3, 0x4, 0x4, 0x5, 0x1, 0x2, 0x2, 0x3, 0x2, 0x3, 0x3, 0x4, 0x2, 0x3, 0x3, 0x4, 0x3, 0x4, 0x4, 0x5, 0x2, 0x3, 0x3, 0x4, 0x3, 0x4, 0x4, 0x5, 0x3, 0x4, 0x4, 0x5, 0x4, 0x5, 0x5, 0x6, 0x1, 0x2, 0x2, 0x3, 0x2, 0x3, 0x3, 0x4, 0x2, 0x3, 0x3, 0x4, 0x3, 0x4, 0x4, 0x5, 0x2, 0x3, 0x3, 0x4, 0x3, 0x4, 0x4, 0x5, 0x3, 0x4, 0x4, 0x5, 0x4, 0x5, 0x5, 0x6, 0x2, 0x3, 0x3, 0x4, 0x3, 0x4, 0x4, 0x5, 0x3, 0x4, 0x4, 0x5, 0x4, 0x5, 0x5, 0x6, 0x3, 0x4, 0x4, 0x5, 0x4, 0x5, 0x5, 0x6, 0x4, 0x5, 0x5, 0x6, 0x5, 0x6, 0x6, 0x7, 0x1, 0x2, 0x2, 0x3, 0x2, 0x3, 0x3, 0x4, 0x2, 0x3, 0x3, 0x4, 0x3, 0x4, 0x4, 0x5, 0x2, 0x3, 0x3, 0x4, 0x3, 0x4, 0x4, 0x5, 0x3, 0x4, 0x4, 0x5, 0x4, 0x5, 0x5, 0x6, 0x2, 0x3, 0x3, 0x4, 0x3, 0x4, 0x4, 0x5, 0x3, 0x4, 0x4, 0x5, 0x4, 0x5, 0x5, 0x6, 0x3, 0x4, 0x4, 0x5, 0x4, 0x5, 0x5, 0x6, 0x4, 0x5, 0x5, 0x6, 0x5, 0x6, 0x6, 0x7, 0x2, 0x3, 0x3, 0x4, 0x3, 0x4, 0x4, 0x5, 0x3, 0x4, 0x4, 0x5, 0x4, 0x5, 0x5, 0x6, 0x3, 0x4, 0x4, 0x5, 0x4, 0x5, 0x5, 0x6, 0x4, 0x5, 0x5, 0x6, 0x5, 0x6, 0x6, 0x7, 0x3, 0x4, 0x4, 0x5, 0x4, 0x5, 0x5, 0x6, 0x4, 0x5, 0x5, 0x6, 0x5, 0x6, 0x6, 0x7, 0x4, 0x5, 0x5, 0x6, 0x5, 0x6, 0x6, 0x7, 0x5, 0x6, 0x6, 0x7, 0x6, 0x7, 0x7, 0x8}; 

    <some initialization stuff>

    for(;;) out_port= lut[in_port];  // do this forever

No conozco ningún chip lógico que tenga esta funcionalidad exacta. Los codificadores de prioridad hacen algo un poco diferente.

Si necesita un tiempo de respuesta realmente rápido, puede programar una memoria no volátil con la tabla de búsqueda, o usar una lógica programable.

    
respondido por el Spehro Pefhany
1

¿No debería hacer un truco un sumador completo de 4 bits?

enlace

    
respondido por el Barry

Lea otras preguntas en las etiquetas