Está en la página 1de 11

UPIITA-IPN Circuitos lógicos

Práctica No. 10. Control digital y automatización


con circuitos secuenciales.

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.

• Generador de señal para


US.
• Control de un sistema de
empaquetado de cajas.
• Control de un sistema de
remachado.
• Control de un sistema de
troquelado.
• Control de un sistema de
lavado industrial.

• 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.

Figura 1. Piezas que conforman a un Servomotor.


Tipos de servomotor
• Servomotor DC (corriente continua). Funcionan con un pequeño motor de corriente continua. Convierte
la energía eléctrica en mecánica, provocando un movimiento rotatorio, gracias a la acción de un campo
magnético.
Le llega la energía de un variador para poder funcionar. El variador modula la electricidad que recibe el
motor, ya que las fuentes de alimentación tienen un flujo continuo de corriente, no se autorregulan. Por lo
tanto, el motor rota o no rota. Sin el variador no podríamos hacer que el motor empezara poco a poco,
ganara velocidad o que frene un poco o que bajara la velocidad.
• Servomotor AC (corriente alterna). También suelen tener un variador. Este servomotor aporta una
corriente más alta y por lo tanto se usan en aplicaciones industriales donde se requieren altas repeticiones
de alta precisión. Por ejemplo, se pueden utilizar en robots o fabricación en línea.
• Servomotore de imanes permanentes o Brushless. Es un motor eléctrico sin escobillas. La escobilla es el
elemento que ejerce conexión eléctrica entre la parte fija y la giratoria dentro del motor eléctrico.

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;

architecture encoder of ServoConTope is

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

if resetB = '1' or resetP = '1' then EP <= EA; cnt<=0;


elsif rising_edge(clkdiv(N)) then
case EP is
when EA =>
if AB = "00" then EP <= EA; cnt<=cnt; --hold
elsif AB = "10" then EP <= EB; --cw
if cnt = 36 then cnt <= 36;
elsif cnt < 36 then cnt <= cnt + 1;
else cnt <= cnt;
end if;
elsif AB = "01" then EP <= ED; --ccw
if cnt = 0 then cnt <= 0;
elsif cnt > 0 then cnt <= cnt - 1;
else cnt <= cnt;
end if;
end if;
when EB => cnt <= cnt; --hold
if AB = "10" then EP <= EB;
elsif AB = "11" then EP <= EC;
elsif AB = "00" then EP <= EA;
end if;
when EC =>
if AB = "11" then EP <= EC; cnt<=cnt; --hold
elsif AB = "01" then EP <= ED; --cw
if cnt = 36 then cnt <= 36;
elsif cnt < 36 then cnt <= cnt + 1;
else cnt <= cnt;
end if;
elsif AB = "10" then EP <= EB; --ccw
if cnt = 0 then cnt <= 0;
elsif cnt > 0 then cnt <= cnt - 1;
else cnt <= cnt;
end if;
end if;
when ED => cnt <= cnt; --hold
if AB = "01" then EP <= ED;
elsif AB = "00" then EP <= EA;
elsif AB = "11" then EP <= EC;
end if;
when others => null;
end case;
end if;
end process FSM;
-------------------------------------
ModulPulso: process(clk,servo)--proceso que genera el pulso de salida e indica en el display un valor
begin
if rising_edge(clk) then cntPWM <= cntPWM + 1; --contador de 1 a 500,000
high <= min + ((cnt)*(inc));
if cntPWM <= high then servo <= '1';
else servo <= '0';
end if;
end if;
servomotor <= servo; --salida de la seal PWM hacia el servomotor
servoLED <= servo; --salida de la seal PWM del led testigo
end process ModulPulso; -- fin del proceso
--------------------------------
Process(clk)
begin
if rising_edge (clk) then
cuenta<=cuenta+1;
if (cuenta=124_999) then
sel <= sel+1;
cuenta<=0;
end if;
end if;
end process ;
-------------------------------
PROCESS(D, SEL, CNT, UNI, DEC ,CEN)
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
##############################################################

# reset asíncrono en alto en la nexys2 (BTN0) y en el encoder (Push)


net "resetB" loc =L1 ; # btn0
net "resetP" loc =J1 ; #

net "A" loc =E3 ; #


net "B" loc =E4 ; #

# salidas de pwm para el servomotor y un led testigo


net "servomotor" loc =F4 ; # JD4
net "servoLED" loc =N12; # LD7

##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

Figura 2. Control de la Posición de una cámara Web por medio de un Enconder


mecánico.
ESQUEMATICO

Figura 3. Control de la Posición de una cámara Web por medio de un Enconder


mecánico.
VIDEO
https://youtu.be/OvFBdRNiqAs
Tabla de grados
Tiempo en alto del Ángulo de posición para Sentido de giro para un
PWM @ f = 100Hz un servomotor con tope servomotor sin tope
1ms 0° Horario
1.5 ms 90° Parado
2 ms 180° Antihorario

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

Huerta García Kevin Axel.


El uso de un enconder captura continuamente la posición del servomotor y proporciona retroalimentación en
tiempo real, en las pruebas, se notaban ciertos errores de posición o incluso avance de los grados deseados,
notábamos un desfase en las posiciones críticas, con algunas correcciones, se programaron los circuitos
secuenciales para procesar esta información y generan las señales de control adecuadas.
La implementación exitosa de este sistema demuestra la importancia y versatilidad de la automatización en la
ingeniería moderna.
¿Qué opino del relato? Es un relato algo cómico, pero nos da a entender perfectamente la moraleja, en muchas
ocasiones al desarrollo de las practicas nos encasillamos tanto en un método para resolver la problemática que
olvidamos lo que en verdad buscamos, resultados, un sistema que funcione y cumpla con la descripción de la
práctica.

Santacruz Bravo Iván Rodrigo.


Con el desarrollo de esta práctica me pude dar una idea sobre el principio de funcionamiento de un PWM y su
uso dentro de un servomotor al cual le tuvimos que prestar especial atención para que este arrojara los ángulos
deseados, el poder controlar la rotación que este nos da nos puede resultar en un sin sinfín de aplicaciones como
lo sería el control de una antena haciendo que apunte hacia una dirección en específico así como el control de la
rotación de una WebCam que se presentó en esta práctica.
Pasando al relato, pese al tono cómico de la ironía que se maneja dentro de él, me parece que se maneja un mensaje
bastante profundo sobre la infinidad de caminos que uno puede tomar para lograr un objetivo, si bien no sabemos
si el objetivo de ambos personajes era llegar al cielo, se nos deja claro que las recompensas que el cielo ofrecía
se median con la métrica de a cuantas personas hacia orar, predicar, etc. Sin importar el medio que estos usaran
para lograrlo, lo cuál me deja con la reflexión sobre de cuantas maneras podemos resolver un objetivo cuando lo
que se esta revisando son los resultados de este y no tanto el proceso en sí.

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

• P. (2022, 25 enero). ¿Qué es un servomotor? ¿Cómo funciona? •. Electronic Board.

https://www.electronicboard.es/que-es-un-servomotor-como-funciona/

También podría gustarte