uControl
Enero 20, 2017, 06:48:22 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: como corregir medicion conversor a/d si se desvaloriza un componente  (Leído 817 veces)
0 Usuarios y 1 Visitante están viendo este tema.
johenrod
PIC16F
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 530


El que paga lo que debe .....a pedir se enseña.


« : Agosto 01, 2016, 12:01:44 »

cordial saludo,
Trato de hacer un arreglo de resistencias en serie y en las uniones de estas un pulsador para que a la salida pueda tomar un valor de 0 a 5 voltios y leerlo en un conversor ad de un pic, por decir algo si tengo un conversor de 255 cuando tenga 128 asumiría que tengo 2.5 voltios hasta ahí todo bien, podría diseñar mi aplicación; pero que ocurre si se desvaloriza una resistencia o un pulsador se pone sucio cambia la medición, así sea un poco - entonces  ya no se ejecutaría la función que programe para esta medición.
Hay alguna forma de colocar una tolerancia por encima y por debajo de 128 parta que aun así me funcione. O que se hace en estos casos?
Es algo como lo que pasa en los tv que con el tiempo al oprimir los botones ejecutan otra acción y hay que reemplazarlos.
Gracias por leer mi pregunta y por vuestra ayuda,,,
En línea
supercurro
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 235



WWW
« Respuesta #1 : Agosto 01, 2016, 05:57:53 »

Puedes hacerlas por programa con la sentencia IF y darle un mergen de voltage ejemplo

If vol>=2.4 and vol<=2.6 Then ........

Yo lo resolveria de esta manera dando el margen que necesites.

Saludos

P.D.

Esto seria en basic, perdona no me fije que estava puesto en ASM.
« Última modificación: Agosto 01, 2016, 06:01:54 por supercurro » En línea

tsk
PIC10F
*
Desconectado Desconectado

Sexo: Masculino
Mensajes: 62


« Respuesta #2 : Agosto 01, 2016, 09:39:54 »

Que tal.

Puedes transformar tu problema a uno mas simple, esto es algo que se me acaba de ocurrir que puedes hacer, hice una pequeña prueba en python y al parecer podría funcionar, y transformarías dos comparaciones en 1, la cual podría ser programada dependiendo de los rangos que quieras tener.

Tu punto medio es 128, que en binario es 0b10000000.

A la hora de leer un valor en el ADC de forma inmediata puedes saber si esta arriba o abajo de 128 con tan sólo observar el bit más significativo.

Si esta abajo de 128, por ejemplo 125, tendrías el siguiente valor el binario:

Código:
0b01111101

Por lo que haces un simple not a todos y cada uno de los bits de la lectura, quedando el siguiente valor en binario:

Código:
0b10000010

o 130 en decimal

En seguida tienes dos opciones:
La primera opción consiste en comparar el resultado con un valor superior a 128 y obtener si el resultado es mayor. Si es mayor entonces no se hace nada, de lo contrario consideras que esta dentro del rango de valores permitidos

Por ejemplo: Tienes en total 2**8 – 1 pasos que van de 0 a 5 volts, dando aproximadamente 0.0196 volts por paso.

Ahora supone que quieras darle un rango de +/- 0.1 del valor central 2.5 para tener un rango de 2.4 a 2.6

Código:
0.2V/0.0196V = 10.204

Por lo que un valor cercano para comparar podría ser el 133 (128+5 = 133 ) dando un total de un rango de 12 pasos (en lugar de los 10.204) o +/- 0.1176

Porque 12 pasos?

Porque en el centro tenemos dos valores de 128, uno proveniente del mismo 128 y el otro proveniente de negar 127.


Código:
[134, 133, 132, 131, 130, 129, 128, 128, 129, 130, 131, 132, 133, 134]

Restando 128 para que te des una mejor idea de lo que sucede alrededor de tu valor central.

Código:
[6, 5, 4, 3, 2, 1, 0, 0, 1, 2, 3, 4, 5, 6]


La otra opción es restar 128 para en lugar de comparar con un número como 133 puedas comprar con un número mas simple como el 5.

Este es el programa hecho en python, que hice para probar la idea.

Código:
def flip(string):
    new_string=''
    for val in string:
        if val == '1':
            new_string+='0'
        else:
            new_string+='1'

    return new_string

new_values = []
for i in range(256):
    txt = "{0:08b}".format(i)
    if txt[0] == '0':
        txt = flip(txt)
    print i,"{0:08b}".format(i), txt
    new_values.append(int(txt,2))


print(new_values)

new_values_m128 = [x-128 for x in new_values]

print(new_values_m128)

Saludos
En línea

pk2cmd -PBrain -FPonte_a_trabajar.hex -M
Not Success
Brain device not found
el_vpi
Moderador
PIC18F
******
Desconectado Desconectado

Mensajes: 1344



« Respuesta #3 : Agosto 02, 2016, 08:48:13 »

a ver... todas las ideas estan buenas, y rondan en lo mismo, pero.... creo que deberías primero ver el problema antes de la solucion.

Es un arreglo de resistencias, cuantos "taps" tendra ? 6, 8 o 2 ? Eso podria definir la banda de histeresis para deteccion.
Son resistencias de carbon, MF ? la variacion  del valor de una de esas por si solas es bajo, ya que si por ejm tenes un ambiente con temperatura, todas variaran igual, o sea las relaciones se mantienen.
Si hablamos de pulsadores, tendriamos que ver si son mecanicos, resistivos (control remoto), o un integrado. Aqui la dispersion es grande si tenemos un problema, y la solucion inicial seria la eleccion de las resistencias del divisor de acuerdo al tipo de pulsador. Siempre es preferible que el metodo de conmutacion tenga muy poca injerencia, o sea proporcionalmente bajo.
Si es pulsador mecanico (Ron < 0.1 ohm) las R pueden ser de algunos K, pero si es resistivo (Ron ~ 1K) el divisor deberá ser de algunos M y ya complica un poco la cosa.

Bueno, habiendo "pateado" el tablero, jejeje. Idiota duda las soluciones de supercurro y tsk me parecen que son las apropiadas luego de ver o definir tus "bandas" de histeresis para los valores.

Saludos, el_vpi.
En línea
johenrod
PIC16F
***
Desconectado Desconectado

Sexo: Masculino
Mensajes: 530


El que paga lo que debe .....a pedir se enseña.


« Respuesta #4 : Septiembre 13, 2016, 02:56:19 »

Cordial saludo, muchas gracias por sus respuestas, las cuales me han ayudado a encarar el diseño, la realidad es que apenas estoy haciendo mis primeros programas en "C" y estoy super encarretado, creo que la solución estaría como lo expone supercurro debido a que  lo que debo hacer es medir varios pulsadores y aquí entra lo que dice el"_vpi" por que si la medición la realizo en base a ref 5 voltios 10 bits de resolución, debo construir un margen entre las mediciones de los pulsadores por encima y por debajo de cada lectura que debo realizar.
Entonces como puedo  chequear todos los botones? Colocando un if por cada pulsador?
Voy a intentarlo y les cuento, a todos gracias,,

Creo que este tema esta mas encarado a “C” por lo que si los moderadores lo estiman conveniente por favor lo muden al apartado correspondiente, gracias.
En línea
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.06 segundos con 24 consultas. (Pretty URLs adds 0.009s, 2q)