Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Control Experto de Motores DC: Consejos y Trucos con Controlador PID

Componentes y Suministros

Arduino Due (o cualquier placa Arduino) × 1
Pantalla TFT Makeblock Me (opcional) × 1
Resistor 4.75 kΩ (x4) × 4
Potenciómetro Rotativo (x4, 3 opcionales para ajustar coeficientes PID) × 4
Transistor PNP Uso General (x4, ej. BC307A) × 4
Motor DC Genérico × 1
Interruptor Deslizante (para selección de dirección) × 1
Sensor Velocidad Fotoeléctrico HC-020K × 1
Protoboard y Cables Jumper × 1

Aplicaciones y Servicios Online

Sobre este Proyecto

Control de Velocidad y Dirección de Motores DC mediante Controlador PID y Salidas PWM

Introducción

La mayoría de proyectos intentan controlar velocidad y dirección enviando PWM directamente al motor (incluso a través de un driver). Sin embargo, este método falla cuando se requiere precisión debido a la fricción y la inercia. La velocidad real nunca coincide con el punto de consigna (setpoint), generando un error significativo.

La solución es el control PID.

Controlador PID

Imagina conducir un coche: para arrancar pisas el acelerador a fondo; en crucero lo mantienes suave; si aceleras demasiado, lo sueltas. El PID hace lo mismo:

Función PID implementada en Arduino:

float controllerPID(float _E, float _Eprev, float _dT, float _Kp, float _Ki, float _Kd) {
  float P = _Kp * _E;
  float I = _Kp * 0.5 * _Ki * (_E + _Eprev) * _dT;
  float D = _Kp * _Kd * (_E - _Eprev) / _dT;
  return (P + I + D);
}

La salida final PWM se calcula sumando la salida actual más la salida del PID:

E = RPMset - RPM;
float cPID = controllerPID(E, Eprev, dT, Kp, Ki, Kd);
if (RPMset == 0) OutputRPM = 0;
else OutputRPM = OutputRPM + cPID;
if (OutputRPM < _minRPM) OutputRPM = _minRPM;

Circuito de Alimentación del Motor DC

Nunca alimentes un motor DC directamente desde el Arduino. Se necesitan transistores. Los motores se controlan por corriente, no voltaje. Usé 4 transistores PNP BC307A en puente H para invertir la corriente. Es crucial seleccionar transistores con ganancia (hfe) similar. Para dimensionar la resistencia de base:

R = (VT - VBEon) * hfe / IM

En mi caso: IM=70mA, hfe≈140, VBEon=0.62V, VT=3.3V (Arduino Due) → R≈5360Ω (usé 4.9kΩ).

Inversión de Dirección y Notas Importantes

Para invertir dirección, se invierte el flujo de corriente mediante el puente de 4 transistores. PWM Output#2 activa T1A/T1B (sentido horario), PWM Output#3 activa T2A/T2B (antihorario).

Corriente de arranque: Los motores consumen picos de corriente al arrancar (≈130% nominal). Si se invierte polaridad sin detenerse antes, pueden producirse picos destructivos. Mi código incluye una rutina que pone ambos PWM a cero y espera a que el motor se detenga antes de cambiar dirección.

Lectura de Velocidad

Sensor HC-020K (20 ranuras). Alimentado a 3.3V (compatibilidad Arduino Due). Función de lectura de frecuencia:

int readFrequency(int pin, float speed) {
  // Cuenta flancos descendentes durante 1/speed segundos
  // Devuelve frecuencia en Hz
}
RPM = 60 * readFrequency(pin, 4) / 20;

Mejoras Gráficas (Opcional)

Usé pantalla Makeblock Me TFT LCD con funciones personalizadas para dibujar ejes cartesianos, limpiar áreas y trazar gráficas en tiempo real (consigna vs real, coeficientes PID, error, salida).

Conclusión

Se adjuntan dos versiones del código: con y sin funciones gráficas. Normalmente un motor DC no baja del 10-20% de velocidad nominal, pero con PID se puede llegar al 5% en vacío.

Nota (25/02/2018): Si usas transistores NPN en lugar de PNP, la polarización es inversa: PNP E(+) C(-), NPN C(+) E(-).

Código

Versión Completa (con Gráficos)

Incluye configuración de pantalla, ejes cartesianos, alarmas visuales, ploteo de curvas y gestión de alarmas. Código extenso disponible en el tutorial original.

Versión Simplificada (Solo Control PID)

Incluye solo la lógica de control: lectura de entradas (potenciómetros para Kp, Ki, Kd, consigna, dirección), cálculo PID, cambio de dirección seguro, escritura PWM y lectura de velocidad. Código completo en el tutorial.

Esquemáticos

Prototipo explicativo del control de velocidad por PID y consideraciones para inversión de dirección. Ver imagen adjunta.

Proceso de manufactura

  1. Construya Efectos de Audio Controlados por Sensores con el Kit Satellite CCRMA
  2. Controla Dos Motores Paso a Paso con Arduino Nano y Joystick - Tutorial Sencillo
  3. Control de Matriz LED 8×8 con Arduino Uno: Guía Paso a Paso
  4. Sistema inteligente de monitorización de temperatura para escuelas: preciso, en tiempo real y seguro
  5. Librería Eficiente de Puerto I/O de 8 Bits para Arduino – Expande el Control Digital
  6. Teclado Prototipo de 64 Teclas con Arduino: Matriz con Registros de Desplazamiento
  7. Pantalla TFT Shield de Alto Rendimiento 2.8” para Arduino Nano – Display SPI 320×240
  8. Circuito de entrada analógica aislada para Arduino
  9. Detector de Rayos Económico con Arduino Uno
  10. Kit de Robot de Navegación Interior Inteligente para Proyectos Arduino
  11. Mejorando rendimiento de motores DC con aleaciones Tungsteno-Cobre