Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Equipo 8:
Meza Chávez Jorge
“El aprendizaje nunca agota la mente y siempre se agradece
recibirla”
Huerta Garcia Kevin Axel
"Aprender siempre es divertido, incluso cuando es tedioso".
Santacruz Bravo Iván Rodrigo.
"Aprender algo nuevo es sinónimo de expandir los límites de la mente".
Grupo:2MV12
Resumen
En este trabajo se presenta el desarrollo de circuitos combinacionales y secuenciales en lenguajes de bajo nivel
como VHDL y Verilog para implementarlo en una tarjeta de desarrollo FPGA, con el objetivo de desarrollar
circuitos combinacionales para implementar en un servo motor.
Abstract
This work presents the development of combinational and sequential circuits using low-level languages such as
VHDL and Verilog to implement them on an FPGA development board. The goal is to create circuits for both
counting and detection, in order to perform various output actions. Subsequently, programming is developed to
control a servo motor and a stepper motor.
要約
この論文では、VHDLやVerilogなどの低レベル言語を使用して、FPGA開発ボードに実装するための
組合せ回路および順序回路の開発が紹介されています。その目的は、カウントおよび検出回路を開発
し、さまざまな出力アクションを実行することです。その後、サーボモーターおよびステッピングモ
ーターを制御するためのプログラミングが開発されます。
Puntos VHDL Verilog UCF FOTOS Diagramas Video
• Control de posición de
un servomotor con tope.
✓ ✓ ✓ ✓ ✓
• Control de velocidad de
un servomotor sin tope.
• Control de velocidad y
sentido de giro de un
motoreductor.
• Medidor de distancia en
caída libre de un objeto.
• Medidor de RPM
(tacómetro).
•Medidor de temperatura.
• Medidor de distancia
con el sensor ultrasónico
SRF05.
• Generador de señal
rampa.
• Generador de señal
senoidal.
• Generador de señal ECG.
• Sistema de transmisión-
recepción utilizando
dispositivos IR o de RF
para el control
on-off de tres cargas.
Introducción
Servomotor es un motor eléctrico
Un servomotor es un motor eléctrico que hace accionar partes de una maquina con alta eficiencia y precisión. El
servomotor trabaja junto con un sensor, también llamado encoder, que lo retroalimenta, es decir que le manda
constantemente una señal de velocidad y posición exacta al servo. Esto permite calcular o aplicar la corrección
necesaria para que el motor quede en la posición deseada y poder tener un control exacto evitando posibles
variaciones.
Los servomotores se aplican en muchos sistemas y productos industriales como la robótica, la automatización, la
manipulación de materiales, farmacéutica, ¡Incluso en los brazos robóticos!
Una de sus ventajas es que siempre son constantes y trabajan al mismo ritmo, no paran. Pese a su efectividad que
compensa, suelen tener un coste elevado en cuanto a mantenimiento.
Partes de un servomotor
Un servomotor es en realidad un conjunto de piezas que forman un servomecanismo. El servo es el elemento
capaz de convertir la energía eléctrica en mecánica gracias a la acción de los campos magnéticos que se encuentran
dentro del motor. Sus componentes principales son:
• Motor de corriente continua DC (parte eléctrica): es el principal componente del servo el cual
proporcionara el movimiento.
• Engranajes reductores (parte mecánica): se encarga de reducir la velocidad de giro del motor para
incrementar su capacidad de torque.
• Sistema de control (parte electrónica): es la encargada de enviar información y de alimentar al motor. Es
una placa electrónica que ajusta una estrategia de control de la posición angular mediante la
retroalimentación. Para ello, el circuito compara la señal de entrada de referencia o posición deseada con
la posición actual medida por el potenciómetro. La diferencia entre la posición actual y la posición deseada
se amplifica y se utiliza para mover el motor en la dirección necesaria para reducir el error de posición.
• Encoder: le dice al variador (que le está dando potencia al servo) en qué posición está a cada momento el
servomotor.
Desarrollo
1. Control de posición de un servomotor con tope- (0°-180°) con encoder
rotatorio.
CONFIRMACIÓN DE LA TEORÍA.
Se observó el cambio del movimiento del servomotor dependiendo del movimiento del encoder
cambia la posición del servo en el mismo sentido. Las posiciones que abarca el servo es de 0°
hasta 180°, con una resolución de 5°.
CODIGO VHDL DE ENTRADAS Y SALIDA
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ServoConTope is
Generic(
msb : integer := 6 ;--número de bits del contador
min : integer := 25_000; --valor mínimo del contador para el tiempo en alto
max : integer := 125_000; --valor máximo del contador para el tiempo en alto
inc : integer := 2_857; -- incremento para el tiempo en alto
N : integer := 17); --divisor
Port (
clk : in STD_LOGIC;--reloj de 50MHz de la nexys2
resetB,resetP : in STD_LOGIC;--reset asíncrono en alto en la nexys2 (BTN0) y en el encoder (Push)
A,B : in STD_LOGIC;--señales A y B del encoder
-- contador : inout STD_LOGIC_VECTOR (msb-1 downto 0);--salida del contador de 5 bits
cuando msb=5
display : out STD_LOGIC_VECTOR (6 downto 0):="0000000";--salida a display
de 7 segmentos + P
AN : out STD_LOGIC_VECTOR (7 downto 0);--salida a los nodos
servomotor,servoLED : out STD_LOGIC--salidas de pwm para el servomotor y un led testigo
);end ServoConTope;
type edos is (EA, EB, EC, ED);--se utiliza una FSM moore para leer el encoder
signal EP : edos:=EA;
signal clkdiv : std_logic_vector(N downto 0); --señal para el divisor
signal AB : std_logic_vector (1 to 2); --señal que une las señales del encoder
signal cntPWM : integer range 1 to 500000 := 1; --contador de 10ms @ clk=50MHz
signal cuenta : integer range 0 to 125_000 := 1; --contador de 400 Hz PARA DISPLAY
signal cnt : integer range 0 to 36:= 0; --contador de 0 a 11
signal UNI : integer range 0 to 5:= 0; -- salida para el signo
signal DEC : integer range 0 to 9:= 0; -- salida para el signo
signal CEN : integer range 0 to 1:= 0; -- salida para el signo
signal servo : std_logic; --seal de PWM para las salidas servos
signal high : integer range min to max := min; --duración del tiempo en alto de la
signal SEL : integer range 0 to 2:= 0; -- selector de barrido
signal D : integer range 0 to 9:= 0;-- almacena los valores del disp
begin
AB <= a & b; --unión (concatenación) de las señales del encoder
divisor: process(clk,resetB,resetP)--proceso del divisor
begin
if resetB = '1' or resetP = '1' then clkdiv <= (others => '0');
elsif rising_edge(clk) then clkdiv <= clkdiv + 1;
end if;
end process divisor;
-------------------------------------------
FSM: process (clkdiv(N),resetB,resetP,cnt)-- giros del encoder y genera la variable cnt
begin
CASE(CNT) IS
when 0 => UNI <= 0; DEC <= 0; CEN <= 0; -- 0 al display
when 1 => UNI <= 5; DEC <= 0; CEN <= 0; -- 0 al display
when 2 => UNI <= 0; DEC <= 1; CEN <= 0; -- 0 al display
when 3 => UNI <= 5; DEC <= 1; CEN <= 0; -- 0 al display
when 4 => UNI <= 0; DEC <= 2; CEN <= 0; -- 0 al display
when 5 => UNI <= 5; DEC <= 2; CEN <= 0; -- 0 al display
when 6 => UNI <= 0; DEC <= 3; CEN <= 0; -- 0 al display
when 7 => UNI <= 5; DEC <= 3; CEN <= 0; -- 0 al display
when 8 => UNI <= 0; DEC <= 4; CEN <= 0; -- 0 al display
when 9 => UNI <= 5; DEC <= 4; CEN <= 0; -- 0 al display
when 10=> UNI <= 0; DEC <= 5; CEN <= 0; -- 0 al display
when 11=> UNI <= 5; DEC <= 5; CEN <= 0; -- 0 al display
when 12=> UNI <= 0; DEC <= 6; CEN <= 0; -- 0 al display
when 13=> UNI <= 5; DEC <= 6; CEN <= 0; -- 0 al display
when 14=> UNI <= 0; DEC <= 7; CEN <= 0; -- 0 al display
when 15=> UNI <= 5; DEC <= 7; CEN <= 0; -- 0 al display
when 16=> UNI <= 0; DEC <= 8; CEN <= 0; -- 0 al display
when 17=> UNI <= 5; DEC <= 8; CEN <= 0; -- 0 al display
when 18=> UNI <= 0; DEC <= 9; CEN <= 0; -- 0 al display
when 19=> UNI <= 5; DEC <= 9; CEN <= 0; -- 0 al display
when 20=> UNI <= 0; DEC <= 0; CEN <= 1; -- 0 al display
when 21=> UNI <= 5; DEC <= 0; CEN <= 1; -- 0 al display
when 22=> UNI <= 0; DEC <= 1; CEN <= 1; -- 0 al display
when 23=> UNI <= 5; DEC <= 1; CEN <= 1; -- 0 al display
when 24=> UNI <= 0; DEC <= 2; CEN <= 1; -- 0 al display
when 25=> UNI <= 5; DEC <= 2; CEN <= 1; -- 0 al display
when 26=> UNI <= 0; DEC <= 3; CEN <= 1; -- 0 al display
when 27=> UNI <= 5; DEC <= 3; CEN <= 1; -- 0 al display
when 28=> UNI <= 0; DEC <= 4; CEN <= 1; -- 0 al display
when 29=> UNI <= 5; DEC <= 4; CEN <= 1; -- 0 al display
when 30=> UNI <= 0; DEC <= 5; CEN <= 1; -- 0 al display
when 31=> UNI <= 5; DEC <= 5; CEN <= 1; -- 0 al display
when 32=> UNI <= 0; DEC <= 6; CEN <= 1; -- 0 al display
when 33=> UNI <= 5; DEC <= 6; CEN <= 1; -- 0 al display
when 34=> UNI <= 0; DEC <= 7; CEN <= 1; -- 0 al display
when 35=> UNI <= 5; DEC <= 7; CEN <= 1; -- 0 al display
when 36=> UNI <= 0; DEC <= 8; CEN <= 1; -- 0 al display
when others => UNI <= 0; DEC <= 8; CEN <= 1; -- 0 al display
END CASE;
CASE(sel) IS
when 0 => AN <="11111110"; D <= UNI; -- UNIDADES
when 1 => AN <="11111101"; D <= DEC; -- DECENAS
when 2 => AN <="11111011"; D <= CEN; -- CENTENAS
when OTHERS =>AN <="11111111"; D <= CEN; -- signo
END CASE;
case D is --orden: abcdefgP-nodo comn, contador = salida a leds
when 0 => display <= "0000001"; -- 0 al display
when 1 => display <= "1001111"; -- 1 al display
when 2 => display <= "0010010"; -- 2 al display
when 3 => display <= "0000110"; -- 3 al display
when 4 => display <= "1001100"; -- 4 al display
when 5 => display <= "0100100"; -- 5 al display
when 6 => display <= "0100000"; -- 6 al display
when 7 => display <= "0001111"; -- 7 al display
when 8 => display <= "0000000"; -- 8 al display
when 9 => display <= "0000100"; -- 9 al display
when others => display <= "1111110";
end case;
end process;
end encoder;
Asignación de pines
Por ultimo asignamos nuestros pines asociados a la tarjeta de desarrollo en un archivo tipo .ucf
##############################################################
//Pines Amiba 2 FTG
##############################################################
##Clock signal
Net "clk" LOC=E7; # 100MHz
## 7 DISPLAYment display
Net "DISPLAY[6]" LOC = P16; # A
Net "DISPLAY[5]" LOC = P15; # B
Net "DISPLAY[4]" LOC = T15; #C
Net "DISPLAY[3]" LOC = T14; #D
Net "DISPLAY[2]" LOC = T13; #E
Net "DISPLAY[1]" LOC = R16; #F
Net "DISPLAY[0]" LOC = R15; #G
//Anodos
Net "an[0]" LOC = G16; # DP4
Net "an[1]" LOC = F16; # DP3
Net "aN[2]" LOC = E16; # DP2
Net "an[3]" LOC = D16; # DP1
Net "an[4]" LOC = E15; # DP4
Net "an[5]" LOC = C15; # DP3
Net "aN[6]" LOC = D11; # DP2
Net "an[7]" LOC = E11; # DP1
FOTOS
CONCLUSIONES
Meza Chávez Jorge.
En el momento que se configura el PWM para controlar la posición del servomotor es necesario conocer muy
bien las especificaciones del servo motor para mantener una buena precisión. En este caso el servomotor no
resteaba de buena manera las especificaciones de su hoja de datos, por lo que se optó en realizar varias pruebas
para aproximar el ángulo de giro a los valores deseados
BIBLIOGRAFÍA
• Alvarez, R. (2023, 7 abril). Introducción a las Máquinas de Estado Finito.
https://tecbolivia.com/index.php/articulos-y-tutoriales-microcontroladores/13-introduccion-a-las-
maquinas-de-estado-finito
https://www.electronicboard.es/que-es-un-servomotor-como-funciona/