3.15. Egyenáramú motor vezérlése¶
Az egyenáramú (DC) kefés motor egy tengelyen ülő, mágneses térbe helyezett huzaltekercs. Ha áramot vezetünk át a tekercsen, a mágneses tér erőt fejt ki rá; ez az erő nyomatékká alakul a tengelyen. A motoron belüli kefék a tengely forgásával együtt átkapcsolják az áram irányát a tekercsben, így a nyomaték mindig ugyanabba az irányba hajtja a tengelyt. Kapcsoljunk egyenfeszültséget a motor két kivezetésére, és a tengely forogni kezd; ha felcseréljük a polaritást, az ellenkező irányba forog.
A motorok jellemzően néhány száz milliampertől több amperig terjedő áramot igényelnek, a kamera 3,3 V-os logikai tápvonalánál magasabb tápfeszültségen. Egy GPIO láb körülbelül 25 mA áramot képes szolgáltatni, és nem tudja megfordítani a polaritást – csak a saját két tápvonalát tudja meghajtani. A kamera és a motor közötti meghajtó fokozatnak vinnie kell a motor áramát, külön, magasabb feszültségű motortápot kell biztosítania, és lehetővé kell tennie, hogy a kamera parancsra megfordítsa a polaritást. A négy tranzisztorból álló H-híd a bevett megoldás.
3.15.1. A H-híd¶
A H-híd négy kapcsoló, amelyek H alakban helyezkednek el a motor körül:
A H-híd: négy kapcsoló (S1 – S4) köti a motort M a Vmotor és a föld közé.¶
A különböző kapcsolópárok zárása határozza meg, hogy mit lát a motor a kivezetésein:
S1 + S4 zárva, S2 + S3 nyitva. Az áram a Vmotor felől a
S1kapcsolón át azAcsomópontba folyik, onnan a motoron keresztül aBcsomópontba, majd aS4kapcsolón át a földbe. A motor az egyik irányba fordul.S2 + S3 zárva, S1 + S4 nyitva. Az áram a másik irányba folyik át a motoron. A motor a másik irányba fordul.
Mind a négy nyitva. Mindkét motorkivezetés lebeg; a motor szabadon kifut.
S3 + S4 zárva (vagy S1 + S2 zárva). Mindkét motorkivezetés ugyanahhoz a tápvonalhoz kötődik; a motor saját mozgási energiája áramot hajt, amelyet a zárt pár hővé alakítva rövidre zár. A motor fékez.
A tiltott kombináció az, ha ugyanabban az oszlopban mindkét kapcsolót zárjuk – S1 + S3 vagy S2 + S4 –, mert ez rövidzárlatot képez a Vmotor és a föld között. Ez az átlövés (shoot-through), és a kamera kódjának nem szabad ezt megengednie.
A gyakorlatban a négy kapcsoló MOSFET (lásd a Szintillesztés oldalt) egy integrált meghajtó IC-ben. A chip két vagy három logikai szintű bemeneti lábat kínál, amelyek belsőleg a négy kapcsolóhoz vannak rendelve, és olyan reteszelő logikát tartalmaz, amely megakadályozza az átlövést, így a kamera kódjának nem kell ezzel közvetlenül foglalkoznia.
3.15.2. A PWM és a motor induktivitása¶
A motor sebességének beállításához többre van szükség, mint teljes bekapcsolt és teljes kikapcsolt állapotra. A trükk ugyanaz, mint amit a LED-eknél a LED-fényerő-szabályozás PWM-mel oldalon használtunk: nagy frekvencián impulzusoljuk a meghajtást, és hagyjuk, hogy a terhelés átlagolja az eredményt. A LED esetében az átlagoló a szem volt; egy motornál maga a tekercs.
A motortekercsnek jelentős induktivitása van. Az induktivitáson átfolyó áram nem változhat pillanatszerűen; a változás üteme arányos a rajta eső feszültséggel. Ha a hidat 20 kHz-en kapcsolgatjuk be és ki, a tekercsárama minden bekapcsolt fázis alatt felfut, a kikapcsolt fázis alatt pedig az áramnak tovább kell folynia – a tekercs megfordítja a rajta eső feszültséget, hogy fenntartsa azt.
Ha az áramnak nem lenne hová folynia, megugratná a feszültséget az imént kinyitott kapcsoló két oldalán, és tönkretehetné a tranzisztort. Az egyes kapcsolókra párhuzamosan kötött szabadonfutó diódák – amelyek gyakran csak a meghajtó chipen belüli MOSFET-ek saját testdiódái – biztosítják az áramnak a szükséges útvonalat. Az áram átfolyik egy diódán, és visszatér az egyik még zárt kapcsolón keresztül, lezárva egy szabadonfutó hurkot, amelyben az áram fokozatosan csökken a híd és maga a motor kis ellenállásain keresztül. A dióda emellett a kinyitott kapcsolón eső feszültséget egy diódaesésnyi tartományon belül rögzíti ahhoz a tápvonalhoz, ahová a hurok visszatér, jóval a MOSFET biztonságos üzemi tartományán belül.
Az áram minden PWM-periódusra vett átlaga hozza létre a nyomatékot, és ez az átlag lineárisan követi a kitöltési tényezőt – a kitöltés megduplázása nagyjából megduplázza a nyomatékot, állandó terhelés mellett pedig nagyjából megduplázza a sebességet. A LED-fényerő-szabályozással ellentétben, ahol a szem nemlineáris válasza görbét igényel, a duty_u16 lineáris végigfuttatása már eleve a motorteljesítmény lineáris végigfuttatásának felel meg.
A PWM-frekvenciának csak két küszöböt kell átlépnie:
Körülbelül 20 kHz fölött a vivőfrekvencia kívül esik az ember által hallható tartományon. Ez alatt a tekercsre ható mágneses erő minden PWM-impulzussal fel-le ingadozik, és a tekercselés meg a lemezek fizikailag rezegnek a vivőfrekvencián – a motor lényegében kis hangszóróvá válik, amely a PWM-magasságon szól.
Jóval 50 kHz fölött a MOSFET-ek és gate-meghajtóik kapcsolási veszteségek miatt veszítenek a hatékonyságukból. Minden be-ki átmenet során a MOSFET-en rövid ideig egyszerre van jelentős feszültség és jelentős áram, ami egy kis teljesítménylökést disszipál hő formájában; a MOSFET-ek gate-kapacitását is fel kell tölteni és ki kell süteni minden ciklusban, amit a meghajtó chip fizet meg. Mindkét költség a PWM-frekvenciával skálázódik, így nagy frekvencián a kapcsolásból eredő hő vetekedhet a motoráram vezetéséből eredő hővel.
A 20 kHz a kényelmes alapérték hobbi méretű motorokhoz.
3.15.3. Egy H-híd meghajtása¶
Egy kétbemenetű H-híd meghajtó chip nagyjából így rendeli az IN1 és IN2 lábakat a négy kapcsolóhoz:
IN1 = 0, IN2 = 0– szabad kifutás (mind a négy kapcsoló nyitva).IN1 = 1, IN2 = 0– meghajtás az egyik irányba.IN1 = 0, IN2 = 1– meghajtás a másik irányba.IN1 = 1, IN2 = 1– fékezés.
Ha a két bemenetet PWM-kimenetként hajtjuk meg, a kamera az irányt azzal állítja be, hogy melyik láb hordozza a kitöltést, a sebességet pedig magával a kitöltési értékkel:
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()
Egy kikapcsolttól teljesig, majd vissza tartó felfutás sima indítást és leállítást ad:
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. Irány-és-sebesség meghajtók¶
A H-híd chipek egy másik családja kényelmesebb felületet kínál: egy digitális irány bemenetet (gyakran DIR vagy PH jelzéssel, ami a „phase” rövidítése) és egy sebesség bemenetet (gyakran PWM vagy EN jelzéssel, ami az „enable” rövidítése). Az irányláb választja meg, hogy a híd merre hajtson; a sebességlábon lévő kitöltési tényező pedig az átlagos áramot állítja be.
Ezt szoftverből könnyebb meghajtani, mint a két PWM-bemenetes megoldást. A két jel illeszkedik ahhoz, ahogyan a problémát általában megfogalmazzuk – „fordulj erre, ekkora sebességgel” –, így a kód mondhatja azt, hogy set_direction(forward); set_speed(50), ahelyett, hogy az in1 és in2 között kellene elágaznia. Csak egyetlen PWM-csatornára van szükség, ami felszabadítja ugyanannak az időzítőnek a másik csatornáját egy nem kapcsolódó feladatra. Az irányláb pedig a változtatások között a helyén maradhat anélkül, hogy újra meg kellene húznia a hidat, így az állandó irány melletti sebességváltás csak egyetlen regisztert érint.
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
Az, hogy ezen a fajta meghajtón a „leállítás” valójában mit tesz – szabad kifutás vagy fékezés –, a chiptől függ. Kétbemenetű meghajtó esetén a kamera kódja dönt (mindkét bemenet alacsony a kifutáshoz, mindkettő magas a fékezéshez); irány-és-sebesség meghajtó esetén a chip dönt, ezért érdemes megnézni az adatlapot, mielőtt bármelyik viselkedésre hagyatkoznánk.