UNIVERSIDAD CATÓLICA DE SANTA MARÍA
Facultad de Ciencias e Ingenierías Físicas y Formales
Escuela Profesional de Ingeniería Mecánica,
Mecánica-Eléctrica y Mecatrónica.
Control Digital - 05
Informe 8 - Control de velocidad de un motor DC con Arduino
y simulink
INTEGRANTES:
- Mamani Condori, Jose Ignacio
- Pizarro Andia, Mathias Francesco
DOCENTE:
- Quispe Cacchuco, Marcelo Jaime
Arequipa, Perú
20/05/25
CONTROL DIGITAL - 05
ÍNDICE
1. OBJETIVOS........................................................................................... 3
2. MATERIALES........................................................................................ 3
3. TAREAS A RESOLVER...........................................................................3
4. MARCO TEÓRICO.................................................................................3
5. DESCRIPCIÓN DE LA TAREA A RESOLVER........................................... 7
6. OBSERVACIONES Y CONCLUSIONES.................................................15
CONTROL DIGITAL - 05
1. OBJETIVOS
● Realizar el control de velocidad de un motor DC con Arduino y simulink.
2. MATERIALES
Recomendados para la práctica
● PC con software MATLAB
● 1 Arduino
● Motor Dc con encoder incremental.
● Puente H
● Jumpers
3. TAREAS A RESOLVER
● Implementar un control PID y visualizar el desempeño del controlador
implementado en Arduino.
4. MARCO TEÓRICO
4.1. Técnica de control PWM
La modulación por ancho de pulsos (PWM) se utiliza mucho en los sistemas
de control para controlar el valor promedio de un voltaje de c.d.
Entonces, si hay un voltaje analógico constante y se divide en pulsos
variando el ancho de los pulsos el valor promedio del voltaje puede
modificarse. En la Figura 3.25 se ilustra esto. El término ciclo de trabajo se
refiere a la fracción de cada ciclo en la cual el voltaje es alto. En el caso de
una señal PWM, el valor es alto durante la mitad de cada ciclo y el ciclo de
trabajo es ½ o 50%. Si esto sucede sólo durante una cuarta parte de cada
ciclo, el ciclo de trabajo es de ¼ o 25%.
Figura 1: PWM para control de voltaje: a) ciclo de trabajo 50%, b) ciclo de trabajo 25%.
CONTROL DIGITAL - 05
4.2. El puente H. Funcionamiento del puente completo
Ahora nos basta un circuito idéntico para la segunda rama del puente "H"
como podemos ver en la figura. Ya tenemos nuestro puente completo y lo
podemos conectar a un motor. Observen que la entrada de habilitación (ENA)
está conectada a las dos ramas del puente mientras que las otras dos
entradas (In1 e In2) son independientes. Para mayor claridad no se han
representado las resistencias necesarias en las bases de los transistores.
Figura 2: Puente "H" completo con lógica de control
Con ENA a 0V, todas las salidas de las puertas AND están también a 0V y por
lo tanto, los transistores están abiertos y el motor se encuentra no
alimentado (condición de reposo). Si ponemos ENA a positivo y las entradas
IN1 e IN2 a 0V, se activarán las puertas "B" y "D" con sus transistores
respectivos (que tienen la entrada invertida). En esta condición, las dos
entradas del motor estarán a masa y este no se moverá tampoco porque falta
el positivo.
Figura 3: Puente H con solo la entrada de control ENA a positivo (motor frenado)
CONTROL DIGITAL - 05
Si ponemos la entrada IN1 a positivo mientras mantenemos la entrada IN2 a
0V, la puerta "A" se activará junto con la "D", mientras que la "B" junto con la
"C" estarán desactivadas y el motor recibirá tensión positiva desde el
transistor conectado a la puerta "A" y negativo desde el transistor conectado
a la puerta "D". El motor girará en un sentido.
Figura 4: Puente H con las entradas de control IN1 y ENA a positivo (giro del motor horario)
Si en lugar de la entrada IN1, ponemos a positivo la entrada IN2 mientras
mantenemos la entrada IN1 a 0V, la puerta "C" se activará junto con la "B",
mientras que la "A" junto con la "D" estarán desactivadas y el motor recibirá
tensión positiva desde el transistor conectado a la puerta "C" y negativo
desde el transistor conectado a la puerta "B". El motor girará en sentido
contrario.
Figura 5: Puente H con las entradas de control IN2 y ENA a positivo (giro del motor antihorario)
En el caso de poner las entradas IN1 e IN2 a positivo, las puertas activas con
los transistores respectivos serán "A" e "C", ambos contactos del motor
estarán a positivo, pero faltando la masa, este no se moverá, como en el caso
que vimos con IN1 e IN2 a 0V.
CONTROL DIGITAL - 05
Figura 6: Puente H con todas las entradas de control a positivo (motor frenado)
4.3. El driver L298N
El driver L298N es un dispositivo que permite controlar el sentido de
funcionamiento de motores a una corriente de salida por canal de hasta 2A.
Este módulo cuenta con un disipador de calor acorde a las características de
este driver, sus características de diseño le permiten un rendimiento
anti-interferencia excepcional, puede llegar a trabajar hasta con un nivel de
tensión de entrada de 46V, aunque por cuestiones de seguridad se
recomiendo usar niveles de tensión algo debajo de este valor límite. Puede
llegar a manejar un motor paso a paso de dos fases y cuatro fases, o dos
motores de corriente continua. Este módulo incluye un regulador de voltaje
78M05 para obtener la energía de alimentación del dispositivo, sin embargo,
cuando se superan los 12V, se sugiere usar una fuente de poder externa de 5V
como fuente de alimentación digital y deshabilitar el jumper de 12V. Este
módulo tiene gran capacidad de filtrado de ruido, cuenta con un diodo de
protección ante corriente inversa, haciendo que su funcionamiento sea más
estable y fiable.
Figura 7: Puente H, L298N
CONTROL DIGITAL - 05
5. DESCRIPCIÓN DE LA TAREA A RESOLVER
Para iniciar con la práctica realizada en clase, procedemos a configurar el
código que se usará para controlar la velocidad y el sentido de giro de un
motor. En este caso, se realizará una regulación de velocidad mediante PWM
en el pin 3, mientras que los pines 4 y 5 se usarán para definir el sentido de
giro (horario o antihorario). El pin PWM es el encargado de controlar la
velocidad, mientras que los pines IN4 e IN3 determinan la dirección del motor.
CONTROL DIGITAL - 05
Posteriormente, importaremos una librería que nos permitirá usar el sensor
encoder, el cual nos ayudará a medir las revoluciones por minuto (RPM) del
motor. Este sensor está conectado al pin número 2 del Arduino y, mediante
interrupciones, contará los pulsos generados por el encoder para calcular la
velocidad del motor en tiempo real.
#include <util/atomic.h>
#define ENCODER_B 2
int PWM = 3;
int IN4 = 4;
int IN3 = 5;
int velocidad = 0;
volatile int pulsos = 0;
unsigned long timeold;
int resolution = 20;
void setup() {
[Link](9600);
pinMode(ENCODER_B,INPUT);
CONTROL DIGITAL - 05
pinMode(PWM, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(IN3, OUTPUT);
timeold = 0;
attachInterrupt(digitalPinToInterrupt
(ENCODER_B),leerEncoder,RISING);
void loop() {
float rpm;
if(millis()-timeold>=100)
ATOMIC_BLOCK(ATOMIC_RESTORESTATE){
rpm=float((60.0*1000.0/resolution)/(millis()-timeold)*pulsos);
timeold=millis();
pulsos=0;
[Link]("RPM: ");
[Link](rpm);
analogWrite(PWM, 215);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
void leerEncoder(){
pulsos++;
}
CONTROL DIGITAL - 05
CONTROL DIGITAL - 05
Finalmente, en esta etapa de la práctica se implementará un control
proporcional-integral (PI) para regular la velocidad del motor DC. El objetivo es
lograr una estabilización en la velocidad del motor, controlando la señal PWM
para que la velocidad real (medida en revoluciones por minuto o RPM a través
del sensor encoder) se acerque lo más posible al valor deseado o setpoint, que
en este caso es de 200 RPM.
El sensor encoder está conectado al pin 2 y genera pulsos que permiten medir
la velocidad del motor en tiempo real. Cada 100 ms se calcula la velocidad
actual en RPM a partir de la cantidad de pulsos contados y la resolución del
encoder (20 pulsos por vuelta).
El controlador PI ajusta la señal PWM basándose en el error entre el setpoint y
la velocidad actual, aplicando una acción proporcional y una acción integral
para minimizar dicho error y alcanzar la velocidad deseada de manera estable.
#include <util/atomic.h>
#define ENCODER_B 2
#define IN1 4//Para dirección de motor EN1
#define IN2 5//Para dirección de motor EN2
#define ENA 3//La salida del PWM
int resolution=20;//numero de pulsos x vuelta del econder
int setpoint=200;//es un valor en rpm
float Kp=0.8;//consatnte proporcional
float Ki=0.5;//consatnte proporcional
float pwm;//el valor a escribir en el pwm
float rpm;//la velocidad real de las rpm del motor dc
float error;//error actual
float pwm_ant=0;//pwm anterior
float error_ant=0;//error anterior
volatile int pulsos=0;
unsigned long timeold;
float T=0.1;//100 milisegundos
void setup() {
CONTROL DIGITAL - 05
// put your setup code here, to run once:
[Link](9600);
pinMode(ENCODER_B,INPUT);
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(ENA,OUTPUT);
timeold=0;
attachInterrupt(digitalPinToInterrupt(ENCODER_B),leerEncoder,RISING
);
void loop() {
// put your main code here, to run repeatedly:
if (millis()-timeold>=100){
ATOMIC_BLOCK(ATOMIC_RESTORESTATE){
rpm=float((60.0*1000.0/resolution)/(millis()-timeold)*pulsos);
timeold=millis();
pulsos=0;
error=setpoint-rpm;
//pwm=pwm_ant+Kp*error;//control proporcional
pwm=pwm_ant+(Kp+Ki*T/2)*error-(Kp-Ki*T/2)*error_ant;//control
if (pwm>255){//limite superior
pwm=255; }
if (pwm<0){//limite inferior
pwm=0; }
pwm_ant=pwm;
error_ant=error;
CONTROL DIGITAL - 05
[Link](setpoint);
[Link](" ");
[Link](rpm);
[Link]();
//variacion de la velocidad
analogWrite(ENA,pwm);
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
//funcion para leer el encoder
void leerEncoder(){
pulsos++;
Además, se controlan los pines IN1 e IN2 para definir la dirección del motor, y
el pin ENA (PWM) para regular la velocidad. El valor calculado de PWM está
limitado entre 0 y 255 para no exceder los rangos válidos del Arduino.
Los valores de la constante proporcional (Kp = 0.8) y la constante integral (Ki =
0.5) fueron seleccionados para lograr un buen compromiso entre respuesta
rápida y estabilidad.
CONTROL DIGITAL - 05
CONTROL DIGITAL - 05
6. OBSERVACIONES Y CONCLUSIONES
CONCLUSIONES:
● La práctica destacó el empleo de la modulación por ancho de pulsos (PWM) para
variar el voltaje promedio aplicado al motor. Esto permitió ajustar la velocidad de
manera eficiente, confirmando que el PWM es una técnica fundamental en el
control de motores DC, especialmente en entornos donde se requiere precisión y
bajo costo.
● Aunque el control PID funcionó correctamente, el informe sugiere que la elección
de los valores de Kp y Ki requirió ajustes iterativos. Esto refleja un desafío común
en control automático: la sintonización de parámetros para equilibrar rapidez,
estabilidad y precisión. La inclusión de límites en la señal PWM (0-255) evitó
saturación y protegió el hardware.
● El encoder incremental permitió medir la velocidad real del motor (en RPM)
mediante el conteo de pulsos. Esta retroalimentación fue crucial para el control
PID, ya que proporcionó datos en tiempo real para calcular el error y ajustar la
señal PWM. La resolución del encoder (20 pulsos por vuelta) demostró ser
suficiente para garantizar mediciones precisas.
● El uso de la comunicación serial en Arduino permitió visualizar las RPM del motor
y compararlas con el setpoint, facilitando la depuración y validación del sistema.
Herramientas como el monitor serial son esenciales en proyectos prácticos, ya
que proporcionan retroalimentación inmediata sobre el desempeño del
controlador.
● El puente H, implementado con el driver L298N, facilitó el control bidireccional
del motor y la gestión de corrientes elevadas. La tabla de verdad presentada en el
informe ilustra claramente cómo las señales de entrada (ENA, IN1, IN2)
determinan el estado del motor (encendido, apagado, giro horario o antihorario),
lo que subraya la importancia de este componente en sistemas de control
motriz.
OBSERVACIONES:
● La práctica no sólo consolidó conceptos teóricos (PWM, PID, puente H), sino que
también reforzó habilidades prácticas en programación, electrónica y trabajo en
equipo. Sin embargo, sería valioso profundizar en el análisis de errores o en la
comparación de diferentes métodos de sintonización PID para futuras
iteraciones.