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:

Egy H-híd kapcsolási rajza. A felül lévő Vmotor a S1 kapcsolón keresztül lefelé egy bal oldali A csomóponthoz csatlakozik, a S2 kapcsolón keresztül pedig egy jobb oldali B csomóponthoz. Az M motor vízszintesen helyezkedik el A és B között. Az A csomóponttól egy másik S3 kapcsoló vezet le a földhöz; a B csomóponttól pedig egy másik S4 kapcsoló vezet le a földhöz.

A H-híd: négy kapcsoló (S1S4) 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 S1 kapcsolón át az A csomópontba folyik, onnan a motoron keresztül a B csomópontba, majd a S4 kapcsoló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.