Professional Documents
Culture Documents
Proyecto de diseño de
sistemas digitales:
Core de un bloque PID
ESPOL
Objetivo
Analizar y simular el Core de un bloque PID, identificar las variables que actúan en el
proceso, así como el código en VHDL.
Controlador PID
Un controlador PID es un mecanismo de control por realimentación ampliamente usado
en sistemas de control industrial.
Características:
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity pid_controller is
generic
-- proportionally gain --
iKP : integer range 0 to 7 := 3; -- 0 - /2, 1 - /4, 2 - /8, 3 - /16, 4 - /32, 5 - /64, 6 - /128, 7 - /256
-- integral gain --
iKI : integer range 0 to 7 := 2; -- 0 - /2, 1 - /4, 2 - /8, 3 - /16, 4 - /32, 5 - /64, 6 - /128, 7 - /256
-- differential gain --
iKD : integer range 0 to 7 := 2; -- 0 - /2, 1 - /4, 2 - /8, 3 - /16, 4 - /32, 5 - /64, 6 - /128, 7 - /256
-- master gain --
iKM : integer range 0 to 7 := 1; -- 0 - /1, 1 - /2, 2 - /4, 3 - /8 , 4 - /16, 5 - /32, 6 - /64 , 7 - /128
);
port
CLK_I : in std_logic;
RESET_I : in std_logic;
-- error --
-- current sample --
-- correction --
);
-------------------------------------------------------------------------------
-- functions --
-------------------------------------------------------------------------------
function f_something ( constant c_size : integer; signal c_value : std_logic) return std_logic_vector is
return var_temp;
-- examples:
-- ...
-------------------------------------------------------------------------------
-- types --
-------------------------------------------------------------------------------
-- delay register --
-------------------------------------------------------------------------------
-- signals --
-------------------------------------------------------------------------------
v_error_KP <= f_something(c_size => iKP + 1 , c_value => v_error_KM(iDataWidith - 1)) &
v_error_KM(iDataWidith - 1 downto iKP + 1);
-- derivative gain execute by shift of (iKD - 1) bits to the right --
v_error_KD <= f_something(c_size => iKD + 1 , c_value => v_error_KM(iDataWidith - 1)) &
v_error_KM(iDataWidith - 1 downto iKD + 1);
v_error_KI <= f_something(c_size => iKI + 1 , c_value => v_error_KM(iDataWidith - 1)) &
v_error_KM(iDataWidith - 1 downto iKI + 1);
if rising_edge(CLK_I) then
-- synchronous reset --
else
-- delay register --
-- integration of error --
end if;
Análisis de código
Lo primero que se hizo fue declarar unas variables genéricas, las cuales cambian su valor
de acuerdo con el comportamiento del sistema, estas variables son:
El ancho de datos de entrada = iDataWidith
La ganancia proporcional = iKP
La ganancia integral = iKI
La ganancia derivativa = iKD
La ganancia principal = iKM
Un retardo para tomar muestras de tiempo= iDelayD
Luego declaramos las variables que simularemos, que serán la señal de reloj, de reset,
el error, la señal de retro alimentación, el factor de corrección y estimación.
Luego en la arquitectura lo que hace el programa es leer las variables de retro
alimentación y la estimación que es el valor que se pone inicialmente para que este se
mantenga, y guarda la resta de ambos en la variable error y de acuerdo a cuan grande
sea se sumara un valor a las ganancias del pid para así poder conservar el valor inicial.
Simulación
Se puede observar como la señal de retro alimentación aumenta su valor para llegar a
los 1791 que es valor al cual se quiere llegar, además se observa la señal del error y el
factor de corrección.
Conclusión