PID

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

NOMBRE

pid- controlador proporcional/integral/derivativo

SINOPSIS

loadrt pid [num_chan =num | names=name1[,name2 ...]][debug =dbg]

DESCRIPCIÃN

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

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

Los especificadores num_chan= y names= son mutuamente excluyentes. Si no se especifica num_chan= ni names=, el valor predeterminado es tres. Sidebug se establece en 1 (el valor predeterminado es 0), se exportarán algunos parámetros HAL adicionales, que pueden ser útiles para el ajuste, pero de lo contrario son innecesarios.

NOMBRADO

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 usanames=name1,name2, ...

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

FUNCIONES

pid.N.do-pid-calcs (usa punto flotante) ¿Los cálculos PID para el bucle de controlN.

PINES

pid.N.command float in

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

pid.N.Pgain float in

Ganancia proporcional. Resulta en una contribución a la salida que es el error multiplicado por Pgain.

pid.N.Igain float in

Ganancia integral. Resulta en una contribución a la salida que es 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 in

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

pid.N.feedback float in

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

pid.N.output float out

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

pid.N.command-deriv float in

La derivada del valor deseado (ordenado) para el bucle de control. Si no hay ninguna señal conectada, la derivada se estimará numéricamente.

pid.N.feedback-deriv float in

La derivada del valor real (realimentación) para el bucle de control. Si no hay ninguna señal conectada, la derivada se estimará numéricamente. Cuando la retroalimentación proviene de una fuente de posición cuantificada (p. Ej., posición de retroalimentación del codificador), el comportamiento del término D puede mejorarse al usaro una mejor estimación de velocidad aquÃ, como la salida de velocidad del codificador(9) o hostmot2(9).

pid.N.error-previous-target bit in

Utiliza-mode el objetivo de la invocación anterior frente a la posición actual para el cálculo de errores, como lo espera el controlador de movimiento. Esto puede hacer que los bucles de posición torque-mode y los que requieren una ganancia I grande sean más fáciles de sintonizar, al eliminar el error de seguimiento velocity-dependent.

pid.N.error float

Diferencia entre comando y retroalimentación.

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.index-enable bit in

En el lÃmite descendente de index-enable, pid no actualiza la estimación derivada del comando interno. En los sistemas que usan el pulso de Ãndice del codificador, este pin debe estar conectado a la señal index-enable. Cuando esto no se hace, y FF1 no es cero, un cambio de paso en el comando de entrada provoca un pico de ciclo único en la salida PID. En los sistemas que utilizan exactamente una de las entradas -deriv, esto también afecta el término D.

pid.N.bias float in

bias es una cantidad constante que se agrega a la salida. En la mayorÃa de los casos, debe dejarse en cero. Sin embargo, a veces puede ser útil para compensar offsets en los servoamplificadores, o para equilibrar el peso de un objeto que se mueve verticalmente. bias se desactiva cuando el bucle PID está desactivado, 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 in

Término de retroalimentación de orden cero. Produce una contribución a la salida que es FF0 multiplicada por el valor ordenado. Para los bucles de posición, generalmente debe dejarse en cero. Para los bucles de velocidad, FF0 puede compensar la fricción o la contra-EMF del motor y puede permitir un mejor ajuste si se usa correctamente.

pid.N.FF1 float in

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

pid.N.FF2 float in

Término de retroalimentación de segundo orden. Produce una contribución a la salida que es FF2 multiplicada por la segunda derivada del valor ordenado. Para los bucles de posición, la contribución es proporcional a la aceleración y puede usarse para compensar la inercia. Para los bucles de velocidad, la contribución es proporcional al jerk (aceleracion de la aceleracion), y generalmente debe dejarse en cero.

pid.N.FF3 float in

Término de retroalimentación de tercer orden. Produce una contribución a la salida que esFF3 multiplicada por la tercera derivada del valor ordenado. Para los bucles de posición, la contribución es proporcional al jerk, y se puede utilizar para compensar errores residuales durante la aceleración. Para los bucles de velocidad, la contribución es proporcional al snap ( o jounce), y generalmente debe dejarse en cero. Ver https://w.wiki/a8N

pid.N.deadband float in

Define un rango de error "aceptable". Si el valor absoluto de error es menor que deadband, se tratará como si el error fuera cero. Cuando se utilizan dispositivos de retroalimentación, como codificadores que están inherentemente cuantificados, la banda muerta debe establecerse un poco más de la mitad del conteo, para evitar que el bucle de control busque de un lado a otro si el comando está entre dos valores de codificador adyacentes (hunting). Cuando el valor absoluto del error es mayor que la banda muerta, el valor de la banda muerta se resta del error antes de realizar los cálculos de bucle, para evitar un paso en la función de transferencia en el limite de la banda muerta. (VerBUGS.)

pid.N.maxoutput float in

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

pid.N.maxerror float in

LÃmite de la variable de error interno utilizada para P, I y D. Se puede utilizar para evitar que los valores altos de Pgain generen salidas grandes 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 in

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 fBDgain y evitar picos de salida grandes debido a pasos en el comando y/o retroalimentacion. Normalmente no es necesario.

pid.N.maxerrorI float in

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

pid.N.maxcmdD float in

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

pid.N.maxcmdDD float in

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. Se puede usar para evitar que FF2 produzca picos de salida grandes si hay un cambio de paso en el comando. Normalmente no es necesario.

pid.N.maxcmdDDD float in

LÃmite en la tercera derivada del comando. La tercera derivada de comando utilizada por FF3 estará limitada a este valor, a menos que el valor sea cero. Se puede usar para evitar que fBFF3 produzca picos de salida grandes si hay un cambio de paso en el comando. Normalmente no es necesario.

pid.N.saturated bit out

Cuando es TRUE, la salida PID actual está saturada. Es decir,

output = ± maxoutput.

pid.N.saturated-s float out
pid.
N.saturated-count s32 out

Cuando es TRUE, la salida del PID se saturó continuamente durante estos (saturated-s) segundos o (saturated-count) perÃ- odos.

PARÃMETROS

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

Integral de 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 de avance 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 de avance de segundo orden de la salida.

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

Tercera derivada del comando. Este es el valor que se multiplica por FF3 para producir el término de avance de tercer orden de la salida.

ERRORES

Algunas personas argumentan que la banda muerta debe implementarse de manera que el error se trate como cero si está dentro de la banda muerta, y no se modifique 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 prefieren ese comportamiento pueden agregar un parámetro que cambie el comportamiento o escribir su propia versión de pid. Sin embargo, el comportamiento predeterminado no debe cambiarse.

Las ganancias negativas pueden conducir a un comportamiento no deseado. En algunas situaciones es posible que las ganancias negativas de FF tengan sentido, pero en general todas las ganancias deberÃan ser positivas. Si alguna salida está en la dirección equivocada, negar las ganancias para arreglarlo es un error; establecer la escala correctamente en su lugar.