Autor Tema: Division en punto fijo  (Leído 3310 veces)

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

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Division en punto fijo
« en: 12 de Octubre de 2009, 15:09:31 »
Hola a todos:!

Les escribo ya que tengo una duda sobre la realización de una división en punto fijo. En un proyecto anterior realizé un modulador Space Vector en un dspic 30f3011 y ha funcionado bastante bien. En este tipo de odulación hay paso donde se compara el voltaje que se desea en la salida contra el voltaje disponible, con ol objetivo de determinar el ciclo de trabajo del los moduladores. En ese proyecto no fue un gran problema, ya que al tener una alimentación de voltaje fija, se puede simplemente cambiar esta operación por una multiplicación, donde multiplico por una constante que es igual al inverso del numero sobre el cual quiero dividir.

El detalle que surge en el siguiente proyecto:
Estoy realizando un proyecto que es parte de mi tesis de maestria, en el cual controlo un sistema que inyecta la potencia de un modulo fotovoltaico a la red electrica, en este control
necesito realizar una división entre 2 variables para asi controlar el factor de potencia.

La división la he estado realizando de la siguiente manera:

a/b=elna-lnb

La división la he realizado en datos Q16 para poder obtener valores mayores a uno en caso de que b sea mayor que a. Sin embargo a y b son son 2 números menores que 1,
seria mucho mas eficiente si se pudiera realizar con datos Q15, ya que como sabemos este es un método caro en términos computacionales.

Por eso recurro a ustedes, mi conocimiento en assembler es muy limitado y quisiera saber si alguien ha implementado alguna rutina para dividir números Q15, y obtener una salida
Q16, para asi evitar desbordamiento. Se que suena engorroso, pero cualquier ayuda para apuntarme en la dirección correcta seria una gran ayuda.

Muchas gracias por su tiempo

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Division en punto fijo
« Respuesta #1 en: 12 de Octubre de 2009, 16:39:25 »
Hola!

Si es Q16, ¿Entre cuales valores oscila el resultado?  Tambien, tengo la duda de si a y b son con signo.

Navegando me encontre la operación:

Código: [Seleccionar]
r = ((signed long)a << 15) / b;

Aqui se trata a y b como enteros .... ya el resultado se extiende a un numero de 32 bits, r es un signed long.

La operacion tardó 11us con un dsPIC33F a 40MIPS, habrá que ver si podemos optimizarla en ASM.

Saludos!
Control Automático, DSP & Microcontroladores

Desconectado fram_22

  • PIC18
  • ****
  • Mensajes: 316
Re: Division en punto fijo
« Respuesta #2 en: 12 de Octubre de 2009, 18:50:57 »
En los números Q16 los rangos son:
 de -2147483648 a 2147483647, con resolución decimal de 2-16, es decil 15.2587*10-6

Para la aplicación que estoy utilizando, obtengo resultados que oscilaran entre 1 y 3, sin embargo la resolución decimal se vuelve fundamental y trabajo solamente con positivos.
a y b son valores que varian entre 0 y 1, por lo que pueden ser datos Q15.