TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: Renatox_ en 04 de Agosto de 2007, 00:22:35

Título: Control PID digital para motor DC
Publicado por: Renatox_ 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:

(http://img241.imageshack.us/img241/2898/datanv4.png)

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
Título: Re: Control PID digital para motor DC
Publicado por: Mario 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.
Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ 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
Título: Re: Control PID digital para motor DC
Publicado por: blackcat 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 ...






 

 
Título: Re: Control PID digital para motor DC
Publicado por: blackcat 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
Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ 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
Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ 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:

(http://img513.imageshack.us/img513/2821/f2lq0.jpg)

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º
Título: Re: Control PID digital para motor DC
Publicado por: Mario 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?
Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ 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;

Título: Re: Control PID digital para motor DC
Publicado por: blackcat 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:


Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ 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 (http://www.robotsperu.org/foros/simulacion-en-pspice-y-matlab-de-un-motor-dc-vt330.html)

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

un saludo.
Título: Re: Control PID digital para motor DC
Publicado por: blackcat 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??
Título: Re: Control PID digital para motor DC
Publicado por: blackcat en 14 de Enero de 2008, 21:40:04
Ahorita ahorita estoy leyendo

http://ww1.microchip.com/downloads/en/devicedoc/93002A.pdf (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!



Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ 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.
Título: Re: Control PID digital para motor DC
Publicado por: blackcat 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

Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ en 14 de Enero de 2008, 23:47:33
Hola blackat, si debi ponerlo más detallado quité parte del código pensando que se iba a entender mejor, aquí va:

Código: [Seleccionar]
void __attribute__((interrupt, no_auto_psv))  _T1Interrupt(void)
{  // esto ocurre cada 1mseg
   CNT=POSCNT; 
   POSCNT=0;
   orden='B'  // permiso para entrar a la rutina del compensador
   ......
}

int main(void)
{
    ....
    while(1)
     {   
            if (orden=='B')
             {  ...
                 //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 mm
                 orden='X';   //no volverá a entrar hasta el próximo mseg.
                 ...
              }
     }
}

* Encoder de 250ranuras canal A y B. En el encoder 10 000 pulsos por vuelta (modo x4)
* Vel max=2600RPM a 87V
* Entonces yendo a Vel max. cada pulso duraría =2600*10000/(60*10^6)=0.43pulsos/useg.
Suficiente tiempo para que termine una interrupción por QEI.
Título: Re: Control PID digital para motor DC
Publicado por: blackcat en 15 de Enero de 2008, 15:47:41
La verdad no me gusta esa forma de medir la posicion .. puesto que es acumulativa y no representa bien la posicion del motor, digamos, antes de dar la primera vuelta la representacion es correcta, es decir, de 0  a 360º ... cuando da una vuelta tiene como base 360º .. osea la representacion va de 360º a 720º, y asi sucesivamente, ... tal vez esa forma sea correcta si estaa usando una caja reductora de 6:1 y el encoder lo tenes en el eje del motor, asi si me parece bien, pero con esa forma despues de dar 6 vueltas el contador deberia retornar a cero y no seguir acumulando porque insisto es muy probable que el registro se sature ...

Ahora, dices que estas perdiendo pulsos, no creo que le modulo QEI este malo, lo mas probable es que tengas mucho ruido en las señales del encoder, yo pondria compuertas Schmitt Trigger ( puede ser el 74HC7014 ) para mejorar la señal .. y activaria los filtros digitales

Tambien, entiendo que estas usando un compensador PID, no se si el que traee la libreria DSP de microchip o una implementacion personal ...
si estas usando la libreria de DSP de microchip recorda que eso esta en punto fijo en formato 1.15
si es una implementacion personal deberias usar punto flotante y medir cuanto dura el micro calculado la muestra de salida y esta no deberia ser mayor a 1ms... de hecho, un criterio es que el tiempo de calculo debe ser un decimo del tiempo de muestreo, en este caso, 100us, con ello se elige la velocidad de procesamiento y el sistema digital. Ademas no creo que el tiempo de calculo dure mas de 1ms, yo hice un PID y lo que me duraba era como 50us a 40MIPS, pero considere no realizar muchas operaciones ni muchas conversiones.

Por ultimo, recuerda que el Integrador de un PID es sumamente sensible, el integrador es un aqcumulador, en una correcta implementacion del integrador el algoritmo deberia evitar desbordamientos y por lo general se usa un saturador a la salida del integrador que evita que se siga sumando al acumulador cuando el acumulador llego a su valor maximo o minimo    ...  ademas ... el integrador es el ultimo parametro que se ajusta!! ... 


Saludos


Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ en 17 de Enero de 2008, 14:34:00
Hola, ya pude solucionar el error, era solo la forma como definía la variable CNT estaba como long int, la cambié por int y el motor funcionó bien contando en absoluto los pulsos que llegaban del encoder sin perder ningun pulso.

int CNT=0, vueltas=0;
long int PULSOS=0;

CNT=POSCNT;
PULSOS=10000*vueltas+CNT;

Gracias por el pdf, me sirvió para calcular el filtro óptimo para el encoder, también vi que usan filtros RC conectados directamente a las salidas de los dos canales A y B. Si estoy usando un disparador Schmitt Trigger.

Inicialemente usé un PID pero el seteo de los parámetros es critico, no se tiene mucho margen de ganancia integral y si esta era mucha el motor empezaba a responder subamortiguado osea vibraba mucho hasta que se descontrolaba. Lo que uso es un compensador con una integral (polo en z=1) de esta forma:
 
Zero/pole/gain:
          Kc*(z-0.9893) (z-0.8095)
contr=------------------------------
                 (z-1) (z+0.56)
 
Transfer function:
          Kc*(z^2 - 1.799 z + 0.8008)
contr=---------------------------------
                z^2 - 0.44 z - 0.56
 
Sampling time: 0.001

Lo hallé por el método LGR (condición de ángulo y magnitud), la ganancia teórica óptima es de 50000 pero en la práctica no más de 20000, mas allá de este valor el motor empieza a vibrar fuerte. El error teórico es menos de 10^-7mm (cero) en la práctica es menos de 0.001mm con rampas menores a 250rpm y cero ante escalones, esto si el motor es conectado a un tornillo de 4mm de paso. Solo es un lazo de posición, pero responde bien a las perturbaciones de torque.

Todo el lazo me dura unos 600useg aprox, incluye el compensador, lectura del encoder, límite de error de posición, escalón de salida, voltaje de salida límite, comunicación SPI, generador de trayectoria de referencia, PWM. También le he puesto interrupciones por si ocurre fallas de oscilador, direccionamiento, matemática o de pila. Lo que sigue es programar el módulo de posición (pulsos de referencia y dirección) aquí el dspic si que le falta no tiene un timer descendente-ascendente asíncrono externo.

Inicialmete estaba probando con la librería pid en punto fijo para un lazo de velocidad y si lo llegué a controlar, pero por más que cambiaba los valores pid el motor no mejoraba su respuesta, no manejo bien el punto fijo tengo una deuda con eso.

Los PIC32 son más potentes en operaciones con punto flotante que los dspic, pueden hacer una multiplicación en 1useg, espero que saquen pronto los dspic32 o a lo mejor ya lo llamaran DSP32.

Tu proyecto es para un motor dc o ac.

saludos.
Título: Re: Control PID digital para motor DC
Publicado por: blackcat en 17 de Enero de 2008, 15:06:26
El proyecto que estoy haciendo no es de apliacion espefica .. es un modulo de adquisicion de varias con interfaces .. una de ellas es el QEI ... pero de igual manera el sistema debe ser capaz de controlar ambos CA y CD...

ahorita estoy trabajando en un motor servo CD, es decir, el sistema ya tiene su propio control (analógico), pero estoy mejorarndo la respuesta del sistema usando mi proyecto ....

En ese proyecto estoy usando la libreria de PID y de filtros IIR, por ende estoy usando punto fijo, de un principio comence usando punto flotante pero me estaba durando mucho el tiempo de calculo y necesitaba al menos 1ms de muestreo, en ese calculo debia hacer:

-> la conversion AD ( 6 - 8us aprox )
-> calcular un filtro paso bajos digital,
-> un compensador, por lo menos de orden 4,
-> saturar si se pasaba de cierto valor.
-> sacar el dato por DAC ( 10us aprox )

 ... todo eso me estaba durando 800us, estaba bien, pero dentro del sistema tengo un RTOS y eso tambien tiene codigo que calcular y no me funcionaba bien..

 ... cuando cambie a punto fijo no me sentia muy contento porque el punto fijo tiene un margen de error mucho mayor al punto flotante pero el tiempo de calculo se mejoro bastante ... de 800us pase a 40us!!!! ....  y la verdad no note el cambio en la respuesta del servo .. se comportaba igual igual...

Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ en 17 de Enero de 2008, 22:25:50
Si es un driver analógico supongo que ya tiene el lazo de velocidad y corriente, o solo velocidad incluido y reciben una referencia de velocidad por medio de un voltaje analógico.  tengo unas dudas.

* Porqué necesitas un filtro en el dspic, vas a sensar corriente?
* El compensador que has diseñado es para el lazo de posición,? porqué lo has diseñado de un  orden tan alto, y cuantos integradores hay en tu sistema.
* Al unir las tierras de tu controlador con la del driver analógico no has tenido problemas con el ruido y medición en los sensores?.

Hay que tener en cuenta también la distancia que separa tu controlador del driver, si son por ejm 2m la señal de la DAC ya no es la misma.

saludos.
Título: Re: Control PID digital para motor DC
Publicado por: blackcat en 18 de Enero de 2008, 16:56:04
Hola ..


(http://img245.imageshack.us/img245/4268/servomotoroq4.jpg)


Te adjunto un diagrama del sistema ... como ves el sistema por si solo es un servomotor .. la entrada es una señal de referencia para mover el eje y opcionalmente tiene la salida del potenciómetro que es el "sensor de posición" para monitoreo; el problema es que el control es solamente una ganancia dada por el amplificador de potencia y no tiene algún tipo de control mas avanzado, con este control se tiene un sobre impulso de  3.3% y un error de 6.25%; la idea es mejorar esa respuesta sin alterar el mecanismo, con esto me refiero a no desconectar nada ni desarmar nada dentro del servo ...

(http://img237.imageshack.us/img237/6723/applet1cz7.jpg)

Como te mencione antes en el proyecto se puede ajustar controles mas bien de hasta orden 10, y se pueden poner en cascada varios controles, ... esto es una exageración ...  :D :D :D ... pero el proyecto en si es para propositos educativos entonces nunca falta algun baboso que calcule un control mayor a orden 2...

Las salida y entrada del servo son analógicas, como el sistema es digital ajusté un filtro analógico pasobajos Bessel en una frecuencia de corte a 125Hz, esto con el fin de evitar aliasing porque el sistema digital muestrea maximo a 1ms, a esta velocidad de muestreo lo normal es poner el filtro a 500Hz, pero en realidad el servo no tiene una respuesta mayor a 100 Hz. El proyecto es capaz de ajustar cualquier frecuencia de muestreo, el problema es que si ajustamos el muestreo a 10ms, debemos mover la frecuencia de corte del filtro a 50Hz, o lo hacemos con potenciometros digitales ( mas caro!! ) o lo hacemos con filtros digitales ( mas barato! ) pero esta ultima opcion involucra que el sistema siempre este a 1ms, entonces los 10 ms lo logramos con un simple submuestreo .. .. bueno por esta razon es porque tengo un filtro digital ...   

Bueno el problema del ruido es muy común, como hay dos circuitos uno digital ( ruidoso por su naturaleza ) y otro analógico ( no tan ruidoso pero muy sensible al ruido digital )  .... este problema se disminuye colocando capacitores de 10uF y 0.1uF en cada componente digital y analógico ... el de 10uF es para eliminar rizados de baja frecuencia y el de 0.1uF es para los de alta frecuencia ... sino me equivoco ... ahora ... todas las tierras digitales se agrupan en un solo nodo y las tierras analógicas en otro nodo ... si usas cables blindados la tierra de eso también en otro nodo ...   ahora para que la tierra digital y analógica sean una sola .. se une esas tierras ( analógica y digital ) en un solo punto ... osea la unión de esas dos tierras tiene que unirse solamente con un cable, un jumper, o lo que sea, pero que sea solo un punto de unión ... la tierra de los cables blindados no puede unirse directamente con la tierra del circuito porque cabe el riesgo de hacer cortos con señales CD, y eso puede hacer explotar el circuito .. bueno solo quemarlo ... para hacer la unión se usa un capacitor (en serie) de baja capacitancia ( unos poco pF ) que filtra toda señal CD y para las señales CA como el ruido, el capacitor es mas bien como un "corto" o baja impedancia alta frecuencia  ...  Por ultimo, yo uso dos fuentes .. una para todo lo digital y otra para todo lo analógico ... por lo general lo hago con reguladores ...  Como te digo con esto el ruido no se elimina pero si se atenua mucho... ademas un aspecto muy muy importane es que las entradas analógicas las acondiciono con amplificadores de instrumentación de alta impedancia, como el INA121, el modo diferencial evita las tierras con diferentes potenciales ...

(http://img237.imageshack.us/img237/6015/diffmk7.jpg)
Título: Re: Control PID digital para motor DC
Publicado por: blackcat en 18 de Enero de 2008, 18:06:46
Se me olvido ... el modelo solo tiene un polo en el origen o solo un integrador, esa es la razon de la respuesta estable a lazo abierto aunque ese integrador deberia hacer el error cero pero no es asi porque el motor tiene una no linealidad (talvez no has considerado en tu proyecto) .... ejemplo:
 
Un motor CD de 12V conectado con cualquier carga, desde el punto de vista de control automatico ese motor se debe mover cuando le aplicamos una tension muy pequeña mayor o menor a 0V .. sabemos que no es asi, el motor no tiene la suficiente energia para compensar las perdidas por friccion y el torque de la carga que lo haga moverse con una tension muy pequeña, supongamos que el motor empieza a moverse lentamente cuando aplicamos 5.1V; tension entre -5V y 5V el motor no se mueve ... eso es una no linealidad muy grave ... la solucion es crear un offset en la salida, cuando el control nos de 0  aplicamos un valor de 5V de tal modo que el motor no se mueva  ...  si la salida del control es 0.1 sea aplica 5.1V ... si la salida es -0.1 se aplica -5.1V ...

En mi caso, como no puedo modificar eso, entonces para mejorar el error se puede poner otro integrador  con la desventaja que aparece un fenomeno llamado "wind-up"

http://en.wikipedia.org/wiki/Integral_windup (http://en.wikipedia.org/wiki/Integral_windup)

 
Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ en 18 de Enero de 2008, 22:26:53
hola Blackcat También tengo el problema de la no linealidad a bajos voltajes, la figura de abajo  es la curva de velocidad-voltaje que saque de mi motor. Los puntos rojos son la data y la azul es la linea interpolada (y=mx+b). El motor empieza a moverse con 2.5v, y a apartir de eso crece en forma lineal. Cuando lo conecte con carga se empezará a mover con un voltaje mayor, pero supongo que a partir de ahi lo hará en forma lineal.

(http://img236.imageshack.us/img236/8434/ffst7.jpg)

Por tanto la respuesta del motor ante escalones no es lineal, aun asi la TF que hallé se aproxima al modelo real del motor. Pero cuando esté conectado con carga no se como hallar una correcta TF, debido a que esta se va a alejar más del modelo real.

Que raro pensé que un integrador en el sistema hacia el error cero ante escalones, aun con esa zona muerta, pero veo que no. Insisto en que no debes agrandar el orden del sistema, tu rango de ganancia en el controlador puede disminuir mucho, conseguirás muy buenos resultados con un solo integrador y otro polo más en tu control, ante escalones y rampas. Tu sistema en lazo abierto lo estas modelando de orden 3..? o lo simplificas a uno de orden 2.

Por el momento tengo separadas las tierras de control y de potencia, pero pienso unirlas ya que necesito sensar la corriente con una resistencia, tendré en cuenta lo que comentas, pero hay algo que no entiendo cuando dices:

Citar
la tierra de los cables blindados no puede unirse directamente con la tierra del circuito porque cabe el riesgo de hacer cortos con señales CD, y eso puede hacer explotar el circuito .. bueno solo quemarlo ... para hacer la unión se usa un capacitor (en serie) de baja capacitancia ( unos poco pF ) que filtra toda señal CD y para las señales CA como el ruido, el capacitor es mas bien como un "corto" o baja impedancia alta frecuencia  ... 
.

Cúal sería la tierra de los cables blindados,? qué señales en tu sistema usan cables blindados, si no fuera mucha molestia puedes poner un pequeño esquema.

saludos.
Título: Re: Control PID digital para motor DC
Publicado por: blackcat en 21 de Enero de 2008, 12:37:18
Con un solo integrador se me mejora mucho la respuesta

               ( z - 0.85 )
C = 0.5 -----------------
               ( z - 1 )


El modelo es de orden 2 y utilice ARMAX ... de todas formas uno realiza un analisis con todos modelos y seleccione el que tiene mejor ajuste y menor dispersion

Todos los cables con blindados son aquellos que tienen envuelto un "camisa" conductora .. puede ser un malla o un papel aluminio .. esto se usa mucho para atenuar el ruido en lineas de transmision esta se conecta al chasis o la caja donde tenes el circuito

(http://img231.imageshack.us/img231/9080/tierraxp1.jpg)

Te trate de incluir imagenes del sistema pero ahorita estoy en la universidad y no en la oficina...
Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ en 25 de Enero de 2008, 18:02:12
hola, entonces has escojido un controlador PI, la ecuación en diferencias de tu controlador tiene esta forma:

U(n)=0.5*ess(n)-0.425*ess(n-1)+U(n-1);

Como te responde ante rampas aceleradas, es suave en el arranque?. en mi compensador arranca con mucha vibración ante rampas aceleradas cuando la alcanza ya se pone suave el motor. Una rampa acelerada la considero como 5rev/seg=1.8º/mseg.

Como implementas el anti-windup en tu controlador,

Ya estoy probando el módulo de posición pulsos y dirección, me está dando resultados pero a veces se destruye la cuenta parece que está entrando ruido por los dos pines, seguiré haciendo pruebas hoy lo probaré ya postearé el metodo que uso.

Te dejo este enlace, es un proyecto con dspic para el control de posicion de una fresadora, está muy bueno.

proyecto dspic-cnc (http://members.shaw.ca/swstuff/dspic-servo.html)

saludos.
Título: Re: Control PID digital para motor DC
Publicado por: blackcat en 27 de Enero de 2008, 05:44:34
Hola ...

Ya te habia comentado que estoy utilizando punto fijo y las rutinas DSP de la biblioteca de microchip ... especificamente estoy usando la rutina para filtros IIR transpuestos ... la rutina realiza sistemas con la siguiente forma

           b0 + b1*z^-1 + b2*z^-2
H(z) =  -----------------------------
            1  + a1*z^-1 + a2*z^-2

Originalmente son para filtros IIR pero el concepto de filtro es el mismo que compensador, un compensador integral es un filtro pasobajos ...  :)
como las funciones son en punto fijo se representan con el formato 1.15 (fractional) ... es decir un bit de signo y 15 para decimales, esto es muy simple, rápido pero solo podemos representar numero desde -1 hasta 0.999969482422 sino me equivoco ... convertir un numero decimal a este formato es muy sencillo solo es multiplicar el numero por 32768, ejemplos ....

0.99 ==> 0x7EB8h
0.50 ==> 0x4000h
-1.0 ==> 0x8000h
-0.5 ==> 0xC000h

Esta es la rutina que uso para convertir de float a fractional:

Código: [Seleccionar]
fractional float2fractional( float number )
{
return (fractional)(number*32768);
}

Un problema grave del punto fijo es que si algun resultado es mayor que 1, el compensador automáticamente se satura, con solo una vez que se sature el comportamiento es erroneo . Para evitar esto sacrifique un poco de resolución e implenté que toda la aritmética que utilizo en el sistema sea con formato 2.14, es decir 1 bit de signo, 1 bit de parte entera y 14 bits de decimales esto me permite representar números de -2 a 1.99...; se pensaría que hay que modificar las rutinas de la biblioteca pero esto no es necesario porque la diferencia entre 1.15 y 2.14 es ganancia.

Ahora a las rutinas de microchip solo hay que introducir B0, B1, A1, B2, A2, y el compensador queda configurado ... Estas rutinas estan genialmente optimizadas y te puedo decir que un sistema de orden 2 solo tarda de 2 a 4us en calcular; punto flotante solo lo utilizo para operaciones offline y sin tiempo critico de ejecución.

De las pruebas que he hecho siempre noto que el arranque es acelerado cuando ya casi alcanza tambien se pone suave ... no se el porque de este comportamiento ...

Lo que si se es que los compensadores derivativos (o D en un PID) actúan como amplificadores ante cambios acelerados ... su comportamiento es como un filtro pasaaltas .. el compensador derivativo es aquel que tiene un cero mas cerca del origen y un polo mas alejado ... en la universidad le llaman compensadores de adelanto ... este tipo de compensador hace que el sistema actúe o estabilice rápidamente pero no mejora el error,  el problema de este tipo de compensador es que si una señal es muy ruidosa el compensador "amplifica" este ruido y puede generar las vibraciones ... Es muy posible que este sea tu problema, hay una variación del compensador PID que se llama PI_D  ... se utiliza para evitar el compensador realice cambio bruscos con la referencia, para ello se remueve la  referencia de la parte D y esta solo queda conectada a la retroalimentación ... en este documento hay un diagrama en la pag 23...

http://www.disa.bi.ehu.es/spanish/asignaturas/17212/t4_control_pid_introduccion.pdf (http://www.disa.bi.ehu.es/spanish/asignaturas/17212/t4_control_pid_introduccion.pdf)

Para el anti-windup ...

Primero he visto que mucha gente implementa le PID como una sola ecuacion de diferencias, eso no me parece creo que la mejor forma es hacerlo por separado o el PID paralelo, es decir una ecuacion para P una para I y otra para D; cuando ya se tienen los tres resultados se suman  y ese es el dato para el actuador ...
 
Ahora hay que entender bien como es el fenomeno WINDUP, el algoritmo antiwindup hace que el integrador deje de funcionar cuando este alcance un valor limite; el integrador es un acumulador, esa accion acumulativa es perjudicial cuando el error es constante por largo tiempo, por ejemplo, si queres que la velocidad del motor sea 5000rpm pero el actuador solo da la suficiente potencia para hacer girar el motor a 4000rpm, aqui hay un error de 1000rpm, con el integrador este error de 1000rpm realizará una acumulacion muestra tras muestra e irá en aumento, esto es arriesgado en un sistema digital porque puede llegar a desbordar el sumador; sin antiwinup este error se acumulara hasta la precisión del sistema digital, el windup aparece si bajamos repentinamente la velocidad del motor a 2000rpm, el integrador ahora deberá restar al acumulador todas las muestras saturadas hasta llegar a 2000rpm, la estabilización a 2000rpm tomara un largo tiempo o el mismo en que duró saturado ... el algoritmo consiste en estar revisando la salida del integrador, si la salida del integrador es mayor o igual que el valor limite se activa una bandera que detiene la accion acumulativa, ahora en la siguiente muestra se analiza si esta muestra va a hacer que el acumulador sea mayor al limite o menor al limite, si hace que sea mayor no se suma si hace que sea menor o por lo menos disminuye el acumulador se permite que el integrador opere normalmente ... este metodo no es un simple saturador o recortador porque un saturador solo recorta la señal pero no evita la accion acumulativa, el antiwindup detiene la operacion del integrador evitando que se sature ... no se si me entiendes la diferencia

Ya vi el link me parece intersante ... lo tomare como referencia ...


 
Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ en 28 de Enero de 2008, 02:08:48
Gracias por la explicación del anti-windup me quedó claro, con un motor pequeño implementé un PID en punto flotante para velocidad, lo seteaba a 200rpm y luego lo paraba con la mano al soltarlo luego de varios segundos el motor se volvia loco pump pump, no paraba de saltar, ese es el efecto que ocaciona la componente integral cuando se acumula demasiado el area del error.

Para un controlador lineal en un motor dc el punto flotante me es suficiente, donde si creo tendré problemas es cuando vea como implementar un control vectorial en un motor de inducción, tendré que manejar bien el punto fijo o pasarme al pic32 solo para la parte matemática. Buena idea la de usar el filtro IIR para el compensador.

Me parece que es normal que el motor vibre o tambalee un poco en el arranque, por ejm una rampa de 300rpm, el motor debe pasar de 0rpm a 300rpm en el primer mseg esto hace que el motor sufra al comienzo, la orden de aceleración es brusca al inicio y al siguiente mseg vuelve a cero, el motor no puede hacer eso por eso vibra. Lo probé con match3 y este tiene la opcion de darle el setpoint de velocidad en forma de trapecio asi los picos de aceleración ya no son tan altos, el motor con match3 se comportó muy bien.

Ya terminé mi forma de contar los pulsos y dirección que vienen del cnc, utilizé el método del proyecto "dspic-cnc" que te pasé, es muy sencillo, yo tenía otro pero era más engorroso. Se trabaja por interrupción por cambio de nivel CN en CN0 (pulsos) y CN1 (dirección), cuando uno de los dos cambie de estado se va a esta rutina de interrupción y decrementa o incrementa el registro de referencia REF, de la sgte forma:

Código: [Seleccionar]
void __attribute__((interrupt, no_auto_psv))  _CNInterrupt(void)
{
   if (_RC13==1 && _RC14==1)
    { REF++; }
   if (_RC13==0 && _RC14==1)
    { REF--; }
   IFS0bits.CNIF=0;
}

Si el motor va a girar a 2000rpm esta rutina va interrumpir el mircro 333 veces por mseg, pero ya lo probé y funciona bien.

saludos.
Título: Re: Control PID digital para motor DC
Publicado por: blackcat en 28 de Enero de 2008, 05:09:29
(...)  lo seteaba a 200rpm y luego lo paraba con la mano al soltarlo luego de varios segundos el motor se volvia loco pump pump, no paraba de saltar, ese es el efecto que ocaciona la componente integral cuando se acumula demasiado el area del error.

Esa justamente es la prueba para ver el windup ...

Gracias por la rutina ... se me habia olvidado que tengo que hacer eso ...  :shock:
Título: Re: Control PID digital para motor DC
Publicado por: 000miguel en 20 de Abril de 2008, 18:03:53
Me parece muy interesante este tema.

por lo que comentabas, el motor vibraba al inicio. Supongo que habría que hacer una buena rampa de aceleración.

Al final se ha conseguido mover bien el motor?
Título: Re: Control PID digital para motor DC
Publicado por: Renatox_ en 22 de Abril de 2008, 00:40:16
Hola miguel, si tenia ese problema de la vibración ante escalones de velocidad muy fuertes, o lo que es lo mismo rampa de posición con una pendiente alta, lo pude solucionar diseñando otro controlador con un tiempo de establecimiento mayor, antes lo diseñe para 40mseg ahora para 200mseg. Ahora el motor trabaja bien puede soportar velocidades de 4000mm/min a -4000mm/min de golpe osea aceleración muy alta.

Mi circuito de potencia esta hecho con mosfets el IRFP250 con IGBT podría aguantar un regimen de trabajo aun mayor.

saludos.