Diferencia entre revisiones de «Controlador PID»

De Proyecto Butiá
Saltar a: navegación, buscar
 
(No se muestran 5 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
La librería implementa controladores PID[http://es.wikipedia.org/wiki/Proporcional_integral_derivativo], expresados en notación standard[http://en.wikipedia.org/wiki/PID_controller#Alternative_nomenclature_and_PID_forms].
 
La librería implementa controladores PID[http://es.wikipedia.org/wiki/Proporcional_integral_derivativo], expresados en notación standard[http://en.wikipedia.org/wiki/PID_controller#Alternative_nomenclature_and_PID_forms].
  
La librería se carga haciendo
+
La librería se carga haciendo:
 +
 
  
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
Línea 7: Línea 8:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Luego, los controladores se instancian invocando
+
 
 +
Luego, un controlador se instancia invocando:
 +
 
  
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
Línea 13: Línea 16:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
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
+
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:
 +
 
  
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
Línea 22: Línea 27:
 
pid.setpoint = 1.5
 
pid.setpoint = 1.5
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
También es posible inicializar el controlador pasándole una tabla al instanciarlo. El equivalente de lo anterior:
 
También es posible inicializar el controlador pasándole una tabla al instanciarlo. El equivalente de lo anterior:
 +
  
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
Línea 29: Línea 36:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Cualquiera de los parametros puede ser cambiado en cualquier momento. Los parámetros son:
+
 
 +
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 [http://en.wikipedia.org/wiki/PID_controller#Alternative_nomenclature_and_PID_forms]. Los controladores obtenidos con get_pi no necesitan el parámetros Td, y los obtenidos con get_p no necesitan Td ni Ti.
 
Kp, Ti, Td : ganancia, tiempo integral y tiempo diferencial, tal como se definen en [http://en.wikipedia.org/wiki/PID_controller#Alternative_nomenclature_and_PID_forms]. 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 al este rango)
+
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.  
 
setpoint : valor de referencia que el controlador persigue.  
  
Para utilizar el controlador, deberá invocarse al controlador pasándole el valor controlada:
+
Para utilizar el controlador, deberá invocarselo pasándole la variable controlada:
 +
 
  
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
while true do
 
while true do
   -- read value "v"
+
   -- obtener variable controlada "v"
 +
  --...
 +
 
 
   local out=pid(v)
 
   local out=pid(v)
   -- apply output "out"
+
 
 +
   -- aplicar salida "out"
 +
  --...
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
  
 
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
 
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
 +
  
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
Línea 55: Línea 70:
  
 
Programa de ejemplo, que implementa el butia equilibrista:
 
Programa de ejemplo, que implementa el butia equilibrista:
 +
  
 
<syntaxhighlight lang="lua">
 
<syntaxhighlight lang="lua">
 
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})
 
+
local d --lecturas de distancia
+
local v --velocidad calculada
+
  
 
while true do
 
while true do
Línea 73: Línea 86:
  
 
repeat
 
repeat
d = Dist.getDistancia()
+
local v = pid( Dist.getDistancia() )
v = pid(d)
+
 
Motores.setvel2mtr(1, v, 1, v)
 
Motores.setvel2mtr(1, v, 1, v)
 
until Boton.getBoton()==1
 
until Boton.getBoton()==1

Revisión actual del 15: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