Multiplexación de entradas en un microcontrolador

6

Tengo un conmutador DIL de 4 vías que uso para proporcionar información a un microcontrolador, y necesito liberar un puerto para usarlo con otra cosa.

¿Hay una manera de multiplexar 4 entradas en 3 puertos de microcontroladores? Estoy pensando que puede haber alguna forma de tener 2 pines como entradas, y un 3er pin de salida que se puede mover alto para leer los interruptores 1 y 2, y bajo para leer los interruptores 3 y 4.

Mi diseño simple actual se muestra a continuación, ¿puedo hacer esto con solo 3 pines?

    
pregunta BG100

7 respuestas

11

Charlieplexing se aprovecha de los pines del microcontrolador, pero cuesta diodos adicionales y una programación algo más compleja.

Con los N IO-pins puede direccionar los interruptores / LED N (N-1).

El artículo Charlieplexing with switches describe cómo funciona con los interruptores y LEDs

    
respondido por el jippie
5

Lo que describe es un multiplexor de 2 a 1, como el 74HC157 , que es un multiplexor de 2 entradas cuádruple , por lo que 2 entradas a 1 salida y 1 entrada de selección. Usas dos multiplexores para las cuatro entradas.

El 74HC153 hace algo similar, pero es un doble 4-a-1 multiplexor , por lo que 4 entradas, 1 salida y 2 líneas de selección por multiplexor. Personalmente me parece una solución más lógica para su aplicación.

Conecte la entrada de habilitación a tierra, y no olvide conectar las entradas no utilizadas a tierra o Vcc.

    
respondido por el stevenvh
4

Como alternativa a la solución de Steven, puedes usar una demonio 2: 4 como esta:

    
respondido por el Bruno Ferreira
3

Gran solución por jippie . Me gustaría elaborar un poco sobre ello.

El esquema:

La idea es hacer que una de las salidas de E / S y las otras dos entradas le permitan leer el estado de dos botones. Tres veces la salida \ $ \ veces \ $ dos entradas es válida para 6 botones, como se muestra en el esquema.

¿Cómo activo la salida? ¿Hacerlo alto? Hagámoslo para el pin 1, luego los diodos B y F están polarizados hacia delante, por lo que esperamos poder leer esos botones. Para muchos microcontroladores esto no funcionará. Presionar el botón B hará que la entrada 2 sea alta, pero ¿qué sucede si no se presiona el botón? La entrada sería flotante, y entonces no puedes leer nada significativo en ella. Una resistencia desplegable ayudaría, pero muchos microcontroladores solo tienen resistencias elevadoras y nunca leerá un nivel bajo. No conozco a todos, pero al menos un número de microcontroladores AVR y PIC solo tienen dominadas.

En ese caso, la forma correcta es activar los pull-ups internos y activar la salida haciéndolo bajo . No controlamos los botones B y F, sino A y E. Si no se presiona el botón A, el pull-up hará que la entrada 2 sea alta. Presiona el botón A y obtienes la entrada baja.

El algoritmo:

IO2 = input, pull-up enabled
IO3 = input, pull-up enabled
IO1 = output, low
Button_A = IO2 (low = pressed)
Button_E = IO3 (low = pressed)

IO1 = input, pull-up enabled
IO2 = output, low
Button_B = IO1 (low = pressed)
Button_C = IO3 (low = pressed)

IO2 = input, pull-up enabled
IO3 = output, low
Button_F = IO1 (low = pressed)
Button_D = IO3 (low = pressed)

Por lo que sé, todos los controladores NXP Cortex-M, por ejemplo, tienen ambas resistencias configurables de pull-up / pull-down. Para aquellos puede usar la lógica positiva (alta = presionada) si usa los menús desplegables y una salida alta activa. Tenga en cuenta que leerá diferentes botones para la misma salida:

IO2 = input, pull-down enabled
IO3 = input, pull-down enabled
IO1 = output, high
Button_B = IO2 (high = pressed)
Button_F = IO3 (high = pressed)

IO1 = input, pull-down enabled
IO2 = output, high
Button_A = IO1 (low = pressed)
Button_D = IO3 (low = pressed)

IO2 = input, pull-down enabled
IO3 = output, high
Button_E = IO1 (low = pressed)
Button_C = IO3 (low = pressed)
    
respondido por el stevenvh
2

Si puede confiar en sus pines de E / S para cambiar en el mismo umbral, y no le importa desactivar las interrupciones durante mucho tiempo mientras lee los interruptores (por ejemplo, porque acaba de leerlos al inicio), podría use dos pines de E / S, seis resistencias y un capacitor. Cablee una resistencia de 1K, 2.2K, 4.7K y 10K en paralelo con cada interruptor, y cablee todos los interruptores en serie para que la cadena tenga una resistencia total de aproximadamente 0K a 17.9K. Coloque una resistencia de 1K en serie con esa cadena y átela un extremo de la cadena a un pasador de puerto y el otro extremo a un capacitor. El otro extremo del condensador debe ir a tierra. Conecte una resistencia de 10 K desde el otro pin de puerto a ese capacitor.

Para determinar la configuración del interruptor, conecte a tierra ambos pines del puerto y déjelos a tierra durante un tiempo. Luego flote el que está conectado a la cadena de resistencias y accione el que está conectado a la resistencia de 10K. Calcule cuánto tiempo tarda el pin conectado a la cadena de resistencia a subir. Luego, conecte a tierra los dos pines del puerto, déjelos conectados a tierra por un tiempo, y flota el pin conectado al 10K mientras se conduce el pin de la cuerda de la resistencia hacia arriba y determina el tiempo que tarda el switch de 10K en cambiar.

Si los pines cambian a voltajes iguales, la relación de los tiempos será la relación de las resistencias. Como se conoce la resistencia de 10 K, uno puede calcular el otro.

Puede ser posible mejorar la precisión ligeramente utilizando un tercer pin conectado directamente al capacitor para determinar cuándo está cargado adecuadamente; el uso del mismo pin para ambas mediciones aseguraría que ambas mediciones se tomen con el mismo umbral de conmutación.

    
respondido por el supercat
2

Noté que tienes una entrada analógica allí. Si desea utilizar una cantidad mínima de componentes, conecte un lado de todos los interruptores a la entrada analógica y luego conecte la entrada analógica a + V con una resistencia de 1K. Conecte cuatro resistencias de valores diferentes al otro lado de los interruptores. Elija sus resistencias con cuidado para asegurarse de obtener un voltaje diferente, independientemente de cuántos interruptores estén encendidos a la vez. Genere una interrupción cuando el valor de conversión A / D esté cambiando o tenga una rutina que lea el valor con la frecuencia que necesite.

    
respondido por el Gregory Ion
0

Mi enfoque sería utilizar un bus serie I2C / SPI / etc. Podría ejecutarlo en 3 pines y tener un registro de entrada para los conmutadores en ese bus. Si bien es costoso y requiere más bits actualmente, el MCP22017 es bastante flexible. Otras opciones con 8 bits están disponibles si miras a tu alrededor.

    
respondido por el kenny

Lea otras preguntas en las etiquetas