3.15. Controlul motoarelor de curent continuu

Un motor de curent continuu cu perii este o bobină de sârmă montată pe un ax aflat într-un câmp magnetic. Treceți curent prin bobină și câmpul exercită o forță asupra ei; forța devine cuplu la nivelul axului. Periile din interiorul motorului comută direcția curentului din bobină pe măsură ce axul se rotește, astfel încât cuplul împinge mereu axul în aceeași direcție. Aplicați o tensiune continuă pe cele două terminale ale motorului și axul se rotește; inversați polaritatea și se rotește în sens opus.

Motoarele cer de regulă de la sute de miliamperi până la câțiva amperi, la tensiuni de alimentare peste șina logică de 3,3 V a camerei. Un pin GPIO poate furniza un curent de ordinul a 25 mA și nu poate inversa polaritatea – poate aplica doar cele două șine ale sale. Etajul de comandă dintre cameră și motor trebuie să suporte curentul motorului, să dirijeze o alimentare separată, de tensiune mai mare, pentru motor, și să permită camerei să inverseze polaritatea la comandă. Puntea H cu patru tranzistoare este răspunsul standard.

3.15.1. Puntea H

O punte H este formată din patru comutatoare dispuse în formă de H în jurul motorului:

Schema unei punți H. Vmotor în partea de sus se conectează prin comutatorul S1 în jos la un nod A în stânga, și prin comutatorul S2 în jos la un nod B în dreapta. Motorul M se află pe orizontală între A și B. Din A un alt comutator S3 coboară la masă; din B un alt comutator S4 coboară la masă.

Puntea H: patru comutatoare (S1S4) conectează motorul M între Vmotor și masă.

Închiderea unor perechi diferite de comutatoare selectează ce vede motorul la terminalele sale:

  • S1 + S4 închise, S2 + S3 deschise. Curentul curge de la Vmotor prin S1, în A, prin motor către B, și prin S4 la masă. Motorul se rotește într-un sens.

  • S2 + S3 închise, S1 + S4 deschise. Curentul curge în sens invers prin motor. Motorul se rotește în celălalt sens.

  • Toate cele patru deschise. Ambele terminale ale motorului sunt în gol; motorul rulează din inerție.

  • S3 + S4 închise (sau S1 + S2 închise). Ambele terminale ale motorului sunt legate la aceeași șină; energia cinetică proprie a motorului produce un curent pe care perechea închisă îl scurtcircuitează disipându-l ca și căldură. Motorul frânează.

Combinația interzisă este închiderea ambelor comutatoare de pe aceeași coloană – S1 + S3 sau S2 + S4 – care formează un scurtcircuit direct de la Vmotor la masă. Acesta este fenomenul de shoot-through, iar codul camerei nu trebuie să îl permită.

În practică, cele patru comutatoare sunt MOSFET-uri (introduse pe pagina Conversia nivelurilor de tensiune) integrate într-un circuit integrat driver. Cipul expune două sau trei pini de intrare de nivel logic care se mapează intern la cele patru comutatoare și include o logică de interblocare care previne fenomenul de shoot-through, astfel încât codul camerei nu trebuie să îl gestioneze direct.

3.15.2. PWM și inductanța motorului

Setarea vitezei motorului necesită mai mult decât pornit complet și oprit complet. Trucul este același folosit pentru LED-uri în Atenuarea LED-urilor cu PWM: pulsați comanda la o frecvență înaltă și lăsați sarcina să medieze rezultatul. Pentru un LED, elementul care mediază era ochiul; pentru un motor este chiar bobina.

O bobină de motor are o inductanță considerabilă. Curentul printr-un inductor nu se poate schimba instantaneu; el variază cu o rată proporțională cu tensiunea aplicată la bornele sale. Pulsarea punții pornit-oprit la 20 kHz crește treptat curentul prin bobină în fiecare fază de pornire, iar în faza de oprire curentul trebuie să continue să circule – bobina inversează tensiunea la bornele sale pentru a-l menține.

Fără un loc unde să circule, acest curent ar provoca un vârf de tensiune pe comutatorul tocmai deschis și ar putea deteriora tranzistorul. Diodele de descărcare (freewheeling) plasate în paralel cu fiecare comutator – adesea chiar diodele interne (body diode) ale MOSFET-urilor din cipul driver – oferă curentului calea de care are nevoie. Acesta circulă printr-o diodă și înapoi printr-unul dintre comutatoarele încă închise, completând o buclă de descărcare (freewheel loop) în care curentul se atenuează treptat prin micile rezistențe ale punții și ale motorului. Dioda fixează totodată tensiunea pe comutatorul deschis în limita unei căderi de tensiune pe diodă față de șina la care revine bucla, mult în interiorul zonei de funcționare sigură a MOSFET-ului.

Media curentului pe fiecare perioadă PWM este cea care produce cuplu, iar această medie urmărește liniar factorul de umplere – dublarea factorului de umplere dublează aproximativ cuplul, iar la sarcină constantă dublează aproximativ viteza. Spre deosebire de atenuarea LED-urilor, unde răspunsul neliniar al ochiului impune o curbă, o variație liniară a duty_u16 corespunde deja unei variații liniare a efortului motorului.

Frecvența PWM trebuie doar să depășească două praguri:

  • Peste ~20 kHz, purtătoarea se află în afara benzii audibile pentru om. Sub această valoare, forța magnetică asupra bobinei crește și scade cu fiecare impuls PWM, iar înfășurările și tolele vibrează fizic la frecvența purtătoarei – motorul devine efectiv un mic difuzor care emite un ton la frecvența PWM.

  • Mult peste ~50 kHz, MOSFET-urile și driverele lor de poartă încep să piardă eficiență din cauza pierderilor la comutare. În fiecare tranziție pornit-oprit, MOSFET-ul suportă pentru scurt timp simultan o tensiune semnificativă și un curent semnificativ, disipând o mică cantitate de putere sub formă de căldură; capacitatea de poartă a MOSFET-urilor trebuie de asemenea încărcată și descărcată în fiecare ciclu, cost suportat de cipul driver. Ambele costuri cresc odată cu frecvența PWM, astfel încât la rate înalte căldura provenită din comutare poate rivaliza cu căldura provenită din conducerea curentului motorului.

20 kHz este valoarea implicită confortabilă pentru motoare de dimensiuni hobby.

3.15.3. Comanda unei punți H

Un cip driver de punte H cu două intrări mapează IN1 și IN2 la cele patru comutatoare aproximativ astfel:

  • IN1 = 0, IN2 = 0 – rulare din inerție (toate cele patru comutatoare deschise).

  • IN1 = 1, IN2 = 0 – comandă într-un sens.

  • IN1 = 0, IN2 = 1 – comandă în celălalt sens.

  • IN1 = 1, IN2 = 1 – frânare.

Comandarea celor două intrări ca ieșiri PWM permite camerei să stabilească direcția alegând care dintre cei doi pini poartă factorul de umplere, iar viteza prin valoarea factorului de umplere în sine:

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()

O rampă de la oprit la maxim și înapoi oferă o pornire și o oprire line:

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. Drivere cu direcție și viteză

O a doua familie de cipuri de punte H expune o interfață mai convenabilă: o intrare digitală de direcție (adesea etichetată DIR sau PH de la „phase”) plus o intrare de viteză (adesea PWM sau EN de la „enable”). Pinul de direcție alege sensul în care comandă puntea; factorul de umplere de pe pinul de viteză stabilește curentul mediu.

Aceasta este mai ușor de comandat din software decât schema cu două intrări PWM. Cele două semnale corespund modului în care problema este de obicei formulată – „rotește în acest sens, la această viteză” – astfel încât codul poate spune set_direction(forward); set_speed(50) în loc să ramifice între in1 și in2. Este nevoie de un singur canal PWM, ceea ce eliberează celălalt canal de pe același temporizator pentru o sarcină independentă. Iar pinul de direcție poate rămâne fix între modificări fără a redeclanșa puntea, astfel încât schimbarea vitezei la o direcție fixă afectează un singur registru.

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

Ce face de fapt „stop” pe acest tip de driver – rulare din inerție sau frânare – depinde de cip. Cu un driver cu două intrări, codul camerei alege (ambele intrări la nivel jos pentru rulare din inerție, ambele la nivel înalt pentru frânare); cu un driver cu direcție și viteză decide cipul, așa că merită aruncată o privire pe foaia de date înainte de a te baza pe oricare dintre comportamente.