3.15. Styrning av DC-motor¶
En borstad DC-motor är en trådspole på en axel inuti ett magnetfält. Skicka ström genom spolen så utövar fältet en kraft på den; kraften blir vridmoment på axeln. Borstar inuti motorn växlar strömmens riktning i spolen allteftersom axeln vrider sig, så att vridmomentet alltid driver axeln åt samma håll. Lägg en DC-spänning över motorns två ledningar så snurrar axeln; byt polaritet så snurrar den åt andra hållet.
Motorer vill vanligtvis ha hundratals milliampere upp till flera ampere, vid matningsspänningar över kamerans logiska 3,3 V-skena. Ett GPIO-stift kan leverera i storleksordningen 25 mA och kan inte vända polariteten – det kan bara driva sina två skenor. Drivsteget mellan kameran och motorn måste leda motorns ström, dra en separat matningsspänning med högre spänning till motorn, och låta kameran vända polariteten på kommando. Den fyrtransistoriga H-bryggan är standardsvaret.
3.15.1. H-bryggan¶
En H-brygga är fyra brytare arrangerade i ett H runt motorn:
H-bryggan: fyra brytare (S1 – S4) ansluter motorn M mellan Vmotor och jord.¶
Att stänga olika par av brytare väljer vad motorn ser vid sina ledningar:
S1 + S4 stängda, S2 + S3 öppna. Ström flyter från Vmotor genom
S1, in iA, över motorn tillB, och genomS4till jord. Motorn vrider sig åt ena hållet.S2 + S3 stängda, S1 + S4 öppna. Ström flyter åt andra hållet genom motorn. Motorn vrider sig åt andra hållet.
Alla fyra öppna. Båda motorledningarna flyter fritt; motorn rullar i frihjul.
S3 + S4 stängda (eller S1 + S2 stängda). Båda motorledningarna är kopplade till samma skena; motorns egen rörelseenergi driver en ström som det stängda paret kortsluter till värme. Motorn bromsar.
Den otillåtna kombinationen är att stänga båda brytarna i samma kolumn – S1 + S3 eller S2 + S4 – vilket bildar en kortslutning från Vmotor rakt till jord. Detta kallas shoot-through, och kamerans kod får inte tillåta det.
I praktiken är de fyra brytarna MOSFET-transistorer (introducerade på sidan Nivåomvandling) inuti en integrerad drivkrets. Chippet exponerar två eller tre logiknivå-ingångsstift som internt mappas till de fyra brytarna och innehåller spärrlogik som förhindrar shoot-through, så att kamerans kod inte behöver hantera det direkt.
3.15.2. PWM och motorns induktans¶
Att ställa in motorns hastighet kräver mer än helt på och helt av. Tricket är detsamma som används för lysdioder i LED-dimning med PWM: pulsa drivningen vid hög frekvens och låt lasten medelvärdesbilda resultatet. För en lysdiod var medelvärdesbildaren ögat; för en motor är det spolen själv.
En motorspole har betydande induktans. Strömmen genom en induktor kan inte ändras momentant; den ändras i en takt som är proportionell mot spänningen över den. Att pulsa bryggan på och av vid 20 kHz rampar upp spolströmmen under varje på-fas, och under av-fasen måste strömmen fortsätta flyta – spolen vänder spänningen över sig själv för att upprätthålla den.
Utan någonstans att ta vägen skulle den strömmen få spänningen över den just öppnade brytaren att skjuta i höjden och kunna skada transistorn. Frihjulsdioder över varje brytare – ofta bara MOSFET-transistorernas egna kroppsdioder inuti drivkretsen – ger strömmen den väg den behöver. Den flyter genom en diod och tillbaka via en av de fortfarande stängda brytarna och fullbordar en frihjulsslinga där strömmen avtar gradvis genom de små resistanserna i bryggan och motorn själv. Dioden låser också fast spänningen över den öppnade brytaren inom ett diodfall från den skena slingan återvänder till, väl inom MOSFET-transistorns säkra arbetsområde.
Det är strömmens medelvärde över varje PWM-period som producerar vridmoment, och det medelvärdet följer pulskvoten linjärt – att fördubbla pulskvoten fördubblar ungefär vridmomentet, och vid konstant last ungefär fördubblar hastigheten. Till skillnad från lysdiodsdimning, där ögats icke-linjära respons kräver en kurva, motsvarar en linjär svepning av duty_u16 redan en linjär svepning av motorns ansträngning.
PWM-frekvensen behöver bara klara två trösklar:
Över ~20 kHz ligger bärvågen utanför det mänskliga hörbara bandet. Under det rampar den magnetiska kraften på spolen upp och ner med varje PWM-puls och lindningarna och lamelleringarna vibrerar fysiskt vid bärfrekvensen – motorn blir i praktiken en liten högtalare som avger en ton vid PWM-tonhöjden.
Långt över ~50 kHz börjar MOSFET-transistorerna och deras gate-drivkretsar förlora effektivitet till switchförluster. Under varje på-av-övergång leder MOSFET-transistorn kortvarigt både betydande spänning och betydande ström och förbränner en liten effektpuls som värme; MOSFET-transistorernas gate-kapacitans måste också laddas och laddas ur varje cykel, vilket drivkretsen betalar för. Båda kostnaderna skalar med PWM-frekvensen, så vid höga frekvenser kan värmen från switchningen mäta sig med värmen från att leda motorströmmen.
20 kHz är det bekväma standardvärdet för hobbymotorer.
3.15.3. Att driva en H-brygga¶
En H-bryggsdrivkrets med två ingångar mappar IN1 och IN2 till de fyra brytarna ungefär så här:
IN1 = 0, IN2 = 0– frihjul (alla fyra brytarna öppna).IN1 = 1, IN2 = 0– driver åt ena hållet.IN1 = 0, IN2 = 1– driver åt andra hållet.IN1 = 1, IN2 = 1– bromsar.
Att driva de två ingångarna som PWM-utgångar låter kameran ställa in riktningen genom att välja vilket av de två stiften som bär pulskvoten, och hastigheten via själva pulskvotsvärdet:
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()
En ramp från av till full och tillbaka ger en mjuk start och ett mjukt stopp:
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. Drivkretsar med riktning och hastighet¶
En andra familj av H-bryggschip exponerar ett bekvämare gränssnitt: en digital riktnings-ingång (ofta märkt DIR eller PH för ”phase”) plus en hastighets-ingång (ofta PWM eller EN för ”enable”). Riktningsstiftet väljer åt vilket håll bryggan driver; pulskvoten på hastighetsstiftet ställer in medelströmmen.
Detta är lättare att driva från programvara än upplägget med två PWM-ingångar. De två signalerna stämmer med hur problemet vanligtvis formuleras – ”vrid åt det här hållet, med den här hastigheten” – så koden kan säga set_direction(forward); set_speed(50) istället för att grena mellan in1 och in2. Endast en PWM-kanal behövs, vilket frigör den andra kanalen på samma timer för en orelaterad uppgift. Och riktningsstiftet kan stå kvar parkerat mellan ändringar utan att åter utlösa bryggan, så att ändra hastigheten vid en fast riktning rör bara ett enda register.
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
Vad ”stopp” faktiskt gör på den här typen av drivkrets – frihjul eller broms – beror på chippet. Med en drivkrets med två ingångar väljer kamerans kod (båda ingångarna låga för frihjul, båda höga för broms); med en drivkrets med riktning och hastighet bestämmer chippet, så det är värt en titt i databladet innan man förlitar sig på något av beteendena.