TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: patolinec en 17 de Abril de 2007, 01:21:24

Título: Como puedo obtner el seno de un valor que introduzco en un DSPIC
Publicado por: patolinec en 17 de Abril de 2007, 01:21:24
Hola estoy realizando un circuito en donde necesito ir sacando el valor de la funcion seno de un contador interno, no se si alguien me pudiera dar una idea de como hacerlo, o si el dspic en el C30 tiene alguna libreria incorporada, por cierto estoy trabajando sobre el 30f2010, lo unico que hasta ahora se me a ocurrido es crear una tabla e ir buscando el valor mas proximo
Título: Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
Publicado por: Nocturno en 17 de Abril de 2007, 03:32:29
Imagino que programas en C30. Hay dos funciones que te pueden servir dentro de la librería math.h

SIN: Calculates the trigonometric sine function of a double precision
floating-point value. double sin (double x);

SINF: Calculates the trigonometric sine function of a single precision
floating-point value. float sinf (float x);

De todas formas, si necesitas una precisión relativamente baja, el sistema de buscar valores en una tabla es mucho más económico en cuanto a código generado y tiempo de ejecución.
Título: Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
Publicado por: patolinec en 17 de Abril de 2007, 13:41:14
A ya ya pero una pregunta, la forma de conseguir un valor de una tabla en ensamblador es sencilla pero estoy migrando a C y no se como puedo tomar un valor directamente de una tabla en funcion de un registro previo, por favor eres tan amable de pasarme un ejemplo.
Título: Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
Publicado por: patolinec en 17 de Abril de 2007, 14:15:22
Gracias brother, pero ya consegui la info por ahi  :-/

//****************************************************************
//   array para formar los digitos de 0 a 15 EN FORMATO DE 7SEMENTOS
//   PARA SER MOSTRADOS EN DOS DYSPLAY DE ANODO COMUN
//****************************************************************
byte const DISPLAY[16] =  {0b1000000, //contiene los digitos
                           0b1111001, //0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
                           0b0100100, // en formato para ser mostradosendisplay
                           0b0110000, // de 7segmentos
                           0b0011001,
                           0b0010010,
                           0b0000010,
                           0b1111000,
                           0b0000000,
                           0b0010000,
                           0b0001000,
                           0b0000011,
                           0b1000110,
                           0b0100001,
                           0b0000110,
                           0b0001110,};
//****************************************************************
//      MUESTRA EN DISPLAY DE 7 SEGMENTOS
//****************************************************************

for(i=0;i<15;i++)
{
 portd=display[ i ];     // muestro digito  del 0-15 en 7seg en display en portd
}

De un ejemplo en el foro de C, y lo usa mediante un vector de bytes
Título: Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
Publicado por: Renatox_ en 17 de Abril de 2007, 20:32:56
 Hola Patolinec, si usas un arreglo para hallar los senos, estos valores deben ser flotantes, podrías usar:

const float mis_senos[91]={0, 0.01, 0.04, 0.087, ........, 0.85, 0.93, 1};

float seno,f;
int j;

seno=mis_senos[j]; // j es un entero que va de 0 a 90, que serían los grados

Si por ejm tienes un ángulo de 30.2º, entonces:

f=30.2;
j=(int)f;  // j=30º y lo llevas al arreglo para hallar el seno.

Si obtienes un ángulo mucho mayor entonces tendrías que dividir con escala para que esté en el rango de 0 a 90º, pero esta ya te consume ciclos valiosos, yo he probado la función senf() y toma más o menos 150 ciclos, si tu aplicación no necesita ser tan rápida, mejor usa el senf();

O aumenta la PLL y se acabó :)

 Yo también estoy programando una aplicación que involucra el uso de senos, es para manejar un motor dc hallando las velocidades de los ejes interpolando la trayectoria, entonces tengo que usar seno() y cos(); haciendo unos cálculos iniciales si uso seno() mi motor iría a 1800mm/min y con arreglos iría a más velocidad, entonces con el arreglo ganaría velocidad a costa de precisión, pero con la función gano precisión a costa de velocidad. Cuestión de analizar tiempos y elegir.

Saludos
Título: Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
Publicado por: patolinec en 18 de Abril de 2007, 14:38:03
Pues creo que yo estoy desarrollando un proyecto muy similar, estoy construyendo un variador de frecuencia para un motor de Induccion trifásico y para la modulacion PWM el ducty clicle viene definido por el seno de un angulo, por suerte no necesito sincronizarlo con la red, ayer hice unas pruebas con el vector de senos y funcionó a la perfeccion.
Título: Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
Publicado por: maunix en 19 de Abril de 2007, 14:44:27
Pues creo que yo estoy desarrollando un proyecto muy similar, estoy construyendo un variador de frecuencia para un motor de Induccion trifásico y para la modulacion PWM el ducty clicle viene definido por el seno de un angulo, por suerte no necesito sincronizarlo con la red, ayer hice unas pruebas con el vector de senos y funcionó a la perfeccion.

Entonces creo que la tabla de constantes que sugirió Renatox_ sería ideal para tu proyecto.   Tendrás velocidad y una precisión suficiente.  Si requieres precisión de 0.5 Grados, solo deberás agregar eldoble-1 de valores a la tabla (ya que el 0 aparece una sola vez).

Saludos