3.15. Tasavirtamoottorin ohjaus¶
Harjallinen tasavirtamoottori on magneettikentässä olevalle akselille kiedottu johdinkela. Kun kelan läpi johdetaan virtaa, kenttä kohdistaa siihen voiman, joka muuttuu akselin vääntömomentiksi. Moottorin sisällä olevat harjat vaihtavat kelan virran suunnan akselin pyöriessä, joten vääntö työntää akselia aina samaan suuntaan. Kun moottorin kahden johtimen yli kytketään tasajännite, akseli alkaa pyöriä; napaisuuden vaihtaminen kääntää pyörimissuunnan.
Moottorit tarvitsevat tyypillisesti sadoista milliampeereista useaan ampeeriin, syöttöjännitteillä jotka ylittävät kameran 3,3 V:n logiikkajännitteen. GPIO-nasta pystyy syöttämään luokkaa 25 mA eikä voi vaihtaa napaisuutta – se pystyy ajamaan vain kahta jännitetasoaan. Kameran ja moottorin välisen ohjausasteen on kannettava moottorin virta, reititettävä erillinen korkeampijännitteinen moottorin syöttö ja annettava kameran kääntää napaisuus komennolla. Neljän transistorin H-silta on vakioratkaisu.
3.15.1. H-silta¶
H-silta on neljä kytkintä, jotka on järjestetty H-kuvioon moottorin ympärille:
H-silta: neljä kytkintä (S1 – S4) kytkevät moottorin M Vmotorin ja maan väliin.¶
Eri kytkinparien sulkeminen valitsee, mitä moottori näkee johtimissaan:
S1 + S4 kiinni, S2 + S3 auki. Virta kulkee Vmotorista
S1:n kautta solmuunA, moottorin läpi solmuunBjaS4:n kautta maahan. Moottori pyörii yhteen suuntaan.S2 + S3 kiinni, S1 + S4 auki. Virta kulkee moottorin läpi toiseen suuntaan. Moottori pyörii toiseen suuntaan.
Kaikki neljä auki. Molemmat moottorin johtimet kelluvat; moottori rullaa vapaasti.
S3 + S4 kiinni (tai S1 + S2 kiinni). Molemmat moottorin johtimet on sidottu samaan jännitetasoon; moottorin oma liike-energia synnyttää virran, jonka suljettu pari oikosulkee lämmöksi. Moottori jarruttaa.
Kielletty yhdistelmä on saman pylvään molempien kytkimien sulkeminen – S1 + S3 tai S2 + S4 – mikä muodostaa oikosulun Vmotorista suoraan maahan. Tätä kutsutaan nimellä shoot-through, eikä kameran koodi saa sallia sitä.
Käytännössä neljä kytkintä ovat MOSFET-transistoreja (esitelty sivulla Tasonsiirto) integroidun ohjainpiirin sisällä. Piiri tarjoaa kaksi tai kolme logiikkatason tulonastaa, jotka kuvautuvat sisäisesti neljälle kytkimelle, ja sisältää lukituslogiikan, joka estää shoot-throughin, joten kameran koodin ei tarvitse hallita sitä suoraan.
3.15.2. PWM ja moottorin induktanssi¶
Moottorin nopeuden asettaminen vaatii muutakin kuin täysin päällä ja täysin pois. Niksi on sama kuin LEDien kanssa kohdassa LEDin himmennys PWM:llä: pulssitetaan ohjausta korkealla taajuudella ja annetaan kuorman keskiarvoistaa tulos. LEDin kohdalla keskiarvoistajana toimi silmä; moottorin kohdalla se on itse kela.
Moottorin kelalla on huomattava induktanssi. Kelan läpi kulkeva virta ei voi muuttua hetkessä; se muuttuu nopeudella, joka on verrannollinen sen yli olevaan jännitteeseen. Sillan pulssittaminen päälle ja pois 20 kHz:n taajuudella nostaa kelan virtaa jokaisen päällä-vaiheen aikana, ja pois-vaiheen aikana virran on jatkettava kulkuaan – kela kääntää jännitteen yli itsensä ylläpitääkseen sitä.
Ilman paikkaa minne mennä tuo virta nostaisi juuri avatun kytkimen yli olevan jännitteen jyrkästi ylös ja voisi vaurioittaa transistoria. Vapaakiertodiodit kunkin kytkimen yli – usein vain MOSFETtien omat substraattidiodit ohjainpiirin sisällä – antavat virralle sen tarvitseman reitin. Se kulkee diodin läpi ja takaisin jonkin yhä suljetun kytkimen kautta, täydentäen vapaakiertosilmukan, jossa virta vaimenee asteittain sillan ja itse moottorin pienten vastusten läpi. Diodi myös rajoittaa avatun kytkimen yli olevan jännitteen yhden diodipudotuksen päähän siitä jännitetasosta, johon silmukka palaa, selvästi MOSFETin turvallisen toiminta-alueen sisälle.
Vääntömomenttia tuottaa virran keskiarvo kunkin PWM-jakson yli, ja tuo keskiarvo seuraa pulssisuhdetta lineaarisesti – pulssisuhteen kaksinkertaistaminen suunnilleen kaksinkertaistaa vääntömomentin ja vakiokuormalla suunnilleen kaksinkertaistaa nopeuden. Toisin kuin LEDien himmennyksessä, jossa silmän epälineaarinen vaste vaatii käyrää, duty_u16:n lineaarinen pyyhkäisy vastaa jo lineaarista pyyhkäisyä moottorin ponnistuksessa.
PWM-taajuuden on vain ylitettävä kaksi kynnystä:
Yli noin 20 kHz:n kantoaalto on ihmisen kuuloalueen ulkopuolella. Sen alapuolella kelaan kohdistuva magneettivoima nousee ja laskee jokaisen PWM-pulssin mukana, ja käämit ja levyt värähtelevät fyysisesti kantoaaltotaajuudella – moottorista tulee käytännössä pieni kaiutin, joka soittaa ääntä PWM-taajuudella.
Selvästi yli noin 50 kHz:n MOSFETit ja niiden hilaohjaimet alkavat menettää hyötysuhdetta kytkentähäviöihin. Kunkin päälle-pois-siirtymän aikana MOSFET kantaa hetkellisesti sekä merkittävää jännitettä että merkittävää virtaa, hukaten pienen tehopiikin lämmöksi; myös MOSFETtien hilakapasitanssi on ladattava ja purettava joka jaksolla, minkä ohjainpiiri maksaa. Molemmat kustannukset kasvavat PWM-taajuuden mukana, joten korkeilla nopeuksilla kytkennästä syntyvä lämpö voi kilpailla moottorin virran johtamisesta syntyvän lämmön kanssa.
20 kHz on mukava oletusarvo harrastelijakokoisille moottoreille.
3.15.3. H-sillan ohjaaminen¶
Kaksituloinen H-siltaohjainpiiri kuvaa tulot IN1 ja IN2 neljälle kytkimelle suunnilleen näin:
IN1 = 0, IN2 = 0– vapaa rullaus (kaikki neljä kytkintä auki).IN1 = 1, IN2 = 0– ajo yhteen suuntaan.IN1 = 0, IN2 = 1– ajo toiseen suuntaan.IN1 = 1, IN2 = 1– jarrutus.
Kun kahta tuloa ohjataan PWM-lähtöinä, kamera voi asettaa suunnan valitsemalla kumpi kahdesta nastasta kantaa pulssisuhteen, ja nopeuden itse pulssisuhteen arvolla:
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()
Ramppi pois päältä täyteen ja takaisin antaa pehmeän käynnistyksen ja pysäytyksen:
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. Suunta-ja-nopeus-ohjaimet¶
Toinen H-siltapiirien perhe tarjoaa kätevämmän rajapinnan: yksi digitaalinen suunta-tulo (usein nimellä DIR tai PH sanasta ”phase”) sekä yksi nopeus-tulo (usein PWM tai EN sanasta ”enable”). Suuntanasta valitsee, kummin päin silta ajaa; nopeusnastan pulssisuhde asettaa keskimääräisen virran.
Tätä on helpompi ohjata ohjelmistosta kuin kahden PWM-tulon järjestelyä. Kaksi signaalia vastaavat sitä, miten ongelma yleensä muotoillaan – ”käänny tähän suuntaan, tällä nopeudella” – joten koodi voi sanoa set_direction(forward); set_speed(50) sen sijaan että haarautuisi in1:n ja in2:n välillä. Vain yhtä PWM-kanavaa tarvitaan, mikä vapauttaa saman ajastimen toisen kanavan johonkin muuhun tehtävään. Lisäksi suuntanasta voi pysyä paikallaan muutosten välillä laukaisematta siltaa uudelleen, joten nopeuden muuttaminen kiinteällä suunnalla koskettaa vain yhtä rekisteriä.
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
Se, mitä ”pysäytys” tällaisella ohjaimella todella tekee – rullaa vapaasti vai jarruttaa – riippuu piiristä. Kaksituloisella ohjaimella kameran koodi valitsee (molemmat tulot alhaalla rullausta varten, molemmat ylhäällä jarrutusta varten); suunta-ja-nopeus-ohjaimella piiri päättää, joten datalehteen kannattaa vilkaista ennen kummankaan toiminnan varaan luottamista.