Autor Tema: Como puedo obtner el seno de un valor que introduzco en un DSPIC  (Leído 3197 veces)

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

Desconectado patolinec

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 206
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
Casi me maté pero ahora estoy de nuevo vivo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
« Respuesta #1 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.

Desconectado patolinec

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 206
Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
« Respuesta #2 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.
Casi me maté pero ahora estoy de nuevo vivo

Desconectado patolinec

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 206
Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
« Respuesta #3 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
Casi me maté pero ahora estoy de nuevo vivo

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
« Respuesta #4 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
control de movimiento

Desconectado patolinec

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 206
Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
« Respuesta #5 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.
Casi me maté pero ahora estoy de nuevo vivo

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Como puedo obtner el seno de un valor que introduzco en un DSPIC
« Respuesta #6 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




- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)