Práctica 05 Control de velocidad de un motor DC
Primero. Revisa los recursos visuales y escritos de esta práctica
✍🏻 Videos de apoyo para el desarrollo de la práctica:
Explicación del PWM
Arduino: control de velocidad, con mosfet
Detector de posición
Medición de posición
Playlist Arduino/Labview/Matlab para motor cd
Modelar y controlar con PID un motor con arduino.
📚Recursos complementarios:
✍🏻 Descripción de la práctica de laboratorio:
El alumno construye un controlador de velocidad para un motor de CD, el cual deberá
establecerse cuando se presente una carga y tener algunas funcionalidades extras como
variador de velocidad , paro de emergencia, registro de velocidad promedio.
Segundo. Realiza un programa en Arduino donde se muestre la lectura de velocidad
empleando un tacómetro. Además, realiza un PWM apropiado y muestra tus resultados en
un osciloscopio y el efecto de la carga. No olvides preguntar tus dudas en la sesión de
laboratorio correspondiente para tener un mejor desempeño.
Tercero. Reporta la primera etapa de la práctica 5 y reporta tus resultados en la sección P5.
Entrega del reporte de la práctica. No olvides incluir al inicio del reporte una hoja con
portada con los nombres de los integrantes del equipo que participaron en la realización de
esta actividad.
Introducción
En esta práctica, se desarrolló un sistema de control de velocidad para un motor de corriente
directa (DC) mediante el uso de modulación por ancho de pulso (PWM). Se comenzó con la
caracterización de la velocidad del motor en función del ciclo de trabajo de la señal PWM,
con el fin de establecer la relación entre la señal de entrada y el comportamiento de la
velocidad. Posteriormente, se implementó un controlador que ajusta dinámicamente el ciclo
de trabajo.
Caracterizacion de la velocidad del motor
Se realizó un barrido de señal PWM al motor se inició en 0 y se fue aumentando de poco en
poco, registandro con un tacometro la velocidad en Revoluciones por minutos (RPM)
Valores obtenidos al caracterizar el motor
Con estos datos se calculó la función de transferencia del sistema
para obtener la FDT se consideró un sistema de primer orden donde:
𝑘
𝐻(𝑠) = τ𝑠+1
Se consideró el valor AK como 288.3, donde τ con las mediciones se determinó como 44
debido a la tasa de cambio observada en las mediciones por lo que se utilizó la siguiente
FDT:
1
𝐻(𝑠) = 44𝑠+1
Para obtener la ecuación en función del tiempo se aplicó un escalón de 255 obtuvimos la
siguiente expresión
1 255
𝑌(𝑠) = 44𝑠+1
· 𝑠
Al resolver las fracciones parciales de la expresión anterior obtuvimos una la siguiente
función:
−1
𝑡
𝑌(𝑡) =− 228. 3𝑒 44 + 228. 3
Comprobacion en matlab se la ecuacion
Gráfica PWM vs RPM y una ecuación ajustada a los datos.
C/C++
% Valores de PWM y RPM
PWM = [0, 22, 37, 40, 48, 55, 62, 70, 75, 80, 90, 100, 120, 140, 160,
180, 200, 220, 240, 255];
RPM = [0, 93.1, 137.7, 150.3, 157.8, 169.1, 177.1, 183.8, 187.7, 193,
196, 202.1, 208.7, 213.4, 217.3, 221, 223.7, 225.4, 227.2, 228.3];
% Crear la gráfica de los puntos PWM vs. RPM
figure;
plot(PWM, RPM, 'o', 'LineWidth', 1.5); % Marcadores de datos
hold on;
% Valores de PWM para la ecuación
x = linspace(0, 255, 100); % Rango de PWM de 0 a 255
y = -228.3 * exp(-x / 44) + 228.3; % Ecuación dada
% Graficar la ecuación
plot(x, y, 'r-', 'LineWidth', 1.5); % Línea roja para la ecuación
grid on;
% Etiquetas de los ejes
xlabel('PWM (%)');
ylabel('RPM');
title('Gráfica de PWM vs. RPM con Ecuación Ajustada');
% Leyenda
legend('Datos PWM-RPM', 'Ecuación Ajustada', 'Location',
'southeast');
% Personalización
xlim([0 255]);
ylim([0 max(RPM)+10]);
hold off;
Código e implementación en arduino de ecuación para calcular la velocidad angular RPM
Puede observarse cómo se despliegan los valores tanto del PWM como de la velocidad
angular del motor en RPM el resultado tiene un error muy pequeño el cual es despreciable
#include "math.h"
const int Potenciometro = A0;
const int Motor = 9;
float valorRPM = 0;
void setup() {
[Link](9600);
pinMode(Motor, OUTPUT);
}
void loop() {
int valorPOT = analogRead(Potenciometro);
int valorPWM = map(valorPOT, 0, 1023, 0, 255);
analogWrite(Motor, valorPWM);
// Ecuación para calcular valorRPM
valorRPM = -228.3 * exp(-valorPWM / 44.0) + 228.3;
[Link]("Valor Potenciometro: ");
[Link](valorPOT);
[Link](" - Valor PWM: ");
[Link](valorPWM);
[Link](" - Valor RPM: ");
[Link](valorRPM);
delay(1000);
}
La continuacion de esta implementaciones será implementar el controlador PID para poder
ajustar la velocidad a nuestra conveniencia, se programo el codigo pertinente pero ya no se
pudo implementar por cuestiones de tiempo.
C/C++
#include "math.h"
const int Potenciometro = A0; // Pin del potenciómetro
const int Motor = 9; // Pin del motor (PWM)
// Variables del sistema
double setpoint = 1500; // Setpoint deseado en RPM
double rpm; // Variable para almacenar el valor calculado
de RPM
double error, previous_error = 0;
double integral = 0;
double control_signal;
float valorPOT=0;
float valorPWM=0;
float valorRPM=0;
int pwm;
// Constantes PID
double kp = 1.0;
double ki = 1.0;
double kd = 1.0;
void setup() {
[Link](9600);
pinMode(Motor, OUTPUT);
}
void loop() {
// Leer el valor del potenciómetro
int valorPOT = analogRead(Potenciometro);
// Convertir el valor del potenciómetro en PWM
int valorPWM = map(valorPOT, 0, 1023, 0, 255);
// Calcular el RPM en función de la ecuación
valorRPM = -228.3 * exp(-valorPWM / 44.0) + 228.3;
// Llamar a la función de control PID para ajustar el PWM en base al
setpoint de RPM
control_PID();
// Salida de los datos al monitor serial
[Link]("Valor Potenciometro: ");
[Link](valorPOT);
[Link](" - Valor PWM: ");
[Link](valorPWM);
[Link](" - Valor RPM: ");
[Link](valorRPM);
delay(1000); // Retardo de 1 segundo
}
void control_PID() {
// error entre el setpoint y el RPM actual
error = setpoint - rpm;
// Proporcional
double P_out = kp * error;
// Componente Integral
integral += error * 1; // Acumulación del error (asumiendo tiempo de
muestreo = 1 segundo)
double I_out = ki * integral;
// Componente Derivativa
double derivative = (error - previous_error) / 1; // Derivada del error
double D_out = kd * derivative;
// Calcular la señal de control total
control_signal = P_out + I_out + D_out;
// Mapear la señal de control a un valor de PWM entre 30 y 255
pwm = map(control_signal, -2000, 2000, 30, 255);
// Limitar el PWM a valores entre 30 y 255
if (pwm >= 255) pwm = 255;
else if (pwm <= 30) pwm = 30;
// Aplicar el PWM ajustado al motor
analogWrite(Motor, pwm);
// Guardar el error actual para la próxima iteración
previous_error = error;
}
Conclusión:
A lo largo de esta práctica,logramos avanzar en el control de la velocidad de un motor DC
mediante la variación de señales [Link] una ecuación que relaciona la variación
de señales PWM con la velocidad angular en RPM, obteniendo resultados precisos que se
alinean con la caracterización.
Los resultados obtenidos muestran una relación de primer grado entre el PWM y los
RPM,evidenciada en la gráfica generada y en los valores RPM obtenidos,los cuales
presentaron un margen de error insignificante,validando nuestra ecuació[Link] ejercicio nos
permitió apreciar los efectos de la modulación por ancho de pulso en la respuesta del
sistema.