Diferencia entre revisiones de «Controlador PID»
(No se muestra una edición intermedia del mismo usuario) | |||
Línea 51: | Línea 51: | ||
while true do | while true do | ||
-- obtener variable controlada "v" | -- obtener variable controlada "v" | ||
+ | --... | ||
+ | |||
local out=pid(v) | local out=pid(v) | ||
+ | |||
-- aplicar salida "out" | -- aplicar salida "out" | ||
+ | --... | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Línea 71: | Línea 75: | ||
local controller = require("controller") | local controller = require("controller") | ||
local pid = controller.get_p({Kp = 5, out_min=-1024, out_max=1024}) | local pid = controller.get_p({Kp = 5, out_min=-1024, out_max=1024}) | ||
− | |||
− | |||
while true do | while true do | ||
Línea 84: | Línea 86: | ||
repeat | repeat | ||
− | v = pid( Dist.getDistancia() ) | + | local v = pid( Dist.getDistancia() ) |
Motores.setvel2mtr(1, v, 1, v) | Motores.setvel2mtr(1, v, 1, v) | ||
until Boton.getBoton()==1 | until Boton.getBoton()==1 |
Revisión actual del 16:49 25 jul 2011
La librería implementa controladores PID[1], expresados en notación standard[2].
La librería se carga haciendo:
local controller = require("controller")
Luego, un controlador se instancia invocando:
local pid = controller.get_pid()
Ademas del método get_pid(), se pueden invocar get_pi() y get_p(), que devuelven controladores proporcional-integral y proporcional, respectivamente.
Una vez obtenido un controlador, se lo configura con los parámetros deseados:
pid.Kp = 10
pid.Ti = 100
pid.setpoint = 1.5
También es posible inicializar el controlador pasándole una tabla al instanciarlo. El equivalente de lo anterior:
local pid = controller.get_pid({Kp = 10, Ti = 100, setpoint = 1.5})
Cualquiera de los parámetros puede ser cambiado en cualquier momento. Los parámetros son:
Kp, Ti, Td : ganancia, tiempo integral y tiempo diferencial, tal como se definen en [3]. Los controladores obtenidos con get_pi no necesitan el parámetros Td, y los obtenidos con get_p no necesitan Td ni Ti.
out_min, out_max : valores mínimo y máximo admitidos de la salida (la salida se trunca a este rango)
setpoint : valor de referencia que el controlador persigue.
Para utilizar el controlador, deberá invocarselo pasándole la variable controlada:
while true do
-- obtener variable controlada "v"
--...
local out=pid(v)
-- aplicar salida "out"
--...
end
Si el valor de referencia varia muy frecuentemente (por ejemplo, porque es la salida de otro pid), se puede pasar directamente al controlador al invocarlo. El atributo setpoint se actualizará automáticamente
local out=pid(v, reference)
Programa de ejemplo, que implementa el butia equilibrista:
local controller = require("controller")
local pid = controller.get_p({Kp = 5, out_min=-1024, out_max=1024})
while true do
print ("Presione el botón para comenzar")
repeat until Boton.getBoton()==1
pid.setpoint = Dist.getDistancia()
print("Arrancando", eq)
wait(1)
repeat
local v = pid( Dist.getDistancia() )
Motores.setvel2mtr(1, v, 1, v)
until Boton.getBoton()==1
print("Fin")
Motores.setvel2mtr(1, 0, 1, 0)
wait(1)
end