Autor Tema: Acertijo  (Leído 7165 veces)

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

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5172
Re: Acertijo
« Respuesta #30 en: 29 de Abril de 2012, 12:44:57 »
Hay documentación de Microchip. Si la encuentras no hace falta hacer el diagrama.

Saludos.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Acertijo
« Respuesta #31 en: 29 de Abril de 2012, 12:50:01 »
Ya la encontre, segun el Microchip "Tips 'n Tricks" se pueden conectar D diodos usando Gp pines de acuerdo a la ecuacion:

D=Gp* (Gp-1).

entonces con Gp=4 serian 4*3=12 leds.
"Nada es imposible, no si puedes imaginarlo"

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5172
Re: Acertijo
« Respuesta #32 en: 29 de Abril de 2012, 12:53:28 »
 ((:-)) ((:-))

Tengo un problema realmente complicado, ¿Lo lanzo?

Saludos.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Acertijo
« Respuesta #33 en: 29 de Abril de 2012, 12:54:22 »
Si, a ver.  :mrgreen:
"Nada es imposible, no si puedes imaginarlo"

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5172
Re: Acertijo
« Respuesta #34 en: 29 de Abril de 2012, 13:04:24 »
Tengo una aplicación que necesita calcular la función seno y la función coseno para saber en que coordenadas X e Y se encuentra un manipulador que gira sobre su eje.
Un encoder me da información del giro del brazo y debo calcular las coordenadas.

Las funciónes seno y coseno no necesitan tener mucha precisión, bastará con 3 decimales (error absoluto del 0.1%) para localizar con exactitud la posición.
El microcontrolador debe calcular las funciones muy rápido, de manera que sólo se permiten cuatro multiplicaciones y dos sumas para calcular cada una de las funciones.

La memoria es limitada de manera que el programa en total con datos incluidos no puede sobrepasar 2Kbyte.


¿Cómo se podría realizar?

Saludos.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Acertijo
« Respuesta #35 en: 29 de Abril de 2012, 13:07:57 »
Lo primero que se me ocurre es usar una tabla donde ya tengas guardados los valores tanto del seno o del coseno.

otra opcion creo que seria usar alguna serie para aproximarte a estas 2 funciones, pero no creo que con 2 multiplicaciones se obtenga una buena aproximacion.


sigo pensando... :idea:
"Nada es imposible, no si puedes imaginarlo"

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5172
Re: Acertijo
« Respuesta #36 en: 29 de Abril de 2012, 14:13:11 »
¿Doy pistas?

Saludos

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Acertijo
« Respuesta #37 en: 29 de Abril de 2012, 14:21:24 »
y si usas coordenadas polares en lugar de cartesianas?
"Nada es imposible, no si puedes imaginarlo"

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5172
Re: Acertijo
« Respuesta #38 en: 29 de Abril de 2012, 14:22:39 »
La tabla podría ser una opción, utilizando la interpolación.

Las series son un poco lentas. También sería otra opción a tener en cuenta. Así calculaba el primer Basic de Microsoft la función seno (y todo el Basic ocupaba menos de 4Kbytes!)

La solución más elegante es otra y es la que se suele utilizar en las calculadoras y compiladores en C

Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5172
Re: Acertijo
« Respuesta #39 en: 29 de Abril de 2012, 14:24:24 »
y si usas coordenadas polares en lugar de cartesianas?

Entonces no hay problema (podría ser una solución).

Pero el problema aquí es calcular la función seno con precisión, rápidamente y sin consumo de memoria.

Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5172
Re: Acertijo
« Respuesta #40 en: 29 de Abril de 2012, 15:14:10 »
El problema se podría resolver con una tabla de 16 posiciones entre 0 y 90 grados.

Como la tabla tiene 16 posiciones, sería fácil encontrar la posición de un elemento tomando los cuatro bits más significativos del ángulo (con un ángulo entre 0 y 4096 pulsos de encoder para toda la circunferencia)

Ángulo del encoder:
   0 pulsos = 0 grados
   1023 pulsos = 90 grados.



La interpolación se calcula así:

X=ángulo (pulsos)    Y=seno(ángulo)
0                             0.0000        
63                            0.0966
127                          0.1938
...

seno(x) = Y0 + (Y1-Y0) * (x - X0) / (X1-X0)

donde (X1-X0) siempre vale 64 y se puede sustituir por una multiplicación (más rápida):
1 / (X1 - X0) = 1 / 64 = 0.0156

seno(x) = Y0 + (Y1-Y0) * (x - X0) * 0.0156

Se resuelve todo con una búsqueda en tabla de datos (inmediata), tres sumas y dos multiplicaciones.



Otra simplificación a la interpolación:
La multiplicación y la suma  (Y1-Y0) * 0.0156 se podrían añadir a la tabla y con eso todavía se reducen más las operaciones:

X=Angulo (pulsos)    Y=seno        (Y1-Y0) * 0.0156
0                             0.0000         0,001509
63                            0.0966         0,001519
127                          0.1938         0,001489


seno(x) = Y0 + (x - X0) * [(Y1-Y0) * 0.0156]

seno(95) = 0.0966 + (95 - 63) * 0.001519 = 0.14521

Resultado real = seno(95*90/1023) = 0.14535
Error = 0.00014

Todo resuelto con una búsqueda, una multiplicación y dos sumas

Ahora que lo he calculado creo que esta sería la respuesta más eficiente. De todas formas hay otra respuesta válida que es la que realmente preguntaba.

Saludos.


« Última modificación: 29 de Abril de 2012, 15:16:27 por Picuino »

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Acertijo
« Respuesta #41 en: 29 de Abril de 2012, 15:18:42 »
no seria mas facil tener los valores almacenados en una tabla, sin tener que hacer ninguna operacion solo leer el valor correspondiente al valor leido del encoder?.
con un switch (encoder)
case 0:
 sin=0
break;
case 1:
sin=#//regresar el valor correspondiente a ese grado
break:

y asi, aunque serian muchos cases
"Nada es imposible, no si puedes imaginarlo"

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5172
Re: Acertijo
« Respuesta #42 en: 29 de Abril de 2012, 15:21:44 »
Entonces tendrías una tabla de 4096 posiciones con 2 bytes como mínimo en cada posición para poder tener precisión.
El resultado es 8192 posiciones para el seno y otras tantas para el coseno. Para muchos micros es prohibitivo.


Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5172
Re: Acertijo
« Respuesta #43 en: 29 de Abril de 2012, 17:02:37 »
Este es un problema más que un acertijo y además es bastante dificil.
Voy a dar la solución y buscamos otro acertijo:

Las funciones seno, coseno, logaritmo, etc se calculan en las calculadoras y en los lenguajes de alto nivel como C o basic, con polinomios.
En concreto se utilizan polinomios de Chebyshev que son los que tienen un error mínimo. Hay libros en los que aparecen los coeficientes para calcular cada función (por ejemplo las tablas matemáticas del Abramovich)
Para este caso, como se pide un error de 0.001 se pueden utilizar polinomios bastante simples con sólo 3 coeficientes:
 
COS(x/90) = 0.9994 - X^2 · (1.223 - X^2 · 0.2239)

Los grados se dan con un número entre 0 y 1 para representar de 0 a 90 grados.


Ejemplo:

cos(25º) = COS(25/90) = COS(0.27778) = 0.9994 - 0.27778^2 · (1.223 - 0.27778^2 · 0.2239) = 0.90636

en realidad cos(25º) = 0.90631 con lo que el error es 0.0005



Buscaré un acertijo para colgarle. Si otro forero tiene alguno y quiere postearlo, adelante.


Saludos.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Acertijo
« Respuesta #44 en: 29 de Abril de 2012, 17:22:43 »
muy bueno, ya vi la definicion de los polinomios de Chebyshev,  no conocia esa aproximacion.  ;-)
"Nada es imposible, no si puedes imaginarlo"