TODOPIC
Microcontroladores PIC => dsPIC => Mensaje iniciado 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
-
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.
-
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.
-
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
-
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
-
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.
-
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