Documentos de Académico
Documentos de Profesional
Documentos de Cultura
der<=right;
iz<=left;
end Behavioral;
Este primer código es la entidad principal que una cada uno Segundo código, programa que se encarga de la lectura del
de los componentes que se explicaran a continuación: encoder para la posición del motor.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
Controlador I, al igual que el programa anterior tomar el valor
entity Resta is del erro producido por la diferencia y realiza la operación de
Port ( A : in STD_LOGIC_VECTOR (7 downto 0);
B : in STD_LOGIC_VECTOR (7 downto 0);
integrar multiplicando por una ganancia.
Res : out STD_LOGIC_VECTOR (7 downto 0)
); library IEEE;
end Resta; use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
architecture Behavioral of Resta is use IEEE.STD_LOGIC_UNSIGNED.ALL;
Tercer código, nos muestra la diferencia que tendremos entre architecture Behavioral of Derivativo is
constant Kd: std_logic_vector (3 downto 0):= "0011";
la posición deseada o la referencia menos la lectura de la signal e0, e1, e2: std_logic_vector (7 downto 0);
posición actual. begin
entity SUM is
library IEEE; Port ( AKp : in STD_LOGIC_VECTOR (8 downto 0);
use IEEE.STD_LOGIC_1164.ALL; BI : in STD_LOGIC_VECTOR (11 downto 0);
use IEEE.STD_LOGIC_ARITH.ALL; CD : in STD_LOGIC_VECTOR (11 downto 0);
use IEEE.STD_LOGIC_UNSIGNED.ALL; SUM : out STD_LOGIC_VECTOR (13 downto 0));
end SUM;
entity CI is
Port ( EP : in STD_LOGIC_VECTOR (7 downto 0); architecture Behavioral of SUM is
CLK: IN STD_LOGIC;
RST: IN STD_LOGIC; begin
I : out STD_LOGIC_VECTOR(8 DOWNTO 0));
end CI; SUM<=AKp+BI+CD;
architecture Behavioral of CI is
SIGNAL AUX , EANT: STD_LOGIC_VECTOR (8 DOWNTO 0); end Behavioral;
CONSTANT KI : STD_LOGIC_VECTOR (3 DOWNTO 0) := "0011";
begin
PROCESS(CLK , RST ) En este código simulamos un sumador para los tres controles,
BEGIN a la salida obtendremos un valor que podremos llamar PID, el
IF RST ='1' THEN
AUX <="000000000";
cual será nuestra referencia para el generador del PWM
EANT <="000000000";
ELSIF CLK'EVENT AND CLK='1' THEN
EANT<= AUX;
AUX <= (EP*KI) + EANT;
END IF;
END PROCESS;
I <= AUX;
end Behavioral;
library IEEE; PROCESS(Sig,CUENTA2)
use IEEE.STD_LOGIC_1164.ALL; BEGIN
use IEEE.STD_LOGIC_ARITH.ALL; IF SIG='1' THEN
use IEEE.STD_LOGIC_UNSIGNED.ALL; IF CUENTA2<REF THEN
PWMI<='1';
entity Absoluto is PWMD<='0';
Port ( Din : in STD_LOGIC_VECTOR (13 downto 0); ELSE
signo: out STD_LOGIC; PWMI<='0';
Absolute : out STD_LOGIC_VECTOR (7 downto 0)); PWMD<='1';
end Absoluto; END IF;
ELSE
architecture Behavioral of Absoluto is IF CUENTA2<REF THEN
signal CompDin, Compa2 : STD_LOGIC_VECTOR (13 downto 0); PWMI<='0';
begin PWMD<='1';
ELSE
process(Din) PWMI<='1';
begin PWMD<='0';
if Din(11)='1' then END IF;
Compdin<= NOT Din; END IF;
Compa2<=Compdin + "00000000000001"; END PROCESS;
Absolute<=Compa2(7 downto 0);
signo<=Din(13); end Behavioral;
else
Absolute<=Din (7 downto 0);
signo<=Din(13);
end if; Finalmente el código generador de PWM, el cual recibirá
end process;
como señal de referencia el resultado del PID y a la salida
end Behavioral; tendremos una señal proporcionada directamente al motor el
cual se moverá en conjunto con la dirección proporcionada
Este código llamado “Absoluto”, se encarga de tomar el valor por el programa “absoluto” hasta la referencia que hayamos
del PID, exclusivamente el bit más significativo y puesto directamente desde la tarjeta FPGA.
dependiendo del estado mandaremos una señal a la entidad
principal sobre a que lado deberá girar el motor. IV. CONCLUSIONES
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL; EL control de motores ya hemos visto que es importante
use IEEE.STD_LOGIC_UNSIGNED.ALL; en la industria para diferentes procesos, así que si nosotros
entity GENPWM is
pudimos desarrollar un control en una FPGA, o en un
Port ( REF : in STD_LOGIC_VECTOR (7 downto 0); microcontrolador podremos ser capaces de desarrollar otro
CLK : in STD_LOGIC; tipo de procesos de control igual o mayor de complejos. Esto
RST : in STD_LOGIC; nos sirve como practica y entendimiento de lo que es un
Sig : in STD_LOGIC;
PWMD : out STD_LOGIC;
sistema controlado, como manipular el error de manera que
PWMI : out STD_LOGIC); podamos tener un sistema deseado y todo a través de sensores
end GENPWM; y actuadores.
La dificultad en este tipo de proyectos es el desarrollo de
architecture Behavioral of GENPWM is
SIGNAL CUENTA : INTEGER RANGE 0 TO 25000;
tantos componentes y saber cómo deben ir interconectados,
SIGNAL CUENTA2, REF2 : STD_LOGIC_VECTOR(7 DOWNTO 0); pero si uno desarrollo un bosquejo antes de empezar es mas
SIGNAL CLK2 : STD_LOGIC:='0'; fácil comprender y relaciones estos componentes, además de
begin siempre tener en cuenta la resolución de las conexiones para
PROCESS(RST, CLK, CUENTA)
BEGIN
al final no tener problemas.
IF RST='1' THEN
CUENTA <= 0; V. Bibliografia
ELSIF CLK='1' AND CLK'EVENT THEN
IF CUENTA< 4895 THEN
CUENTA<=CUENTA+1;
https://www.monografias.com/trabajos74/motores-corriente-
ELSE directa/motores-corriente-directa.shtml
CUENTA <= 0;
CLK2<=NOT CLK2; https://es.wikipedia.org/wiki/Ingenier%C3%ADa_de_control
END IF;
END IF;
END PROCESS; https://es.wikipedia.org/wiki/Controlador_PID