TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: RodrigoAndres en 26 de Octubre de 2015, 14:32:34
-
Saludos a todos. Esta es la situacion:
he estado escribiendo las ecuaciones para calcular la potencia de un motor DC, alimentado por media onda, el cual es controlado por el metodo conocido como "control de fase". resolviendo la integral, me ha dado una ecuacion de la forma P = a*sin(b*t) - c*t +d, donde t es el tiempo de disparo del triac y a,b,c,d son constantes. esta ecuacion no es lineal, entonces para linealizarla (o sea que si aumento el tiempo de forma lineal, la potencia en el motor se incremente de forma lineal) aplique una serie de ecuaciones y he llegado a una ecuacion con la siguiente forma donde debo despejar "X"
t = X - sin(X)
esta ecuacion es conocida como la ecuacion de kepler y se resuelve por el metodo aproximado, sin embargo no se como se puede implementar en lenguaje C del CCS, si alguien me puede ayudar se lo agradeceria mucho. ademas tambien me gustaria que me dijeran cuanto tiempo tardaria el microcontrolador PIC18F a 48Mhz en resolver la ecuacion para un valor de t, a ver si vale la pena implementarla.
SALUDOS.
-
No entiendo como lograste despejar t de ahi..
Es decir llegar desde:
P = a*sin(b*t) - c*t +d
a
t = X - sin(X)
Primero me aseguraria que ambas ecuaciones son equivalentes y correctas, estas seguro de eso ?
Si deberias hacerlo con "aproximaciones sucesivas" como queres simplemente repeti tu formula varias veces hasta que el resultado este dentro de los margenes que vos queres.
En Wikpedia se encuentra el mismo. El tema es que tenes que dar un valor inicial de X aproximado.
Luego un
valorviejo = valornuevo = Xi;
while ( abs(valorviejo - valornuevo) <= 0.01 )
{
valorviejo = valornuevo;
valornuevo = t + sin(valorviejo);
}
Creo que eso te daria tu valor en el cual tendrias una precision de al menos 0.01
Con lo que tarda hacer el seno y la cantidad de repeticiones que puede dar esto, tal ves te convenga aplicar mas la primer formula y listo.
-
Eso se suele hacer con una LUT.
Es una tabla. Vas almacenando el tiempo de disparo para cada potencia de motor.
Para resolver la ecuación, buscas el valor de la solución en la tabla.
También puedes hacerlo con una ecuación lineal (linealizando la tabla)
Si quieres tener menos error, haz varios tramos lineales.
Un saludo.
-
No entiendo como lograste despejar t de ahi..
Es decir llegar desde:
P = a*sin(b*t) - c*t +d
a
t = X - sin(X)
Primero me aseguraria que ambas ecuaciones son equivalentes y correctas, estas seguro de eso ?
Si deberias hacerlo con "aproximaciones sucesivas" como queres simplemente repeti tu formula varias veces hasta que el resultado este dentro de los margenes que vos queres.
En Wikpedia se encuentra el mismo. El tema es que tenes que dar un valor inicial de X aproximado.
Luego un
valorviejo = valornuevo = Xi;
while ( abs(valorviejo - valornuevo) <= 0.01 )
{
valorviejo = valornuevo;
valornuevo = t + sin(valorviejo);
}
Creo que eso te daria tu valor en el cual tendrias una precision de al menos 0.01
Con lo que tarda hacer el seno y la cantidad de repeticiones que puede dar esto, tal ves te convenga aplicar mas la primer formula y listo.
Gracias! ya entendi lo de las aproximaciones, no sabia que era asi. Para llegar a la ecuacion lo que hice fue evaluar las condiciones de frontera, cuando t = 0 la potencia es la maxima porque el triac se dispara en t = 0, y cuando t = 1/2f la potencia es cero porque el triac nunca se dispara.
-
Si vas a hacerlo pensa en el tiempo, sino hacele caso a Picuino.. es mejor hacer una tabla para cada disparo y vas a tener una mayor velocidad.