AT_PID

NOMBRE
SINOPSIS
DESCRIPCIÃN
NOMBRES
FUNCIONES
PINES
PARÃMETROS
ERRORES

NOMBRE

at_pid - controlador proporcional/integral/derivativo con autoajuste

SINOPSIS

loadrt at_pid [num_chan=num | names=name1[,name2...]]

DESCRIPCIÃN

at_pid es un controlador proporcional/integral/derivativo clásico, que se utiliza para controlar la retroalimentación de posición o velocidad para servomotores y otras aplicaciones de lazo cerrado.

at_pid admite un máximo de dieciséis controladores. El número que se carga realmente se establece mediante el argumento num_chan cuando se carga el módulo. Alternativamente, especifique names= y nombres únicos separado por comas para cada controlador.

Los especificadores num_chan= y names= son mutuamente excluyentes. Si no se especifica ni num_chan= ni names=, el valor predeterminado es tres.

Si debug se establece en 1 (el valor predeterminado es 0), se exportarán algunos parámetros HAL adicionales, que pueden ser útiles para sintonización, pero que de lo contrario son innecesarios.

at_pid tiene un modo de ajuste automático incorporado. Funciona estableciendo un ciclo lÃmite para caracterizar el proceso. De esto, se puede determinar Pgain/Igain/Dgain o Pgain/Igain/FF1 usando Ziegler-Nichols. Cuando se usa FF1, la escala debe establecerse de modo que la salida esté en unidades de usuario por segundo.

Durante el ajuste automático, la entrada command no deberÃa cambiar. El ciclo lÃmite se configura alrededor de la posición ordenada. No hay valores de sintonización iniciales requeridos para comenzar la sintonización automática. Solo deben configurarse tune-cycles, tune-effort y tune-mode antes de comenzar el ajuste automático. Cuando la sintonización automática se completa, se establecerán los parámetros de ajuste. Si se ejecuta desde LinuxCNC, es posible que sea necesario disminuir la configuración de FERROR del eje que se está sintonizando, ya que debe ser mayor que la amplitud del ciclo lÃmite para evitar un error de seguimiento.

Para realizar la sintonización automática, siga los siguientes pasos:
- Mueva el eje a afinar a algún lugar cercano al centro de su carrera.
- Establezca tune-cycles (el valor predeterminado deberÃa estar bien en la mayorÃa
de los casos) y tune-mode.
- Establezca tune-effort a un valor pequeño.
- Establezca enable en TRUE.
- Establezca tune-mode en TRUE.
- Establezca tune-start en TRUE.
- Si no hay oscilación, o la oscilación es demasiado pequeña, aumente
lentamente Tune-effort.

La sintonización automática se puede cancelar en cualquier momento configurando enable o Tune-mode a FALSE.

NOMBRES

Los nombres de los pines, parámetros y funciones tienen el prefijo:
pid.N.
para N=0,1,...,num-1 cuando se usa num_chan=num
nameN.
para nameN=name1,name2,... cuando se usa names=name1,name2,...

El formato pid.N. se muestra en las siguientes descripciones.

FUNCIONES

pid.N.do-pid-calcs (usa coma float)

Cálculos PID para el bucle de control N.

PINES

pid.N.command float in

El valor deseado (ordenado) para el bucle de control.

pid.N.feedback float in

El valor real (retroalimentación) de algún sensor, como un encoder.

pid.N.error float

La diferencia entre comando y retroalimentación.

pid.N.output float

La salida del bucle PID, que va a algún actuador, como un motor.

pid.N.enable bit in

Cuando es TRUE, habilita los cálculos PID. Cuando es FALSE, output es cero y todos los integradores internos, etc., se reinician.

pid.N.tune-mode bit in

Cuando es TRUE, habilita el modo de sintonización automática. Cuando es FALSE, son realizados los cálculos PID normales.

pid.N.tune-start bit io

Cuando se establece en TRUE, comienza la sintonización automática. Se borra cuando se completa la sintonización automática.

PARÃMETROS

pid.N.Pgain float rw

Ganancia proporcional. Resulta en una contribución a la salida igual al error multiplicado por Pgain.

pid.N.Igain float rw

Ganancia integral. Resulta en una contribución a la salida igual a la integral del error multiplicado por Igain. Por ejemplo, un error de 0.02 que duró 10 segundos resultarÃa en un error integrado (errorI) de 0.2, y si Igain es 20, el término integral agregarÃa 4.0 a la salida.

pid.N.Dgain float rw

Ganancia derivativa. Resulta en una contribución a la salida que es igual a la tasa de cambio (derivativo) del error multiplicado por Dgain. Por ejemplo un un error que cambió de 0.02 a 0.03 durante 0.2 segundos resultarÃa en un error derivativo (errorD) de 0.05, y si Dgain es 5, el termino derivativo agregarÃa 0.25 a la salida.

pid.N.bias float rw

bias es una cantidad constante que se agrega a la salida. En la mayorÃa de los casos deberÃa dejarse en cero. Sin embargo, a veces puede ser útil para compensar servoamplificadores, o para equilibrar el peso de un objeto que se mueve verticalmente. bias se anula cuando el bucle PID está deshabilitado, al igual que todos los demás componentes de la salida. Si se necesita una salida distinta de cero incluso cuando el bucle PID está deshabilitado, debe agregarse con un bloque HAL externo sum2.

pid.N.FF0 float rw

Término de retroalimentación de orden cero. Produce una contribución a la salida igual a FF0 multiplicado por el valor ordenado. Para los bucles de posición, deberÃa generalmente se deja en cero. Para bucles de velocidad, FF0 puede compensar fricción o FCEM del motor y puede permitir un mejor ajuste si se usa correctamente.

pid.N.FF1 float rw

Término de retroalimentación de primer orden. Produce una contribución a la salida que es igual a FF1 multiplicado por la derivada del valor ordenado. Para bucles de posición, la contribución es proporcional a la velocidad y se puede usar para compensar la fricción o la FCEM. Para los bucles de velocidad, es proporcional a la aceleración y puede compensar la inercia. En ambos casos, puede resultar en un mejor ajuste si se usa correctamente.

pid.N.FF2 float rw

Término de retroalimentación de segundo orden. Produce una contribución a la salida que es igual a FF2 multiplicado por la segunda derivada del valor ordenado. Para bucles de posición, la contribución es proporcional a la aceleración, y puede ser utilizada para compensar la inercia. Para los bucles de velocidad, generalmente deberÃa dejarse en cero.

pid.N.deadband float rw

Define un rango de error "aceptable". Si el valor absoluto de error es menor que deadband, se tratará como si el error fuera cero. Al usar dispositivos de retroalimentación, como encoders que están inherentemente cuantificados, la banda muerta debe establecerse un poco más de la mitad, para evitar que el bucle de control entre en una búsqueda de ida y vuelta si el comando está entre dos valores adyacentes del encoder. Cuando el valor absoluto del error es mayor que la banda muerta, el valor de la banda muerta se resta del error anterior al realizar los cálculos de bucle para evitar un paso en la función de transferencia al filo de la banda muerta. (Ver BUGS.)

pid.N.maxoutput float rw

LÃmite de la salida. No se permitirá que el valor absoluto de la salida exceda maxoutput, a menos que maxoutput sea cero. Cuando la salida esta limitada, el integrador de errores se mantendrá en lugar de integrarse, para evitar windup y sobredisparo.

pid.N.maxerror float rw

LÃmite en la variable interna de error utilizada para P, I y D. Se puede utilizar para evitar que los valores altos de Pgain generen fuertes salidas en condiciones en las que el error es grande (por ejemplo, cuando el comando realiza un cambio de paso). Normalmente no es necesario, pero puede ser útil al ajustar sistemas no lineales.

pid.N.maxerrorD float rw

LÃmite en la derivada de error. La tasa de cambio de error utilizada por el término Dgain se limitará a este valor, a menos que el valor sea cero. Se puede usar para limitar el efecto de Dgain y evitar grandes picos de salida debido a pasos en el comando y/o retroalimentacion. No es normalmente necesario.

pid.N.maxerrorI float rw

LÃmite de integrador de errores. El integrador de errores utilizado por el términoIgain estará limitado a este valor, a menos que sea cero. Se puede usar para prevenir windup y sobredisparo resultante durante/después de errores sostenidos. Normalmente no es necesario.

pid.N.maxcmdD float rw

LÃmite de derivada de comando. La derivada de comando utilizada por FF1 estara limitada a este valor, a menos que el valor sea cero. Se puede usar para prevenir que FF1 produzca picos de salida grandes si hay un cambio de paso en el comando. Normalmente no es necesario.

pid.N.maxcmdDD float rw

LÃmite en la segunda derivada del comando. La segunda derivada de comando utilizada por FF2 estará limitada a este valor, a menos que el valor sea cero. Puede ser usado para evitar que FF2 produzca picos de salida grandes si hay un cambio de paso en el comando. Normalmente no es necesario.

pid.N.tune-type u32 rw

Cuando se establece en 0, se calculan Pgain / Igain / Dgain. Cuando se establece en 1, se calculan Pgain / Igain / FF1.

pid.N.tune-cycles u32 rw

Determina el número de ciclos a ejecutar para caracterizar el proceso. tune-cycles en realidad establece el número de semiciclos. Mayor numero de de ciclos dan una caracterización más precisa ya que se usa el promedio de todos los ciclos.

pid.N.tune-effort float rw

Determina el esfuerzo limite utilizado en la configuración del ciclo en el proceso. tune-effort debe establecerse en un valor positivo menor que maxoutput. Comience con un valor pequeño y aumente hasta un valor que resulte en una buena porción de la corriente máxima del motor que se está utilizando. Cuanto menor sea el valor, menor será la amplitud del ciclo lÃmite.

pid.N.errorI float ro (solo si debug=1)

Integral del error. Este es el valor que se multiplica por Igain para producir el término integral de la salida.

pid.N.errorD float ro (solo si debug=1)

Derivada del error. Este es el valor que se multiplica por Dgain para producir el término derivativo de la salida.

pid.N.commandD float ro (solo si debug=1)

Derivada del comando. Este es el valor que se multiplica por FF1 para producir el término feed-forward de primer orden de la salida.

pid.N.commandDD float ro (solo si debug=1)

Segunda derivada del comando. Este es el valor que se multiplica por FF2 para producir el término feed-forward de segundo orden de la salida.

pid.N.ultimate-gain float ro (solo si debug=1)

Determinado a partir de la caracterización del proceso. ultimate-gain es la razón de tune-effort a la amplitud del ciclo lÃmite multiplicado por 4.0 y dividido por Pi. pid.N.ultimate-period float ro (solo si debug=1) Determinado a partir de la caracterización del proceso. ultimate-period es el perÃodo del ciclo lÃmite.

ERRORES

Algunas personas argumentan que la banda muerta debe implementarse de manera que el error sea tratado como cero si está dentro de la banda muerta, y no modificarse si está fuera de la banda muerta. Esto no se hizo porque causarÃa un paso en la función de transferencia igual al tamaño de la banda muerta. Las personas que prefieran ese comportamiento estan invitadas a agregar un parámetro que cambie el comportamiento, o escribir su propia versión de at_pid. Sin embargo, el comportamiento predeterminado no debe cambiarse.