Autor Tema: medicion de angulos  (Leído 8499 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado neco23

  • PIC10
  • *
  • Mensajes: 5
medicion de angulos
« en: 09 de Enero de 2004, 14:19:00 »
a traves del pin ra0/an0 estoy conectando un potenciometro de 5k que me representa un angulo entre 0 y 180 grados. hice la rutina para leer el voltaje que tengo al variar el potenciometro y lo muestro por el lcd, pero ahora tengo que convertir ese nivel de voltaje en grados.
para 0 grados tengo 0 V.
para 180 grados tengo 5 V.
por cada grado tengo 0.027 V.
como hago para que al variar el potenciometro pueda obtener el equivalente en grados.
o si conocen alguna rutina que haga directamente la lectura les agradeceria me lo informaran.
gracias de antemano por su ayuda.

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: medicion de angulos
« Respuesta #1 en: 09 de Enero de 2004, 15:12:00 »
hola neco, si ya lees el pot, lo unico que te falta es hacer una formaula que convierta lo que lees en lo que necesitas
Si para 180 tienes 5 volts, yo haria lo sig;

dim resultado as byte
dim potleido as byte

resultado=(potleido*180)/5
cls
print resultado

Espero que la idea te ayude, chale, ke jeo programo :S, jajaja
Baygon!!

Desconectado elreypic

  • PIC12
  • **
  • Mensajes: 79
RE: medicion de angulos
« Respuesta #2 en: 09 de Enero de 2004, 15:57:00 »
Que tal neco23. Segun observo, lager tiene algo de razon, pero el problema que veo es que la variable potleido es de tipo byte y tu tienes una variable de punto flotante, la ecuacion de lager sería valida si tus operaciones estan siendo realizadas utilizando punto flotante. Si así lo estas haciendo entonces, esta es la solución. Si no, entonces tienes que considerar la la resolucion que estas utilizando en tu ADC. Que quiero decir con esto, el ADC interno de los micros de la series 16F87x son de 10 bits. Lo que significa que la resolucion del ADC es de 4.8876 mV/bit. Esto quiere decir que si tu Pot es lineal al llegar a un grado, que representa un voltaje de 27 mV aprox. el ADC producirá como resultado 6. Esto entonces quiere decir que por cada multiplo de 6 es equivalente a 1 º.

Quiero volver a remarcar, que esto es válido, si y solo si el potenciómetro que estas usando tiene características lineales.

Explicando un poco el funcionamiento del ADC interno del micro PIC16F87X, este es de 10 bits, esto significa que tiene dos registros en donde deposita el valor obtenido al terminar la conversion. Estos valores van de 0 hasta 1023 si los justificas hacia la derecha (debido a que ocupa 1 registro y 2 bits del segundo registro).

Con los datos anteriores puedes generar una tabla y obtener el valor de grados.

Si lo que deseas es tener hasta los grados con decimales, entonces el problema se hace mas complejo, esto debido a que necesitarías primero linealizar el potenciometro (esto debido a que la mayoría de los pots son exponenciales). Despues utilizar rutinas de punto flotante para obtener el valor exacto de grados.

Bueno, no quiero que te desanimes, es solo que esto que asemeja ser sencillo, se puede omplicar tanto como lo requieras. Creo que la mejor opción es con la realización de tablas y medir incrementos de angulo de 1º. Utilizando los valores entregados por el ADC.

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: medicion de angulos
« Respuesta #3 en: 09 de Enero de 2004, 22:42:00 »
Asu!!! :O, pus parece que esta cabron , jajajaja y yo con mis ideas malas, solo quiero ayudar aportando algo de ideas, pero si que esta cañon hacerlo como dice Reypic.
Oye Reypic y como es eso de punto flotantes????? ya que estamos en esto pues aprendo un poco
Weno saludos
y Haber si alguien me puede ayudar a hacer mi codificador
Baygon!

Desconectado elreypic

  • PIC12
  • **
  • Mensajes: 79
RE: medicion de angulos
« Respuesta #4 en: 10 de Enero de 2004, 10:06:00 »
Que tal lager

Pues mira, efectivamente es poco complicado. El punto foltante es por ejemplo, imagina que necesitas realizar un código en el cual tengas que resolver la siguiente ecuacion: V = Ce^kt.  Esta ecuacion representa un exponencial, y aunque picbasic o C sean poderosos, necesitan de librerias o rutinnas para poder resolverlas. Y estas son de punto flotante. Si observamos la ecuacion, vemos que en ella se encuentran dos constantes, vamos a suponer que las conocemos, es decir C = 5 y k =20, al resolver la ecuacion para t = 0.5, el valor de V será 110132.328974. Esto es punto flotante, este valor no lo puedes colocar en una variable de tipo byte, word, doble word, integer. Ya que las características de estas es tener dentro de su contenido rangos de valores enteros, es decir la tipo byte tiene del 0 al 255, entonces el resultado anterior no se puede expresar en este tipo de variables.
Vuelvo a la redundancia, necesitas una variable que sea capaz de almacenar valores flotantes, es decir una variable de tipo flotante.

Este es un proceso algo complicado, por lo que mencionaba que los potenciometros que a menudo utilizamos son exponenciales, y los especiales son algorítmicos y lineales. Pero la mayoría son exponenciales. POr lo que la ecuacion que los define es algo parecido al ejemplo, entonces la pregunta es cómo metemos esa ecuación al micro para que nos de el valor. Y luego después sigue, la exactitud que necesitamos, es decir, queremos que el resultado anterior de 110132.328974 sea 110132.32897 o 110132.329, etc.

Esto dependerá de la exactitud que vayamos a utilizar y puede ser de 24 bits o de 32 bits.

Pero en fin esto es solo una breve reseña, la idea es buscar algo sencillo para mostrar el valor en grados en una pantalla y utilizando el método directo explicado anteriormente, podemos valores de grado en grados decir, 1°, 2°... 180°, y con una correcto desarollo de tablas de hasta 0.5°. Es decir podemos tener una resolucion de 1° o una de 0.5°.

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: medicion de angulos
« Respuesta #5 en: 10 de Enero de 2004, 12:13:00 »
Ahh ya entendi Reypic, y si es cierto por que muchas de las veces queremos valores precisos y estos incluyen valores decimales.
Y si eso pasa? que pasa exactamene cuando se trata de guardar en un modificador entero? gurada mal los valores o solamente no lo guarda? o se queda trabado el pic?
Gracias
Baygon!

Desconectado elreypic

  • PIC12
  • **
  • Mensajes: 79
RE: medicion de angulos
« Respuesta #6 en: 10 de Enero de 2004, 13:42:00 »
Que tal Lager. Ya se te hizo interesante esto del punto flotante verdad?

Pues mira lo primero que pasa es que no vas a obtener los valores en punto flotante, siempre serán enteros y ese seá el valor que guardarás.

En PICBASIC Pro pro ejemplo, es capaz de encontrar los valores de las funciones trigonometricas seno y coseno. Pero, vamos a suponer que quieres hacer un programa de calculadora, en donde introduces el valor del ángulo, entonces internamente lo transformas a radianes (que es lo que convierte, es decir el angulo es expresado en radianes y no en grados Hexagesimales como los conocemos). Esta funciones son capaces de encontrar el valor de un angulo comprendido entre 0 y 255 radianes.

Pero voy a poner un ejemplo mas claro utilizando una division:

Por ejemplo vamoa suponer que necesitas realizar la siguiente operacion.

resultado = 10/3

si tomamos una calculadora,

resultado = 3.3333333333333333333333

pero si esta ecuacion la metemos en PICBASIC por ejemplo y no tenemos rutinas de punto flotante, entonces
resultado será una variable de tipo byte la cual solo podrá tener valores de 0 a 255, lo que quiere decir entonces que, con PICBASIC
 resultado será = "3" y no de 3.33333333333.

Pero entonces cómo resuelvo el problema? La respuesta está en el punto flotante.

Al tener estas rutinas entonces podremos encontrar el resutado esperado de 3.33333.

Estuve ayer estaba navegando en la página de los creadores de PICBASIC, y encontré que tienes rutinas de punto flotante, pero no se si están aplicadas a este tipo de problemas. Las voy a revisar y te prometo darte un mejor ejemplo ya codificado en código, para que así sea mas fácil de comprender.

Te parece?

Entonces dame unso días para analizarlas y después te mando algún ejemplo.

Espero halla contestado a tus preguntas.

ATTE. ELREYPIC

No Busques pretextos para no hacer las cosas, mejor busca razones para hacerlas.

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: medicion de angulos
« Respuesta #7 en: 10 de Enero de 2004, 15:27:00 »
Claro Reypic, ya se que todos andan ocupados, cuando pueda ponl para ver, y efectivamente, solo guarda valores enteros, pero yo no se aun como poder meter valores con decimales, voy a buscar tambien, haber que encuentro, por que son muy necesarios, lo mismo me pasa con los tiempos por ejemplo para poder poner un tiempo de retardo de 20.2 us, tengo que poner delayus 20 y luego dentro del asm,endasm, un NOP para que tarde una instruccion, (con un cristal de 20 mhz).
Saludos
Baygon!

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: medicion de angulos
« Respuesta #8 en: 10 de Enero de 2004, 22:17:00 »
Parece ser que si se puede con PBP PLUS, hacer operaciones con puntos flotantes, en lugar de usar la constante byte o word, etc... se usa la constante FLOAT, queda de la siguiente forma:
" Multiplicando dos valores de punto flotante
   DEVICE = 18F452
   XTAL = 4
   DIM FLT AS FLOAT
   SYMBOL FL_NUM = 1.234   " constante de punto flot.
   CLS
   FLT = FL_NUM *10
   PRINT DEC FLT "imprime el valor en LCD
   STOP

Sacado del manual picbasic PLUS!!, una razon mas para migrar del PRO al PLUS
Los puntos flotantes que contengan mas de 3 operandos no son permitidos en pbp, tambien se pueden usar las variables byte ,word, etc.. pero redondea el resultado decimal, asi que hay que dejarlo en FLOAT
Puede ir de -9999.99 a 9999.99 el valor <--- eso quiere decir que no solo se pueden e 2 decimales, se puede usar mas, pero ocupa mucho mas memoria, asi que ustedes sabran.
luego entonces queda igual pero con FLOAT en lugar de byte:

dim resultado as float
dim potleido as float

resultado=(potleido*180)/5
cls
print dec resultado
end

Baygon!

Desconectado elreypic

  • PIC12
  • **
  • Mensajes: 79
RE: medicion de angulos
« Respuesta #9 en: 11 de Enero de 2004, 20:37:00 »
Excelente Lager, pues si es así entonces ya se resolvió el problema. Si PICBASIC PLUS lo permite, entonces ya estamos del otro lado. Ya estuve viendo las rutinas de PICBASIC PRO y efectivamente son de punto flotante, desafortunadamente casi todas las operaciones son de precision de 24 bits lo que quiere decir que tienen un margen de error relativamente grande. Pero los rangos van mas alla de los de PICBASIC PLUS, debiso a que cumplen cun standar. Por cierto Lager donde puedo conseguir una version completa de PICBASIC PLUS? Tu me la podrías facilitar?
Este PICBASIC PLUS es el famoso protón?

"No busques pretextos par no hacer las cosas, busca razones para hacerlas."

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: medicion de angulos
« Respuesta #10 en: 12 de Enero de 2004, 11:08:00 »
De hecho estos umplen con un estandar IEEE 754 con una resolucion de 32 bits, no se si sirva para el proyecto que quiere nuestro amigo, pero de que da varios decimales los da, El standar de microchip es el 745, pero ahi dice que las diferecnias son minimas.
Calro Reypic, puedes bajartelo de la red de sonsivri, que muchos dicen que esta virulada, pero la verdad yo no e tenido ningun problema, de hecho creo que el problema de esa web es cuando te quieres registrar en su foro, que te piden que desactives tu seguridad frewall, pero nel, una vez que lo hice amanecio mi maquinita con virus, esa a de haber sido la razon de esa CONDICIONANTE, pero por otro lado puedes bajarte el software original de ahi, yo estoy usando el 2.1.3 por que es el completo el que tenen ahi y no tiene ninguna modificacion, y baje de otro lado el KEYGEN. por si las dudas de que ellos engan virus, y no me a dado ningun problema, complia mucho mas rapido, y reduce bastante el codigo hex, a comparacion de el PRo. la pagina es esta:
http://www.sonsivri.com/download/picbasicplus/PicBasicPlus_2.1.3.exe
El crack te lo paso cuando quieras para que no te ariesgues con ellos, te digo que el crack antes de que lo tuvieran ellos, lo encontre por otro lado, pero si quieres arriesgarte bajalo de ahi.
Saludos desde veracruz
Baygon!

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: medicion de angulos
« Respuesta #11 en: 13 de Enero de 2004, 07:11:00 »
Ojo con las rutinas tal cual las ponen en la ayuda de PicBasic !!

SYMBOL   No Crea una variable FLOAT automaticamente !! , contra lo que dicen ellos...

Si quieres una FLOAT, la defines con DIM, y recien despues le adjudicas el valor.
Tampoco funciona asignarle un resultado de una cuenta, por ejemplo FLT= 5.0/1024
Solo anda si declaras otra FLOAT, y la envias a la cuenta.
DIM FLT AS FLOAT
DIM TENSION AS FLOAT
TENSION = 5.0
FLT= TENSION / 1024

Asi si funciona!!
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: medicion de angulos
« Respuesta #12 en: 13 de Enero de 2004, 10:45:00 »
Asi es mi estimado MGLSOFT, pero tambien funciona de la forma antes puesta, , el detalle esta en que se usa SYMBOL para ponerlo como valor determinado, y no variable(CONSTANTE) oki? si todos los puntos flotantes que vamos a usar, van a variar ( VARIABLES) hay que definirlas con dim para dejarlas fijas.
va de nuez:::
DEVICE = 18F452
   XTAL = 4
   DIM FLT AS FLOAT "variable
   SYMBOL FL_NUM = 1.234" CONSTANTE flotante , no variable
   CLS
   FLT = FL_NUM *10
   PRINT DEC FLT
   STOP

Siempre revisen a detalle el codigo, para que no tengan problemas
Si no te sale con esta constante amigo MGLSOFT, revisa si es constante primero como la estas usando, y que version de PBP PLUS (no pro) tienes, ami me funciona bien como te lo digo, como constante, y como variable definiendola en dim.

Saludos desde veracruz
Baygon!!





Una razon mas para migrar a PBP PLUS

Desconectado neco23

  • PIC10
  • *
  • Mensajes: 5
RE: medicion de angulos
« Respuesta #13 en: 15 de Enero de 2004, 16:24:00 »
ya pude realizar la conversion, lo hice a traves de la multiplicacion de los equivalentes entre voltios y grados.
la multiplicacion me genera un numero de 32 bits que tengo que pasar a bcd para poder mostrarlo por el lcd, pero la rutina que hice es para un numero de 16 bits e intente pasarlo a 32 y no me funciona.
esta es la rutina

BITS16_BCD
   movlw   .32
   movwf   contador
   bcf      STATUS,C
   ;clrf   contador
   ;bsf   contador,4
   clrf   BCD_0
   clrf   BCD_1
   clrf   BCD_2
   goto   LOOP_16


LOOP_16
   rlf     resultph, F ; aqui guardo el numero de 32 bits
   rlf     resultpl, F
   rlf     resulth, F
   rlf     resultl, F
   rlf   BCD_2, F ;aqui guardare el resultado
   rlf   BCD_1, F
   rlf   BCD_0, F
   decfsz  contador, F        
   goto    AJUSTE
AJUSTE   movlw    0x33   ; BCD = BCD+333333H
        addwf    BCD_2,F
        addwf    BCD_1,F
        addwf    BCD_0,F
        movlw    0x03
        btfss    BCD_2,3   ; BCD(0>=8?
        subwf    BCD_2,F   ; else: BCD(LSB) = BCD(LSB)-3
       btfss                    BCD_1,3   ; then: BCD(HSB)>=8?
      subwf    BCD_1,F   ;  else: BCD(HSB) = BCD(HSB)-3
        btfss    BCD_0,3   ;  then: BCD(USB)>=8?
        subwf    BCD_0,F   else: BCD(USB) = BCD(USB)-3
        movlw    0x30   ;    then:
        btfss    BCD_2,7   ; BCD(4>=8?
        subwf    BCD_2,F   ; else: BCD(LSB) = BCD(LSB)-30
        btfss    BCD_1,7   ; then:BCD(8:15)>=8?
        subwf    BCD_1,F   ;  else: BCD(HSB) = BCD(HSB)-30
        btfss    BCD_0,7   ;  then: BCD(20:23)>=8?
        subwf    BCD_0,F   ;
       return
no he podido identificar en donde esta el error.
les agradeceria cualquie sugerencia


 

anything