3.15. Control de motores de corriente continua¶
Un motor de corriente continua con escobillas es una bobina de hilo sobre un eje dentro de un campo magnético. Al hacer pasar corriente por la bobina, el campo ejerce una fuerza sobre ella; esa fuerza se convierte en par sobre el eje. Las escobillas del interior del motor invierten el sentido de la corriente en la bobina a medida que el eje gira, de modo que el par siempre empuja el eje en el mismo sentido. Aplica una tensión continua entre los dos terminales del motor y el eje gira; invierte la polaridad y gira en sentido contrario.
Los motores normalmente necesitan desde cientos de miliamperios hasta varios amperios, a tensiones de alimentación superiores al riel lógico de 3,3 V de la cámara. Un pin GPIO puede suministrar del orden de 25 mA y no puede invertir la polaridad: solo puede activar sus dos rieles. La etapa de excitación entre la cámara y el motor tiene que conducir la corriente del motor, encaminar una alimentación de motor independiente de mayor tensión y permitir que la cámara invierta la polaridad bajo demanda. El puente en H de cuatro transistores es la respuesta estándar.
3.15.1. El puente en H¶
Un puente en H son cuatro interruptores dispuestos en forma de H alrededor del motor:
El puente en H: cuatro interruptores (S1 – S4) conectan el motor M entre Vmotor y tierra.¶
Cerrar distintos pares de interruptores selecciona lo que el motor ve en sus terminales:
S1 + S4 cerrados, S2 + S3 abiertos. La corriente fluye desde Vmotor a través de
S1, haciaA, a través del motor hastaB, y porS4a tierra. El motor gira en un sentido.S2 + S3 cerrados, S1 + S4 abiertos. La corriente fluye en sentido contrario a través del motor. El motor gira en el sentido opuesto.
Los cuatro abiertos. Ambos terminales del motor quedan flotantes; el motor gira por inercia.
S3 + S4 cerrados (o S1 + S2 cerrados). Ambos terminales del motor quedan conectados al mismo riel; la propia energía cinética del motor genera una corriente que el par cerrado cortocircuita disipándola como calor. El motor frena.
La combinación prohibida es cerrar ambos interruptores de la misma columna – S1 + S3 o S2 + S4 – lo que forma un cortocircuito desde Vmotor directamente a tierra. Esto es shoot-through (corriente de paso), y el código de la cámara no debe permitirlo.
En la práctica, los cuatro interruptores son MOSFET (presentados en la página Adaptación de niveles) dentro de un circuito integrado controlador. El chip expone dos o tres pines de entrada de nivel lógico que se asignan internamente a los cuatro interruptores e incluye una lógica de enclavamiento que evita el shoot-through, de modo que el código de la cámara no tiene que gestionarlo directamente.
3.15.2. El PWM y la inductancia del motor¶
Ajustar la velocidad del motor requiere algo más que encendido y apagado totales. El truco es el mismo que se emplea para los LED en Atenuación de LED con PWM: pulsar la excitación a alta frecuencia y dejar que la carga promedie el resultado. Para un LED, el promediador era el ojo; para un motor, es la propia bobina.
La bobina de un motor tiene una inductancia considerable. La corriente que atraviesa un inductor no puede cambiar instantáneamente; cambia a una tasa proporcional a la tensión que se le aplica. Pulsar el puente encendiéndolo y apagándolo a 20 kHz hace que la corriente de la bobina aumente durante cada fase de encendido, y durante la fase de apagado la corriente tiene que seguir fluyendo: la bobina invierte la tensión en sus extremos para mantenerla.
Sin ningún camino por donde circular, esa corriente provocaría un pico de tensión al alza en el interruptor que acaba de abrirse y podría dañar el transistor. Los diodos de rueda libre en paralelo con cada interruptor – a menudo los propios diodos de cuerpo de los MOSFET dentro del chip controlador – dan a la corriente el camino que necesita. Fluye a través de un diodo y vuelve a circular por uno de los interruptores aún cerrados, completando un lazo de rueda libre en el que la corriente decae gradualmente a través de las pequeñas resistencias del puente y del propio motor. El diodo también fija la tensión en el interruptor abierto dentro de una caída de diodo respecto al riel al que retorna el lazo, muy dentro del área de operación segura del MOSFET.
El promedio de la corriente en cada periodo de PWM es lo que produce par, y ese promedio sigue linealmente al ciclo de trabajo: duplicar el ciclo de trabajo duplica aproximadamente el par y, a carga constante, duplica aproximadamente la velocidad. A diferencia de la atenuación de LED, donde la respuesta no lineal del ojo exige una curva, un barrido lineal de duty_u16 ya corresponde a un barrido lineal del esfuerzo del motor.
La frecuencia de PWM solo tiene que superar dos umbrales:
Por encima de ~20 kHz la portadora queda fuera de la banda audible para el ser humano. Por debajo de eso, la fuerza magnética sobre la bobina aumenta y disminuye con cada pulso de PWM y los devanados y las laminaciones vibran físicamente a la frecuencia de la portadora: el motor se convierte de hecho en un pequeño altavoz que emite un tono a la frecuencia del PWM.
Muy por encima de ~50 kHz los MOSFET y sus controladores de puerta empiezan a perder eficiencia debido a las pérdidas por conmutación. Durante cada transición de encendido-apagado, el MOSFET conduce brevemente tensión y corriente significativas a la vez, disipando un pequeño impulso de potencia en forma de calor; la capacidad de puerta de los MOSFET también tiene que cargarse y descargarse en cada ciclo, lo que paga el chip controlador. Ambos costes escalan con la frecuencia de PWM, por lo que a frecuencias altas el calor por conmutación puede rivalizar con el calor por conducir la corriente del motor.
20 kHz es el valor predeterminado cómodo para motores de tamaño de aficionado.
3.15.3. Excitar un puente en H¶
Un chip controlador de puente en H de dos entradas asigna IN1 e IN2 a los cuatro interruptores aproximadamente así:
IN1 = 0, IN2 = 0– inercia (los cuatro interruptores abiertos).IN1 = 1, IN2 = 0– excita en un sentido.IN1 = 0, IN2 = 1– excita en el sentido contrario.IN1 = 1, IN2 = 1– frena.
Excitar las dos entradas como salidas PWM permite a la cámara fijar el sentido eligiendo cuál de los dos pines lleva el ciclo de trabajo, y la velocidad mediante el propio valor del ciclo de trabajo:
import time
from machine import PWM, Pin
in1 = PWM(Pin("P7"), freq=20_000, duty_u16=0)
in2 = PWM(Pin("P8"), freq=20_000, duty_u16=0)
def drive_a(speed): # speed: 0..65535
in1.duty_u16(speed)
in2.duty_u16(0)
def drive_b(speed):
in1.duty_u16(0)
in2.duty_u16(speed)
def coast():
in1.duty_u16(0)
in2.duty_u16(0)
def brake():
in1.duty_u16(65535)
in2.duty_u16(65535)
drive_a(32768) # half speed in direction A
time.sleep(2)
drive_b(16384) # quarter speed in direction B
time.sleep(2)
coast()
Una rampa de apagado a máximo y vuelta proporciona un arranque y una parada suaves:
for d in range(0, 65535, 256):
in1.duty_u16(d)
time.sleep_ms(10)
for d in range(65535, 0, -256):
in1.duty_u16(d)
time.sleep_ms(10)
3.15.4. Controladores de sentido y velocidad¶
Una segunda familia de chips de puente en H expone una interfaz más cómoda: una entrada digital de sentido (a menudo etiquetada DIR o PH de «phase») más una entrada de velocidad (a menudo PWM o EN de «enable»). El pin de sentido elige hacia dónde excita el puente; el ciclo de trabajo en el pin de velocidad fija la corriente media.
Esto es más fácil de controlar desde software que el esquema de dos entradas PWM. Las dos señales coinciden con la forma habitual de plantear el problema – «gira en este sentido, a esta velocidad» – de modo que el código puede decir set_direction(forward); set_speed(50) en lugar de ramificar entre in1 e in2. Solo se necesita un canal PWM, lo que libera el otro canal del mismo temporizador para una tarea no relacionada. Y el pin de sentido puede quedar fijo entre cambios sin reactivar el puente, de modo que cambiar la velocidad con un sentido fijo afecta a un solo registro.
import time
from machine import PWM, Pin
dir_pin = Pin("P8", Pin.OUT)
speed = PWM(Pin("P7"), freq=20_000, duty_u16=0)
def drive(direction, speed_u16):
dir_pin.value(direction) # 0 or 1
speed.duty_u16(speed_u16) # 0..65535
drive(0, 32768) # direction A at half speed
time.sleep(2)
drive(1, 16384) # direction B at quarter speed
time.sleep(2)
speed.duty_u16(0) # stop
Lo que realmente hace «parar» en este tipo de controlador – inercia o frenado – depende del chip. Con un controlador de dos entradas, lo elige el código de la cámara (ambas entradas a nivel bajo para inercia, ambas a nivel alto para frenado); con un controlador de sentido y velocidad lo decide el chip, así que conviene echar un vistazo a la hoja de datos antes de fiarse de cualquiera de los dos comportamientos.