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

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

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #15 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.
« Última modificación: 15 de Enero de 2008, 00:00:03 por Renatox_ »
control de movimiento

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #16 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


« Última modificación: 15 de Enero de 2008, 22:46:05 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #17 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.
control de movimiento

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #18 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...

Control Automático, DSP & Microcontroladores

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #19 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.
control de movimiento

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #20 en: 18 de Enero de 2008, 16:56:04 »
Hola ..





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 ...



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 ...

« Última modificación: 18 de Enero de 2008, 17:24:09 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #21 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

 
« Última modificación: 18 de Enero de 2008, 18:08:48 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #22 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.



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.
control de movimiento

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #23 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



Te trate de incluir imagenes del sistema pero ahorita estoy en la universidad y no en la oficina...
« Última modificación: 22 de Enero de 2008, 01:56:37 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #24 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

saludos.
« Última modificación: 27 de Enero de 2008, 05:24:57 por Renatox_ »
control de movimiento

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #25 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

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 ...


 
« Última modificación: 27 de Enero de 2008, 07:17:54 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #26 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.
control de movimiento

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: Control PID digital para motor DC
« Respuesta #27 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:
Control Automático, DSP & Microcontroladores

Desconectado 000miguel

  • PIC10
  • *
  • Mensajes: 4
Re: Control PID digital para motor DC
« Respuesta #28 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?

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: Control PID digital para motor DC
« Respuesta #29 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.
control de movimiento