Autor Tema: Dudas con datos Fractionales  (Leído 4207 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado niuton

  • PIC10
  • *
  • Mensajes: 21
Dudas con datos Fractionales
« en: 13 de Marzo de 2010, 17:14:25 »
Hola a todos, llevo unos días que no consigo avanzar con el dsPIC en relación a operaciones matemáticas con fractionales, yo estoy empezando con los dsPIC y siempre he usado las variables en formato INT o CHAR, pero nunca he usado fractionales. Bueno les cuento la duda.

Yo estoy leyendo tensiones de 0-5V en el ADC y en principio los recogia en formato "unigned int", pero como el fin es calcular senos y cosenos he leido en el foro que era más eficiente utilizar fractional (usando la libreria dsp.h).

La primera duda es que las operacioenes de muitiplicar se realizan con fractional con signo y yo leo en el ADC fractional sin signo por que de esta forma consigo más precisión. ¿como puedo hacer las multiplicaciones utilizando fractionales sin signo, ya que en la libreria DSP.h esta definido el fractional como INT?.

En la primera prueba lo que quiero hacer es la media de mis valores del ADC, yo leo dos muestras del canal AN0 y quiero calcular la media, pero como el dsPIC multiplica en un ciclo pues en vez de dividir (que tarda 18 ciclos) entre 2 la suma de mis valores, los quiero multiplicar por 0.5. He ahí el problema ¿tendría que convertir el 0.5(float) a fractional?, pero este es con signo y los que leo del ADC es sin signo.

Ufffffff que lio me he hecho!!!! :?, espero que me podais ayudar. Un saludo

Desconectado vtasco

  • PIC12
  • **
  • Mensajes: 72
Re: Dudas con datos Fractionales
« Respuesta #1 en: 13 de Marzo de 2010, 20:24:14 »
hola, si quieres dividir por dos, creo que sería más eficiente desplazar una vez a la derecha la suma de ambas conversiones.

suerte!

Desconectado niuton

  • PIC10
  • *
  • Mensajes: 21
Re: Dudas con datos Fractionales
« Respuesta #2 en: 14 de Marzo de 2010, 05:53:36 »
gracias por contestar vtasco,

He leido sobre lo que me has comentado y el desplazamiento a la derecha realiza una división entera, donde el divisor es 2^n, siendo n el numero de desplazamientos.

Respecto a las multiplicaciones entre fractional sin signo de mi ADC ¿debo pasarlo a fractional con signo? , por que en el momento que realice una operación siempre me coge el valor como fractional con signo y los resultados son erroneos.

Yo tengo el ADC de 12bit y para 5v obtengo el valor unsigned int = 4095 si lo pongo en fractional sin signo obtengo el 0xFFF0 pero al realizar operaciones los coge con signo ya que el MSB es 1 que indica el signo de la parte entera.

¿es posible que sea una tonteria y no esté entendiendo el trabajar con fractionales?

un saludo y gracias.

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Dudas con datos Fractionales
« Respuesta #3 en: 14 de Marzo de 2010, 14:30:54 »
declara la variable como unsigned de forma explícita, algo así

usigned int ADC_Read, así la tendrás en formato entero sin signo y el compilador debería tratarla como tal.

si lo que quieres es guardar el valor en un flotante, basta con declarar la variable como float:

float ADC_Read por lo que el compilador deberá atenderla como una variable de coma flotante y generar código para realizar operaciones en este formato. Como los dsPIC tienen una unidad de procesamiento en coma flotante e instrucciones para ello, debería generarse código para operar con datos de este tipo utilizando las instrucciones para ello.

Saludos
Reinier

Desconectado niuton

  • PIC10
  • *
  • Mensajes: 21
Re: Dudas con datos Fractionales
« Respuesta #4 en: 14 de Marzo de 2010, 20:52:09 »
Hola y gracias reiniertl,

en un principio pense en utilizar el float pero dado que tarda al rededor de 260 ciclos en las conversiones de float a fractional y ya que el dsPIC esta optimizado para fractionales, pues me decidi a utilizarlo  :), pero me esta costando entenderlo  :?.

He hecho unas rutinas para convertir de int a fract y viceversa; según he leido solo es necesario aplicar un escalado dividiendo o multiplicando por 2^15 = 32768. La conversión de int a fract no funciona por que se supone que hay que dividir entre 2^15 que es equivalente a desplazar a la derecha 15 lugares o multiplicar por 0,000030517578125. pues no consigo hacerlo funcionar.

si desplazo >>15 siempre sale 0.
en la multiplicación no se como hacerlo ya que este valor es float y la función mac o mul usan int o fract.

Código: [Seleccionar]
fractional integer2fract(int valor){
register int res_A asm("A");
fractional resul = Q15(0.0);

res_A= __builtin_mac(valor,[b] ¿QUE VALOR DEBO PONER AQUÍ?[/b], NULL, NULL, 0, NULL, NULL, 0,0);
resul = __builtin_sac(res_A, 0);

//resul = valor>>15; //Desplaza a la derecha 15 lugares para pasarlo a fractional

return(resul);

a ver si me podéis aclarar, BYE

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Dudas con datos Fractionales
« Respuesta #5 en: 17 de Marzo de 2010, 11:22:53 »
Hola!

Si queres hacer multiplicaciones en formato fractional, hace tiempo se discutió eso, no recuerdo donde pero aqui hay un pequeño resumen:

http://www.todopic.com.ar/foros/index.php?topic=25386.msg207519#msg207519
Control Automático, DSP & Microcontroladores

Desconectado niuton

  • PIC10
  • *
  • Mensajes: 21
Re: Dudas con datos Fractionales
« Respuesta #6 en: 22 de Marzo de 2010, 18:45:43 »
Hola blackcat, gracias por esponder y por la info, ese hilo lo he visto, junto con este otro donde hay una breve reseña al fractional

http://www.todopic.com.ar/foros/index.php?topic=14639.40

El problema es que me esta costando entender el funcionamiento con los fractionales, por que se supone que son enteros pero depende de la interpretación que tu hagas, y el lio empieza cuando quiero multiplicar int con fractionales. por eso empece por hacer la conversión, y no lo he conseguido hacerlo, por que no devuelve lo que debe  :?.

Bueno seguiré buscando, si veis algo que esté haciendo mal comentadmelo.

Bye y gracias

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Dudas con datos Fractionales
« Respuesta #7 en: 22 de Marzo de 2010, 21:06:08 »
El detalle de los fractional (Q16) es que no podes representar numeros mayores a 0.9999 o menores que -1 ... entonces no tiene sentido que multipliques por enteros.

Como tu dices el tipo FRACTIONAL es un entero comun y corriente pero se le da una interpretacion diferente.



Control Automático, DSP & Microcontroladores