Sistema de control para un motor DC

# Sistema para controlar un motor DC — guía práctica (rápida y utilizable)

Cuando se trata de diseñar un sistema de control para un motor DC, te doy un sistema completo (hardware + firmware) que puedes usar tal cual o adaptar: desde control simple (velocidad y dirección) hasta control cerrado (PID con encoder). Incluye lista de componentes, esquemas conceptuales, y código de ejemplo para Arduino.

# 1) Resumen rápido

* Objetivo: controlar velocidad y sentido de giro de un motor DC (desde pequeño hobby hasta motores de potencia media).

* Modos:

  * **Open-loop**: PWM para velocidad, H-bridge o MOSFET para dirección.

  * **Closed-loop**: añadir encoder + PID para mantener velocidad/posicion.

* Hardware típico: fuente de alimentación adecuada, driver (H-bridge o MOSFET), microcontrolador (Arduino/ESP32), sensor (encoder/ACS712 para corriente), protección (diodo flyback, fusible, snubber).

# 2) Componentes comunes (BOM básico)

* Motor DC (ej. 12 V, 5 A) — *según tu motor*.

* Driver H-bridge (bidireccional) o MOSFETs:

  * Opciones fáciles: **L298N** (viejo, disipación alta) o **DRV8871/DRV8833** (más moderno).

  * Para potencias mayores: H-bridge con MOSFETs (p.ej. IRF3205) o controladores integrados (p.ej. **VNH5019**, **IBT-2/MD30C**, etc.).

* Microcontrolador: **Arduino Uno / Nano / Pro Mini / ESP32**.

* Sensor de velocidad: encoder incremental (disco + opto / sensor Hall) o tacómetro.

* Sensor de corriente (opcional): **ACS712** o un shunt y amplificador.

* Fuente de alimentación DC estable (v rated ≥ motor voltaje, corriente nominal × margen 1.2–2×).

* Diodos flyback (si usas MOSFETs individuales), fusible, condensadores de desacoplo.

* Resistencias, pulsadores, potenciómetro (para control manual), cables, disipadores.

# 3) Bloques del sistema (concepto)

1. Fuente de alimentación -> 2. Driver de potencia (H-bridge / MOSFETs) <- control PWM y pines de dirección desde MCU -> 3. Motor

2. Feedback (encoder) -> MCU -> algoritmo de control (PID) -> PWM

# 4) Esquemas básicos

## A) Control **unidireccional** (solo velocidad) con MOSFET N-channel (low-side)

* Conexiones:

  * Motor + -> alimentación +

  * Motor – -> Drain de MOSFET (N-channel)

  * Source -> GND

  * Gate -> salida PWM del Arduino (vía resistor 100Ω) y gate-to-source resistor 100k a GND.

  * Diodo flyback (p.ej. Schottky 60V) entre motor- y alimentación+ (si driver no lo incorpora).

  * Condensador electrolítico grande cerca del motor (p.ej. 100µF–470µF).

* Nota: low-side solo permite girar en un sentido (a menos que pongas H-bridge).

## B) Control **bidireccional** con H-bridge (p.ej. DRV8871, VNH5019 o MOSFET H-bridge)

* Señales típicas:

  * IN1/IN2 o DIR/PWM

  * PWM para modular velocidad, DIR para sentido

* Si usas L298: conecta VMotor, GND, IN1/IN2 desde Arduino y ENA a PWM.

# 5) Frecuencia PWM recomendada

* Para motores DC mediante MOSFET/H-bridge, frecuencias **entre 8 kHz y 20 kHz** son comunes.

  * < ~2–4 kHz puede generar zumbido audible.

  * > ~20–30 kHz puede aumentar pérdidas de conmutación (depende del driver y MOSFET).

* Ajusta según tu driver y pruebas.

# 6) Selección de MOSFET/driver — cosas a chequear

* **Vds** ≥ 1.5× tensión de alimentación (ej. para 12 V usar MOSFET 30–60 V).

* **Rds(on)** lo más bajo posible para minimizar calentamiento (p. ej. < 10 mΩ para corrientes grandes).

* Corriente continua (Id) ≥ corriente máxima del motor × margen 1.5–2×.

* Añadir disipador si hay disipación significativa.

Cálculo pérdida aproximada en MOSFET: ( P = I_{rms}^2 \times R_{ds(on)} ).

# 7) Protección

* Fusible en línea: dimensionar a ~1.2× corriente nominal.

* Diodo flyback o driver que lo incluya.

* Capacitores de desacoplo (cerámico 0.1µF + electrolítico 100–470µF).

* Monitor de corriente para detectar sobrecargas.

* Limitación de velocidad por software (soft-start).

# 8) Aca tienes un ejemplo típico de control, elegimos este hardware por ser de los mas usados y conocidos (Arduino)

### A) Control básico velocidad + dirección (H-bridge con pines DIR y PWM)

«`cpp

// Control básico PWM + dirección (Arduino)

const int pinPWM = 9;    // PWM pin (must be PWM)

const int pinDIR = 8;    // Direction pin

const int pinBrake = 7;  // optional brake pin

void setup() {

  pinMode(pinPWM, OUTPUT);

  pinMode(pinDIR, OUTPUT);

  pinMode(pinBrake, OUTPUT);

  digitalWrite(pinBrake, LOW);

}

void loop() {

  // ejemplo: ramp up forward

  digitalWrite(pinDIR, HIGH); // forward

  for (int duty=0; duty<=255; duty+=5) {

    analogWrite(pinPWM, duty);

    delay(20);

  }

  delay(1000);

  // ramp down

  for (int duty=255; duty>=0; duty-=5) {

    analogWrite(pinPWM, duty);

    delay(20);

  }

  delay(500);

  // cambio de sentido

  digitalWrite(pinDIR, LOW); // reverse

  for (int duty=0; duty<=200; duty+=5) {

    analogWrite(pinPWM, duty);

    delay(20);

  }

  delay(1000);

  // stop

  analogWrite(pinPWM, 0);

  delay(2000);

}

«`

### B) Control PID simple con encoder (esquema conceptual)

* Lee encoder (pulsos por revolución) -> calcula velocidad (RPM)

* PID: compara velocidad deseada vs medida -> salida PWM

Snippet básico (usar librería Encoder y PID_v1 para más robustez):

«`cpp

#include <Encoder.h>

#include <PID_v1.h>

Encoder enc(2,3); // pines de encoder A,B

double setpoint = 100.0; // rpm objetivo

double input = 0;

double output = 0;

double Kp=1.0, Ki=0.5, Kd=0.05;

PID myPID(&input, &output, &setpoint, Kp, Ki, Kd, DIRECT);

unsigned long lastTime = 0;

long lastPos = 0;

void setup() {

  pinMode(9, OUTPUT); // PWM

  pinMode(8, OUTPUT); // DIR

  myPID.SetMode(AUTOMATIC);

  myPID.SetOutputLimits(0,255);

  lastTime = millis();

}

void loop() {

  unsigned long now = millis();

  if (now – lastTime >= 100) { // cada 100 ms

    long pos = enc.read();

    long delta = pos – lastPos;

    // convertir delta a RPM depende de PPR del encoder:

    // RPM = (delta / PPR) * (60000 / dt_ms)

    const int PPR = 360; // pulses per revolution (ajusta)

    double rpm = ( (double)delta / PPR ) * (60000.0 / (now – lastTime));

    input = rpm;

    myPID.Compute();

    analogWrite(9, (int)output);

    lastPos = pos;

    lastTime = now;

  }

}

«`

*(Ajusta Kp, Ki, Kd, y PPR del encoder al motor.)*

# 9) Ejemplo de dimensionamiento rápido

Supongamos motor 12 V, corriente nominal 5 A, pico 15 A.

* Fuente: 12 V, 10–15 A (margen).

* MOSFET: Vds ≥ 30 V, Id ≥ 30 A, Rds(on) ≤ 10 mΩ.

* Fusible: 8 A (o PTC) en línea si quieres proteger nominal; o 15 A para pico con detección por software.

# 10) Recomendaciones prácticas / checklist antes de probar

* Verifica polaridad y conexión a tierra común (MCU GND = GND motor).

* Inserta fusible temporal y monitoriza corriente la primera vez.

* Empieza con duty bajo (p. ej. 20%) para probar.

* Añade protección contra sobrecorriente en software (lectura ACS712).

* Usa disipador en driver (L298 se calienta mucho).

# 11) Variantes rápidas según necesidad

* **Pequeños proyectos/hobby (< 3 A):** módulo MOSFET simple o DRV8833.

* **Medio (3–30 A):** módulos VNH5019, BTS7960 o puente H con MOSFET.

* **Alta potencia (>30 A):** drivers dedicados/módulos con detección de corriente y control térmico. —

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Envio gratis

En compras superiores a $250.000

Pago fácil

TC, efectivo o contraentrega

Tiempo de entrega

Despachos lo antes posible

100% Secure Checkout

Transacciones seguras