Autor Tema: Control PID digital para motor DC  (Leído 41102 veces)

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

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Control PID digital para motor DC
« en: 04 de Agosto de 2007, 00:22:35 »
Hola como están, aquí de nuevo; ahora estoy en pleno desarrollo de un proyecto para controlar tanto velocidad como posición de un motor DC usando el dspic. El motor funciona a 24v y tiene un encoder de 300 ranuras.

Ya tengo la respuesta en lazo abierto adquirida con el módulo QEI cada 5mseg, muestro los resultados para 5 entradas de voltaje:



Pero estoy con el problema de que no se como identificar la función de transferencia de segundo orden del motor. Que programa en Matlab me permite identificar la planta..? ingresandole como datos el vector de salida, el vector de tiempo y el valor de entrada:

y=[.. ..  ..  ..];
t=[.. .. .. .. ..];
x=Voltaje;

Lo busco pero no lo encuentro, supongo que debe haber asi como lo hay para filtros,

Si se suman al proyecto mucho mejor, avanzamos.

gracias
« Última modificación: 17 de Enero de 2008, 13:25:52 por Renatox_ »
control de movimiento

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Control PID digital para motor DC
« Respuesta #1 en: 04 de Agosto de 2007, 01:43:40 »
Hola.

No ando muy bien con Matlab (bien oxidado si  :D ), pero quizá te sirva este tema:
http://www.todopic.com.ar/foros/index.php?topic=14074.0

Si no te sirve, mándale un mensaje a Joel (pantera) o un correo electrónico para ver si te puede ayudar. Él anda con conocimiento fresco de matlab precisamente en lo que respecta a ecuación de transferencia.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #2 en: 04 de Agosto de 2007, 22:33:15 »
Hola Mario gracias por el enlace lo ley todo y Pantera logró hallar la función de transferencia de su motor pero no explicó muy bien como lo hizo parece que uso un código propio y no lo posteó.

Hay un método de identificación paramétrica llamada ARMAX parece que por ahi podría encontrar la solución, he estado leyendo el help pero aun no comprendo bien esto, tendré averiguar más, si alguien sabe de estos métodos ARMAX, ARX, etc que me de una manito.

También si se han fijado en las respuestas en lazo abierto, el tiempo de establecimiento no es el mismo para todos, varía un poco entre 50 a 100mseg aprox, asi que tendría 5 plantas muy parecidas, que podría hacer en este caso?, ya que el motor no es completamente lineal como nos han enseñado en teoría y era de esperarse eso.

saludos
control de movimiento

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #3 en: 06 de Agosto de 2007, 13:25:48 »
Hola Renatox

 Para identificar sistemas, matlab tiene un toolbox que se llama ident, ahi podes estimar modelos parametricos y compararlos, pero tambien se puede estimar modelos por separado sin utilizar le toolbox...

 Antes de utilizar el toolbox, debes acomodar cada curva en un vector separado, es decir, las curvas de salida debe ir en y1, y2, y3, etc como tantas curvas pusiste, y hacer lo mismo con las entradas que pusiste para cada curva de salida, es decir, x1, x2, x3, etc ... el tiempo no es necesario ponerlo pero si es importante  saber el tiempo de muestreo, en este caso, 5ms. Te recomiendo que vuelvas a medir las curvas y des almenos como 5 muestras en cero, es decir, el vector de entrada y salida para la curva roja ( la 1 ) se verian asi:

x1 = [0 0 0 0 0 5 5 5 5 5 5 5 5 ]  (NO SE QUE TENSION PUSISTE EN ESA CURVA LA ¡¡¡SUPUSE!!! COMO 5V)
y1 = [0 0 0 0 0 10 80 85 90 ....]  (ESTOY SUPONIENDO!!)

No se si me entiendes, debes hacer lo mismo con las otras curvas puesto que no vi que graficaras el vector de entrada

x2 = [0 0 0 0 0 ... valor de tension de entrada en el motor de la curva rosada] (la tension que pusiste a la curva rosada con las primeras muestras en cero)
y2 = [0 0 0 0 0 ... Valores de la curva rosada]

y asi sucesivamente, todos los vectores deben tener la misma cantidad de elementos. Las muestras en cero son necesarias porque el metodo de identificacion necesita de muestras iniciales.

Ahora ya estomos listos para aplicar IDENT, y ponemos en matlab:

>>ident
 
Se abre un entorno grafico, arriba de los cuadros del lado izquierdo donde dice IMPORT DATA seleccionamos TIME DOMAIN DATA .. inmediatamente se nos abre una ventana que dice IMPORT DATA, en WORKSPACE VARIABLE en el campo de INPUT digitamos el primer vector de entrada x1 y en OUTPUT el vector de salida correspondiente a esa entrada, y1 .... le damos IMPORT y YES a todo... veremos que uno de los cuadros derechos tendrá una imagen con una curva con un color, si le damos click la deselccionamos y la imagen NO queda con el color resaltado y si le damos click nuevamente se selecciona y la imagen queda con el color resaltado, esto es para habilitar y deshabilitar las muestras ... la dejamos habilitada. Ahora importamos las otras curvas ... Segun tus datos tendriamos 5 curvas, lo que es igual a 5 imagenes en el lado izquierdo ...  EL ESTIMADOR NO UTILIZA TODAS LAS CURVAS SOLO UNA, DEBES ESTIMAR UN MODELO PARA CADA CURVA Y SELECCIONAR EL MEJOR, para estimar un modelo debes seleccionar una de las imagenes del lado izquierdo y soltar donde dice WORKING DATA en el centro de la pantalla, veras que la curva de working data cambia de color segun la curva que deseamos estimar.

Para estimar, damos en ESTIMATE, en el centro de la pantalla, seleccionamos LINEAR PARAMETRIC MODELS... se abre otra ventana en donde podemos seleccionar el tipo de estimador, cada estimador es muy parecido, difieren en la estructura y en donde esta hubicado la señal de ruidosa, el OE es el mas basico porque supone que el ruido se suma en la salida del sistema, los demas calculan subsistemas para el ruido, para empezar seleccionamos OE,  ahora en donde dice ORDERS seleccionamos el los ordenes de las ecuaciones ... OE supone el sistema de esta manera
         
          B(z)
  y = -------- · x + e, donde B(z) es el numerador del sistema, F(z) el denominador del sistema, x es la entrada (nuestro vector de muestras x1),
          F(z)

                               y: la salida del sistema ( vector y1), y e: es una estimacion de la señal ruidosa.


en ORDERS se acomoda el orden del B(z), luego F(z) y por ultimo una suposicion de los retardos del sistema, pongamos en ORDER: 2 2 1, osea orden 2 y con un retardo. Si ponemos 0 en retardos puede que la estimacion sea incorrecta y poco precisa. Tambien podemos ponerle un nombre en NAME dejemolo en OE221

En esa misma ventana damos click a ESTIMATE para comenzar la estimacion, a los pocos segundos, matlab estima un modelo OE, al lado derecho de la pantalla principal se colocan los modelos estimados, en MODEL VIEW justamente debajo de los cuadros del lado derecho, seleccionamos MODEL OUTPUT y veremos la curva de los datos que importamos y la curva estimada OE, si agregamos otros modelos ARX, ARMAX, se podra comparar cual es que mejor se ajusta con el indicador BEST FIT.

Digamos que OE fue el que mejor se ajustó, para pasarlo al area de trabajo en matlab seleccionamos y soltamos la imagen de OE221 ( la que se puso en los cuadros del lado izquierdo ) en el cuadrito que dice TO WORKSPACE debajo de estimate .... Esto exporta el modelo al area de trabajo en matlab. En matlab podremos conocer los coeficientes del sistema digitando

>>OE221   // o el nombre que le pusiste

y nos mostrara algo como asi

Discrete-time IDPOLY model: y(t) = [B(q)/F(q)]u(t) + e(t)
B(q) = 0.7902 q^-1 - 0.2952 q^-2                         
                                                         
F(q) = 1 + 0.9383 q^-1 + 0.6106 q^-2                     
                                                         
Estimated using PEM from data set mydata                 
Loss function 0.00757948 and FPE 0.0227384               
Sampling interval: 1

Vemos que matlab calculó B(z) y F(z) para acceder a esos vectores podemos dar:

>> oe221.b

ans =

         0    0.7902   -0.2952

y

>> oe221.f

ans =

    1.0000    0.9383    0.6106


y para pasarlo como un sistema:

>> H = tf(oe221.b, oe221.f, 0.005)
 
Transfer function:
   0.7902 z - 0.2952
-----------------------
z^2 + 0.9383 z + 0.6106
 
Sampling time: 0.005



***** POR ULTIMO, podemos utilzar SISOTOOL para calcular un compensador....


Saludos... Espero que te sirva esta explicacion..


en: http://www.ie.itcr.ac.cr/einteriano/control2/Laboratorio/3.Models.pdf

hay un pdf con una explicacion sobre los estimadores ARX, ARMAX, OE, etc ...






 

 
« Última modificación: 06 de Agosto de 2007, 13:41:33 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #4 en: 06 de Agosto de 2007, 14:23:56 »
Hola ... se me olvido recomendarte que mejor generes una señal tipo rectangular con diferentes amplitudes... algo como en la imagen que envio...

el motor tendrá diferentes niveles y el estimador calculara un mejor modelo
Control Automático, DSP & Microcontroladores

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #5 en: 07 de Agosto de 2007, 12:32:10 »
Hola blackcat muchas gracias por la información te pasaste, me ha servido de mucha ayuda, para mi mala suerte no tengo el Matlab R2006a, tengo el Matlab 7 que no tiene el IDENT, asi que lo probé en la UNI todos los pasos y llegué hallar la TF con un 94.3% de precisión usando la estimación OE.

Postearé los resultados después primero voy a actualizarme.

Sobre la toma de muestras usando una señal rectangular como referencia no lo había pensado, tendría que probarlo. Por ejm en motores pequeños de 30w, como el que uso, cuando se baja la tensión de 10v a 0v el motor llega a 0rpm en aprox.0.5seg pero esto lo probé en un motor dc de 2HP y 90V bajándolo de 60v a 0v pero la frenada dura 4seg aprox. y la subida dura 0.5seg aprox.

Pensaba que los tiempos de subida y bajada en el motor dc eran iguales pero no es así. Asi que no se si esto afectaría al estimador para hallar la TF.

nos vemos,

saludos
control de movimiento

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #6 en: 14 de Enero de 2008, 19:12:46 »
Hola Blackat he sacado ya la data de mi motor le di 12 escalones (DC=15,30,45,30,15,0,-15,-30,-45,-30,-15,0 %) el Vmax=87v, T=0.001seg, tomé la data tanto del voltaje de entrada como la velocidad de salida en tiempo real. Esta es mi data:



Apliqué dos métodos el oe221 que me dio un 94.9% de presicióny el ARX221 con un 90.2%, Esta es la TF discreta para el ARX221:

Gpz=tf(arx221.b, arx221.a, 0.001)
 
Transfer function:
 0.02891 z - 0.02891
-------------------------
z^2 - 1.99 z + 0.9897
 
Sampling time: 0.001

Grafiqué la respuesta al step del ARX y del OE y me di con la sorpresa que el OE empezaba en los primeros 10 puntos con velocidades negativas, el ARX en cambio si empezaba desde 0rad/seg. que raro a pesar que el OE me dio mayor porcentaje de presición no debiera empezar con velocidades menores a 0.

También hallé la TF hallando los parámetros del motor R, L, Kv. Kt, B, J y obtuve una TF discreta parecida, es esta:

>> Gps=tf([0.3601],[7.2e-6 0.01085 0.1368])
 
Transfer function:
             0.3601
-----------------------------------------
7.2e-006 s^2 + 0.01085 s + 0.1368
 
>> Gpz=c2d(Gps,T,'zoh')
 
Transfer function:
 0.01602 z + 0.009773
--------------------------
z^2 - 1.212 z + 0.2216
 
Sampling time: 0.001

Para hallar la TF de posición solo hay que agregarle el integrador. Decidí usar la segunda TF para mi diseño de control de posición, usé un compensador de segundo orden con un polo en z=1 (integrador) y apliqué el método del lugar de las raices para un sobreimpulso y tiempo de establecimiento deseados. Y los resultados fueron muy buenos mejor de lo que esperada, le di una rampa de 60rpm con 6vueltas a la derecha y 6 a la izquierda como referencia y el error de posicion no era mayor a 0.1º
control de movimiento

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: Control PID digital para motor DC
« Respuesta #7 en: 14 de Enero de 2008, 20:33:07 »
También hallé la TF hallando los parámetros del motor R, L, Kv. Kt, B, J..."

¿Cómo encontraste los parámetros?

¿Cuáles fueron los pasos para obtenerlos?

¿El motor tenía una hoja de datos?
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #8 en: 14 de Enero de 2008, 20:47:31 »
Ahora tengo un problema serio con el módulo del encoder que solo me permite contar como máximo 2^16, estoy usando un encoder de 2500 ranuras osea 10000 pulsos, es por eso que solo estoy controlando al motor como máximo a 6vueltas. He hecho una pequeña rutina para que vaya acumulando los pulsos del POSCNT y lo hice funcionar pero después de 25 minutos el motor saltó como descocido y se quemó el fusible, lo probé otras dos veces y volvió a fallar de la misma forma luego de varios minutos. Controlandolo dentro de las 6 vueltas no pasa eso. Esta es mi pequeña ruina que he hecho para acumular los pulsos.

MAXCNT=10000-1;

Fórmula:   PULSOS=10000*vueltas+CNT;
donde:   PULSOS=pulsos absolutos
             vueltas= número de vueltas, puede ser positivo o negativo
             CNT=POSCNT=registro del encoder medido cada 1mseg o en la interrupción de QEI


La idea es entrar en interrupción por encoder cada ves que se complete una vuelta y aumentar o disminuir el registro "vueltas" dependiendo si la cuenta ha ido hacia arriba o hacia abajo, de esta forma hallo las cuentas absolutas y no estoy limitado por el la capacidad del encoder.


Código: [Seleccionar]
void __attribute__((interrupt, no_auto_psv))  _QEIInterrupt(void)
{
   if (_UPDN==1)
    {  vueltas++; }
    else
     {  vueltas--; }
   CNT=POSCNT;
   IFS2bits.QEIIF=0;
}

void __attribute__((interrupt, no_auto_psv))  _T1Interrupt(void)
{  // esto ocurre cada 1mseg
   CNT=POSCNT; 
   ......
}

int main(void)
{
    ....
    while(1)
     {
            ...
            //aquí va rutina del compensador, medida de posición, pwm, etc
            // fíormula para hallar los pulsos absolutos
            PULSOS=10000*vueltas+CNT;
     }
}

Me estará faltando algo?, porque después de varios minutos el motor se vuelve loco, será que el bit UPDN no trabaja bien a nivel hardware?.  también me sale el mensaje de licencia expirada al compilar:

The MPLAB C30 license has expired.
pic30-coff-cc1.exe: warning: Options have been disabled due to expired license

Quería preguntales que otro método se puede usar para contar los pulsos absolutos de posición. Blackat tu estás desarrollando control de motor ac que lei en otro post, como estás llevando la cuenta absoluta de posición, has tenido problemas?.

saludos;

control de movimiento

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #9 en: 14 de Enero de 2008, 20:53:31 »
Excelente ... que bien se siente cuando los resultados teoricos calzan con los resultados experimentales ....

Yo tambien he estado haciendo pruebas en motores .. Segun me explicaron cuando estimamos un sistema solo estimamos el comportamiento del sistema ante las frecuencias contenidas en nuestra señal de estimulo, si generamos un modelo y aplicamos una señal de determinada frecuencia y esa frecuencia no la habiamos considerado en la señal de estimulo es posible que el comportamiento practico sea diferente al comportamiento teorico ... por eso es bueno reconocer primero el ancho de banda en el que opera el sistema y apartir de ese dato se puede generar una señal que abarque tales frecuencias o al menos la mayoria de componentes ...

Podes comprobar cuales frecuencias continen tu señal usando la funcion bode de MATLAB.

Una señal rectangular de periodo aleatorio es una buena señal de estimulo porque solo una señla rectagular de periodo constante contine un buen espectro de frecuencias, ahora si el periodo es aleatorio este abarca un espectro mas amplio y por ende un modelo mas preciso.

Quiza esos errores en el modelo de OE se debe a que el estimador utiliza muestras pasadas para realizar el calculo, como estas estimando desde la muestra 0, el estimador no conoce el comportamiento del sistema antes de esas muestras, y por si solo el algoritmo las asume como 0, por eso, es buena practica tomar las primeras 5 o 10 muestras ( o N muestras para N orden de modelo)  sin aplicar estimulo, es decir tomas unas cuantas muestras con el sistema quieto, y luego de eso comenzar el estimulo.


Saludos y te felicito por tus resultados!!!  :mrgreen: :mrgreen:


Control Automático, DSP & Microcontroladores

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #10 en: 14 de Enero de 2008, 21:07:54 »
Mario puedes ver mi procedimiento completo en este hilo, los valores que ahi aparece los he cambiado un poco porque ahora estoy con otro motor.

procedimiento

La TF hallada no es exactamente la real, pero sirve para como base para diseñar un controlador y/o compensador,

un saludo.
control de movimiento

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #11 en: 14 de Enero de 2008, 21:28:39 »
Bueno jejeje ... :mrgreen:   :mrgreen: todavia no he podido usar el QEI ... primero porque no tengo encoder y segundo porque apenas estoy montando el circuito para eso ....

El señor NOCTURNO creo que tiene un tutorial y mas experiencia en eso ... pero entiendo que lo que necesitas es conocer la posicion del motor. .. con el metodo que estas utilizando se esta saturando el regitro PULSOS, si el motor gira continuamente mas de 6 vueltas en una direccion el registro PULSOS retorna a 0, ... quiza ese metodo acumulativo no es conveniente puesto que por mas grande que sea el registro acumulativo cabe la posibilidad que se sature  ... 

Si tenes 10000 cuentas por vuelta creo que el contador no debe superar ese valor, mas bien cuando sea mayor de 10000 debe retornar a cero, y a partir de eso deducir la posicion:

0º -> 0 cuentas
360º -> 10000 cuentas ...


Voy a leer bien el QEI  y como de todos modos lo tengo que hacer ... voy a pensar una solucion ... ! Y hacer mi propuesta!

Siento mucho no haberte respondido!!  :(


En que post leiste eso??
« Última modificación: 14 de Enero de 2008, 21:31:16 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #12 en: 14 de Enero de 2008, 21:40:04 »
Ahorita ahorita estoy leyendo

http://ww1.microchip.com/downloads/en/devicedoc/93002A.pdf

Es un pdf de microchip sobre como medir posicion y velocidad en QEI ... no si ya citaste eso para tu investigacion??

Lo lei y esta bastante claro .. ahora podes calcular el angulo en formato fraccional y usar las rutinas PID de la libreria de microchip!



« Última modificación: 14 de Enero de 2008, 22:09:10 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #13 en: 14 de Enero de 2008, 22:31:55 »
No, no lo tengo ahora lo estoy leyendo gracias por el dato, entonces busquemos una solución ya que los dos lo necesitamos y también una manera de recibir correctamente por software los pulsos de posición y el bit de dirección de sentido de giro, ya que el dspic lastimosamente no tiene un timer ascendente-descendente externo. Ahora la referencia de posición lo genera internamente el dspic o se lo envia el labview por puerto serie.

POS es un long int, no se satura mi programa funciona muy bien por varios minutos ante entrada rampa (rampa limitada a 6 vueltas a la derecha y a la izquierda), para que se sature debería acumular más de 2^31 pulsos, tengo temor que pueda haber un error a nivel de hardware pero seguiré probando y ver en que me puedo estar equivocando.

Una correción, mi primer método para medir la posición absoluta no está limitado a las 6vueltas, tiene la capacidad de contar un long int (+-2^31 pulsos), este es mi procedimiento:

Código: [Seleccionar]
void __attribute__((interrupt, no_auto_psv))  _T1Interrupt(void)
{  // esto ocurre cada 1mseg
   CNT=POSCNT; 
   POSCNT=0;
   ......
}

int main(void)
{
    ....
    while(1)
     {
            ...
            //aquí va rutina del compensador, medida de posición, pwm, etc
            // fíormula para hallar los pulsos absolutos
            CNTp=CNTp+CNT;
            pos.act=0.4e-3*CNTp;   // posición actual absoluta
            ...
     }
}

Sencillamente cuento los pulsos que entran cada 1mseg y luego borro el POSCNT, esos pulsos los voy acumulando en un registro CNTp(long int). Con esto no tengo ningun problema y el compensador funciona todo el tiempo muy bien.

Pero porque no me quedo con este método dirán, ya que cuenta en absoluto hasta una cantidad de 2^31, bueno hay pérdida de pulsos, conforme pasan los segundos se van perdiendo pulsos, esto lo chequié con otro dspic en paralelo, ante una entrada rampa limitada a 6 vueltas. El dspic principal contando los pulsos con el método de arriba y el dspic en paralelo cuenta los pulsos directamente del POSCNT si resetearlo a cero.

El método de conteo de pulsos que me falla a los 25 minutos, haciendo saltar al motor, también le hice su comparación con el dspic en paralelo, y si dan resultados iguales

saludos.
control de movimiento

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #14 en: 14 de Enero de 2008, 23:13:58 »
Tengo varias preguntas ...

-> No se si podes poner todas las caracteristicas del encoder y la velocidad maxima del motor

-> A como veo el codigo CNT se actualiza cada 1ms, entiendo que estas haciendo un control de posicion del motor ... osea un servo.. pero cada cuanto se ejecuta la linea??? :

          CNTp=CNTp+CNT;

Asi como veo el codigo el while(1) hace que sumes muchas veces .. a velocidad del micro ... el mismo valor de CNT dentro de ese 1ms,  el acumulador deberia actualizarse tambien cada 1ms ... de la manera que lo expones es posible que se sature CNTp ..


Creo que debes sincronizar que cada 1ms ejecute el calculo de posicion absoluta y luego el compensador ...


Código: [Seleccionar]

void __attribute__((interrupt, no_auto_psv))  _T1Interrupt(void)
{  // esto ocurre cada 1mseg
   CNT=POSCNT; 
   POSCNT=0;
   ......

  Sample = 1;    // OK ... SAMPLE es una bandera que me dice cuando debo ejecutar el comp y todo el calculo

}

int main(void)
{
    ....
    while(1)
     {
           Sample = 0;

           while( Sample == 0 );    // ESTO HACE QUE EL COMPENSADOR SE EJECUTE CADA 1MS

            ...
            //aquí va rutina del compensador, medida de posición, pwm, etc
            // fíormula para hallar los pulsos absolutos
            CNTp=CNTp+CNT;
            pos.act=0.4e-3*CNTp;   // posición actual absoluta
            ...
     }
}



En un sistema de control debes definir un tiempo de muestreo para ejecutar el compensador a ese tiempo ..... creo que eso lo sabes porque de los resultados teoricos veo que usas 1ms .... lo que no veo es en el codigo esa implementacion ... tal vez podrias incluirla para entender mejor

Saludos

« Última modificación: 14 de Enero de 2008, 23:31:57 por blackcat »
Control Automático, DSP & Microcontroladores