3.15. Besturing van DC-motoren¶
Een geborstelde DC-motor is een spoel van draad op een as binnen een magnetisch veld. Laat stroom door de spoel lopen en het veld oefent er een kracht op uit; die kracht wordt koppel op de as. Borstels in de motor schakelen de stroomrichting in de spoel terwijl de as draait, zodat het koppel de as altijd in dezelfde richting duwt. Leg een DC-spanning aan over de twee motoraansluitingen en de as draait; verwissel de polariteit en hij draait de andere kant op.
Motoren willen doorgaans honderden milliampère tot meerdere ampère, bij voedingsspanningen boven de 3,3 V logica-rail van de camera. Een GPIO-pin kan in de orde van 25 mA leveren en kan de polariteit niet omkeren – hij kan alleen zijn twee rails aansturen. De aandrijftrap tussen de camera en de motor moet de stroom van de motor kunnen dragen, een aparte motorvoeding met hogere spanning kunnen routeren, en de camera de polariteit op commando laten omkeren. De vier-transistor-H-brug is het standaardantwoord.
3.15.1. De H-brug¶
Een H-brug bestaat uit vier schakelaars die in een H rond de motor zijn opgesteld:
De H-brug: vier schakelaars (S1 – S4) verbinden de motor M tussen Vmotor en massa.¶
Door verschillende paren schakelaars te sluiten selecteer je wat de motor aan zijn aansluitingen ziet:
S1 + S4 gesloten, S2 + S3 open. Stroom loopt van Vmotor door
S1, naarA, dwars door de motor naarB, en viaS4naar massa. De motor draait de ene kant op.S2 + S3 gesloten, S1 + S4 open. Stroom loopt de andere kant door de motor. De motor draait de andere kant op.
Alle vier open. Beide motoraansluitingen zweven; de motor draait uit.
S3 + S4 gesloten (of S1 + S2 gesloten). Beide motoraansluitingen zijn met dezelfde rail verbonden; de eigen kinetische energie van de motor drijft een stroom die het gesloten paar als warmte kortsluit. De motor remt af.
De verboden combinatie is het sluiten van beide schakelaars in dezelfde kolom – S1 + S3 of S2 + S4 – waardoor een kortsluiting ontstaat van Vmotor recht naar massa. Dit is shoot-through, en de code van de camera mag dit niet toestaan.
In de praktijk zijn de vier schakelaars MOSFET’s (geïntroduceerd op de pagina Niveau-omzetting) binnen een geïntegreerde driver-IC. De chip stelt twee of drie inputpinnen op logicaniveau beschikbaar die intern aan de vier schakelaars zijn gekoppeld, en bevat vergrendelingslogica die shoot-through voorkomt, zodat de code van de camera dit niet rechtstreeks hoeft te beheren.
3.15.2. PWM en de inductie van de motor¶
Het instellen van de snelheid van de motor vraagt om meer dan volledig aan en volledig uit. De truc is dezelfde als die voor LED’s in LED dimmen met PWM: pulseer de aandrijving op een hoge frequentie en laat de belasting het resultaat middelen. Voor een LED was het oog de middelaar; voor een motor is het de spoel zelf.
Een motorspoel heeft een aanzienlijke inductie. De stroom door een spoel kan niet ogenblikkelijk veranderen; hij verandert met een snelheid die evenredig is met de spanning eroverheen. Door de brug op 20 kHz aan en uit te pulseren loopt de spoelstroom tijdens elke aan-fase op, en tijdens de uit-fase moet de stroom blijven lopen – de spoel keert de spanning over zichzelf om om die in stand te houden.
Zonder ergens heen te kunnen zou die stroom de spanning over de net geopende schakelaar omhoog laten pieken en de transistor kunnen beschadigen. Vrijloopdiodes over elke schakelaar – vaak gewoon de eigen body-diodes van de MOSFET’s binnen de driverchip – geven de stroom het pad dat hij nodig heeft. Hij loopt door een diode en weer terug via een van de nog gesloten schakelaars, en voltooit zo een vrijloop-lus waarin de stroom geleidelijk afneemt door de kleine weerstanden van de brug en de motor zelf. De diode klemt ook de spanning over de geopende schakelaar binnen een diodespanningsval van de rail waarop de lus terugkeert, ruim binnen het veilige werkgebied van de MOSFET.
Het gemiddelde van de stroom over elke PWM-periode is wat koppel oplevert, en dat gemiddelde volgt de duty cycle lineair – het verdubbelen van de duty verdubbelt ruwweg het koppel, en bij constante belasting ruwweg de snelheid. Anders dan bij LED-dimming, waar de niet-lineaire respons van het oog om een curve vraagt, komt een lineaire sweep van duty_u16 al overeen met een lineaire sweep van de motorinspanning.
De PWM-frequentie hoeft slechts twee drempels te overschrijden:
Boven ~20 kHz ligt de drager buiten de hoorbare band van de mens. Daaronder loopt de magnetische kracht op de spoel met elke PWM-puls op en af, en de wikkelingen en lamellen trillen fysiek op de dragerfrequentie – de motor wordt in feite een kleine luidspreker die een toon op de PWM-toonhoogte uitzendt.
Ver boven ~50 kHz beginnen de MOSFET’s en hun gate-drivers efficiëntie te verliezen aan schakelverliezen. Tijdens elke aan-uit-overgang draagt de MOSFET kortstondig zowel een aanzienlijke spanning als een aanzienlijke stroom, waarbij een kleine vlaag vermogen als warmte wordt gedissipeerd; de gate-capaciteit van de MOSFET’s moet ook elke cyclus geladen en ontladen worden, waarvoor de driverchip betaalt. Beide kosten schalen mee met de PWM-frequentie, dus bij hoge frequenties kan de warmte van het schakelen wedijveren met de warmte van het geleiden van de motorstroom.
20 kHz is de comfortabele standaard voor motoren van hobbyformaat.
3.15.3. Een H-brug aansturen¶
Een H-brug-driverchip met twee inputs koppelt IN1 en IN2 ongeveer als volgt aan de vier schakelaars:
IN1 = 0, IN2 = 0– uitdraaien (alle vier de schakelaars open).IN1 = 1, IN2 = 0– aandrijven in de ene richting.IN1 = 0, IN2 = 1– aandrijven in de andere richting.IN1 = 1, IN2 = 1– remmen.
Door de twee inputs als PWM-outputs aan te sturen kan de camera de richting instellen door te kiezen welke van de twee pinnen de duty draagt, en de snelheid via de duty-waarde zelf:
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()
Een ramp van uit naar vol en weer terug geeft een soepele start en stop:
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. Richting-en-snelheid-drivers¶
Een tweede familie H-brug-chips stelt een handiger interface beschikbaar: één digitale richting-input (vaak aangeduid met DIR of PH voor “phase”) plus één snelheid-input (vaak PWM of EN voor “enable”). De richtingspin kiest in welke richting de brug aandrijft; de duty cycle op de snelheidspin stelt de gemiddelde stroom in.
Dit is vanuit software eenvoudiger aan te sturen dan het schema met twee PWM-inputs. De twee signalen sluiten aan op hoe het probleem doorgaans wordt geformuleerd – “draai deze kant op, met deze snelheid” – zodat de code set_direction(forward); set_speed(50) kan zeggen in plaats van te vertakken tussen in1 en in2. Er is slechts één PWM-kanaal nodig, waardoor het andere kanaal op dezelfde timer vrijkomt voor een niet-gerelateerde taak. En de richtingspin kan tussen wijzigingen geparkeerd blijven zonder de brug opnieuw te triggeren, zodat het wijzigen van de snelheid bij een vaste richting slechts één register aanraakt.
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
Wat “stoppen” daadwerkelijk doet bij dit soort driver – uitdraaien of remmen – hangt af van de chip. Bij een driver met twee inputs kiest de code van de camera (beide inputs laag voor uitdraaien, beide hoog voor remmen); bij een richting-en-snelheid-driver beslist de chip, dus het datasheet is een blik waard voordat je op een van beide gedragingen vertrouwt.