teclado adc

6

Click here to load reader

Upload: inalac2

Post on 27-Dec-2015

30 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Teclado ADC

Programa. Diseño de un teclado usando un solo pin del ADC

Por David Infante Sánchez

Fundador de www.comunidadatmel.com

[email protected]

En los programas del curso del CD del programador se vieron varios teclados, uno de ellos

era usar un pin por cada tecla, pero si tenemos 16 teclas ocuparíamos 16 pines;

posteriormente se analizó un teclado matricial y para 16 teclas ocuparíamos una matriz de

4*4, necesitándose 4 pines de entrada y 4 pines de salida para hacer el barrido de las teclas.

Pero hay una forma más económica refiriéndonos al ahorro de pines y es haciendo que cada

tecla genere un voltaje distinto para diferenciarla de otra tecla. Inclusive es la forma en que

los electrodomésticos funcionan como los estéreos de casa que tienen muchas teclas, hacen

que cada tecla genere un voltaje distinto.

Teóricamente si tenemos un ADC de 8 bits podríamos tener hasta 256 teclas, pero en la

práctica no es posible porque las resistencias tienen tolerancias y hay que separar cada tecla

en un voltaje para diferenciar entre cada tecla. Recuerdo que un alumno quería hacer un

teclado matricial que le expliqué, pero luego le expliqué también el teclado con el ADC el

cual le permitió ahorrar muchos pines, pero cuando lo expuso ante otros dijeron que por

qué no lo hizo pin a pin como debería hacerse un teclado y aunque él comentó que así

funcionaban los teclados de los electrodomésticos (que funcionan y se venden por millones)

no aceptaron esta idea, que comento no es nueva, ni invención mía es algo que ya había

visto en algunas notas de aplicación, pero la realidad de la no aceptación de cuando expuso

esa aplicación es porque las personas se van quedando obsoletas y cuando ven algo nuevo y

al no entenderlo se cierran, pero comento esta es la forma en que se manejan los teclado de

todos los electrodomésticos y es a través de la generación de voltajes, y es que esto permite

ahorrar pines en el chip ya que uno sólo pin puede usarse para detectar muchas teclas.

Regresando al tema, veamos la red resistiva de la figura 1:

En el ejemplo las 4 resistencias son de 1Kohm, pero lo importante es que si las 4

resistencias son iguales el voltaje que habrá en los extremos de la resistencia serán: 1.25,

2.5, 3.75 y 5 volts. Entonces si se presiona el B0 Vg=1.25V, si se presiona B1 Vg=2.5, B2

Vg=3.75 y B4=5 volts. Ese Vg es el que aplicamos al pin del ADC del microcontrolador,

pero si no se presiona ninguna tecla ¿qué voltaje habra en Vg? Sería cero, pero resulta que

en el ADC el pin quedará flotado porque no está conectado a ningún potencial, así que el

ADC medirá ruido, así que tenemos que modificar el circuito para fijar el ADC a un

potencial de cero cuando no se presione ninguna tecla, figura 2.

Page 2: Teclado ADC

Figura 1. Voltajes generados con una red resistiva.

En la siguiente figura se aprecia que el Vadc=0 cuando no se presione ninguna tecla porque

está fijado a cero a través de la resistencia de pull down.

Figura 2. Se pone una resistencia mucho más grande que las resistencias del divisor para

disminuir el efecto de carga.

Vea el circuito equivalente de la figura 3 cuando se presiona B0

Page 3: Teclado ADC

Figura 3. Queda en paralelo la resistencia inferior con la R de 100Kohms y es igual a

990.09 ohms

Cuando se presiona el B1 queda en paralelo las 2 resistencias inferiores con la resistencia

de 100 Kohm y su equivalente es de 1960 ohms, en lugar de 2 Kiloohms.

Vemos que al ser grande esa resistencia de 100Kohms su efecto sobre las resistencias del

divisor disminuye, si fuera muy pequeña su efecto modificaría las resistencias del divisor y

por lo tanto sus voltajes. Así que despreciaremos el efecto de carga de esa resistencia y

consideraremos que los voltajes generados son 1.25, 2.5, 3.75 y 5 volts. Si se colocan más

teclas y más resistencias probablemente si requiera ver los voltajes que se generarían

considerando el efecto de la resistencia de pull down.

Page 4: Teclado ADC

Cuando se presiona la tecla B1 se coloca en paralelo las dos resistencias de 1Kohm con la

de 100 Kohm, así que el voltaje en la segunda resistencia no es de 2.5 Volts sino de 2.47

Volts, vemos que el efecto en el voltaje no es muy grande, así que lo seguiremos

considerando de 2.5 volts.

Vamos a suponer que tiene una red de 100 teclas y 100 resistores de 1Kohm y se presiona

la última tecla, la resistencia equivalente sería 100Kohm en paralelo con 100 resistores de 1

Kohm=50 Kohms, en lugar de 100 kohms, así que cuando hay muchas teclas y resistores el

efecto de carga se va haciendo más grande y deberá calcular los voltajes generados cuando

se presione la tecla, pero en el caso de pocas teclas no influiría el efecto de esa resistencia.

Ya sabemos dos cosas: una que mis dibujos tienden a un estilo de cubismo postmodernista

y que al presionarse la tecla de la tabla se genera el voltaje que muestra la misma, pero

suponga que usamos el ADC en 8 bits y el Vref=5volts así que el valor en cuentas es el que

se muestra:

Tecla presionada Voltaje generado Valor en cuentas

B0 1.25 64

B1 2.5 127

B2 3.75 191

B3 5 255

Para sabemos que las resistencias no son exactas así que colocamos un rango de holgura,

vea que entre tecla y tecla hay aproximadamente 64 cuentas de diferencia. Entonces

podemos hacer que el rango para detectar la tecla sean 32 cuentas hacia arriba y 32 hacia

abajo del valor calculado por si la resistencia real es más grande o más pequeña por la

tolerancia.

Recalculamos la tabla anterior agregándole cuentas hacia arriba y hacia abajo quedándonos:

Tecla presionada Valor en cuentas Rango en cuentas

B0 64 32 a 96

B1 127 97 a 159

B2 191 160 a 223

B3 255 Mayor a 223

Con ese rango hacemos que si el voltaje está entre 32 y 96 sabemos que es la tecla B0 la

que se presionó y hacemos inmune la tecla a la tolerancia del resistor o variaciones de

voltaje. En el programa haremos:

if (valor_adc >=32 & Valor_adc<97)

Tecla=0;

Page 5: Teclado ADC

Y esa prueba la haremos para todos los rangos y ver a qué tecla corresponde la que se

presionó según el voltaje (cuentas) que generó la lectura del ADC.

Aunque este programa sólo verifica 4 teclas, bien puede hacer un teclado más grande. La

resistencia de pull down puede modificarla hasta unos 220 Kohms para disminuir más el

efecto de carga.

Vea la configuración de los periféricos en el codewizard.

Arme el siguiente circuito y añada lo que está en azul para que pruebe el programa.

Page 6: Teclado ADC

En el divisor no podemos poner resistencias muy bajas porque aumentaría el consumo de

energía al aumentar la corriente, y no las ponemos tampoco muy elevadas porque sería

grande el efecto de carga con la resistencia de pull down, al circuito sólo agregue la

pantalla de LCD.

while (1)

{

lcd_gotoxy(4,0);

lcd_putsf("Tecla=");

valor=read_adc(0);

if ((valor>=32) && (valor<97))

tecla=0x31; //Tecla=1 en ASCII

if ((valor>=97) && (valor<160))

tecla=0x32; //Tecla=2 en ASCII

if ((valor>=160) && (valor<224))

tecla=0x33; //Tecla=3 en ASCII

if (valor>=224)

tecla=0x34; //Tecla=4 en ASCII

lcd_putchar(tecla);

// Place your code here

};

Si desea un teclado más grande sólo se ocupan más resistores en el divisor de tensión y

recalcular la tabla para ver los voltajes que se generarían y el valor en cuentas de la

conversión.

Hay muchos teclados con el ADC y propuestas de redes resistivas, pero esta es la que se me

ocurrió y me parece factible.

Cuando conecte el circuito el primer valor que desplegará será basura porque la variable

tecla no está inicializada, puede inicializarla en el programa a un valor conocido.

Y para terminar falta el comentario final: No atiendo correos de dudas particulares, sólo

atiendo correo de profesores.