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