Tutorial · Principiante · 18 min di lettura

Controlla motori in corrente continua (DC) con PWM e un ponte H

Controlla un motore in corrente continua (DC) con spazzole usando PWM e un ponte H, gestendo direzione, frenata, limiti di corrente, cablaggio e driver sicuro.

Un pin di un microcontrollore può descrivere come deve muoversi un motore, ma non può fornire in sicurezza la corrente del motore. Un motore in corrente continua (DC) con spazzole può assorbire più volte la propria corrente nominale durante la partenza o il blocco. Un driver del motore a ponte H si trova tra il controllore e il motore, commuta la corrente da un’alimentazione separata e permette al controllore di scegliere velocità e direzione.

Questo tutorial costruisce lo stadio motore usato da seguitori di linea, robot per labirinti e piccole piattaforme di evitamento ostacoli. I nomi esatti dei pin variano in base al driver, ma le decisioni elettriche restano le stesse.

Comprendi che cosa cambia il ponte H

Un motore in corrente continua inverte il senso di marcia quando si inverte la corrente che lo attraversa. Un ponte H usa quattro interruttori elettronici attorno al motore. Una coppia diagonale fa scorrere la corrente in avanti; l’altra la fa scorrere all’indietro. Le schede driver espongono questa commutazione tramite pin logici come IN1 e IN2:

IN1 IN2 Stato del motore
Low Low Marcia libera o frenata, a seconda del driver
High Low Avanti
Low High Indietro
High High Frenata o marcia libera, a seconda del driver

Non presumere mai che cosa significhino gli stati Low-Low e High-High. Consulta la tabella di verità del driver specifico. Alcuni chip hanno inoltre un pin ENABLE, STANDBY o SLEEP che deve essere attivato prima che le uscite funzionino.

La modulazione di larghezza di impulso (PWM) controlla la tensione media attivando e disattivando rapidamente l’alimentazione del motore. Un ciclo di lavoro del 25% mantiene l’attivazione per un quarto di ogni periodo; non garantisce un quarto della velocità dell’albero, perché il risultato dipende anche dal carico, dalla tensione di alimentazione, dall’attrito e dalla forza controelettromotrice del motore.

Tre tracce d'onda quadrate impilate verticalmente, tutte che commutano tra zero e dodici volt alla stessa frequenza ma con tempi di attivazione diversi. L'onda superiore è attiva per il settantacinque percento di ogni periodo e una linea tratteggiata ne indica la tensione media di nove volt; quella centrale è attiva per il quaranta percento del tempo e ha una media di quattro virgola otto volt; quella inferiore è attiva per il quindici percento e ha una media di uno virgola otto volt.
La tensione di alimentazione non cambia mai. Cambia soltanto la frazione di tempo durante la quale è collegata e l'induttanza del motore trasforma quella frazione in un valore medio. Scarica SVG

Scegli il driver in base alla corrente, non alle dimensioni del motore

Trova la tensione nominale, la corrente a vuoto e la corrente di stallo del motore. La corrente di stallo è il valore più importante per dimensionare il driver, perché è ciò che il motore richiede quando l’albero non può girare. Se il foglio dati non è disponibile, misura la resistenza degli avvolgimenti con il motore scollegato e stima stall current = supply voltage / winding resistance. La resistenza dei cavi del multimetro rende questa stima soltanto approssimativa.

Scegli un driver il cui intervallo di tensione motore includa l’alimentazione e la cui corrente di picco possa sopportare l’avvio. Poi controlla la corrente continua e le condizioni termiche. Una scheda annunciata con un elevato valore di picco può supportarlo soltanto per brevi periodi o con un raffreddamento considerevole.

Tieni conto anche della caduta di tensione. I driver più vecchi basati su transistor bipolari possono perdere una tensione significativa all’interno del ponte; i driver moderni basati su MOSFET dissipano solitamente meno potenza. Per un robot alimentato da batteria, questa differenza influisce sulla coppia e sul tempo di funzionamento.

Cabla in sicurezza un motore

Segui quest’ordine prima di applicare l’alimentazione:

  1. Collega l’alimentazione del motore all’ingresso di potenza del driver e alla massa.
  2. Collega il motore alle due uscite del driver, non a un pin del microcontrollore.
  3. Collega la massa del controllore alla massa del driver, in modo che i segnali logici condividano un riferimento.
  4. Collega IN1, IN2 e qualsiasi pin di abilitazione a pin digitali adatti.
  5. Mantieni corti i collegamenti del motore e instradali lontano dai cavi dei sensori analogici.
  6. Verifica i requisiti di tensione logica del driver prima di collegare un ESP32 o un Raspberry Pi da 3.3 V.

Usa un fusibile o un alimentatore da banco con limitazione di corrente durante la prima accensione. Aggiungi il disaccoppiamento locale dell’alimentazione come raccomandato nel foglio dati del driver. Non alimentare mai un motore carico tramite il regolatore da 5 V o il connettore USB dell’Arduino: è il brown-out che si manifesta come un arresto anomalo del software.

Scrivi una piccola funzione per il motore

L’interfaccia più pulita accetta un comando con segno: positivo significa avanti, negativo indietro e zero fermo. Su una scheda di tipo Arduino, un’implementazione minima è la seguente:

const int IN1 = 7;
const int IN2 = 8;
const int PWM_PIN = 5;

void setMotor(int command) {
  command = constrain(command, -255, 255);
  digitalWrite(IN1, command >= 0 ? HIGH : LOW);
  digitalWrite(IN2, command >= 0 ? LOW : HIGH);
  analogWrite(PWM_PIN, abs(command));
}

Questo esempio presuppone un driver con un ingresso PWM/abilitazione separato. Un driver a due ingressi può attendere il PWM su un ingresso mentre l’altro mantiene lo stato della direzione. Consulta la sua tabella di verità anziché copiare alla cieca la logica dei pin.

Durante l’inversione, comanda brevemente zero prima di cambiare direzione. Un’inversione istantanea alla velocità massima produce una forte corrente transitoria e uno shock meccanico. Una semplice rampa migliora anche la trazione:

for (int command = 0; command <= 180; command += 5) {
  setMotor(command);
  delay(15);
}

In un vero anello di controllo, basa quella rampa sul tempo anziché usare chiamate delay() bloccanti.

Prova direzione, velocità, marcia libera e frenata

Solleva le ruote dal tavolo per la prima prova. Inizia con un ciclo di lavoro basso, conferma la direzione comandata e aumentalo gradualmente. Registra il comando più basso che avvia in modo affidabile il motore. L’attrito statico crea una zona morta, quindi i comandi inferiori a quella soglia possono ronzare senza far girare il motore.

Confronta poi le modalità di arresto. In marcia libera il ponte viene scollegato o rilasciato e la quantità di moto rallenta il motore. La frenata dinamica collega i morsetti del motore in cortocircuito attraverso il ponte, così il motore in rotazione dissipa energia e si arresta più rapidamente. La frenata sottopone a maggiori sollecitazioni elettriche e meccaniche, quindi usala in modo deliberato.

Infine, metti il robot sul pavimento e ripeti. Un motore che gira a vuoto può provocare il brown-out del controllore sotto un carico reale. Osserva la tensione di alimentazione durante l’avvio e verifica che il driver non si stia surriscaldando.

Diagnostica i guasti comuni

  • Il controllore si riavvia all’avvio del motore: l’alimentazione cala oppure il rumore del motore raggiunge la linea logica. Usa una corrente dalla batteria adeguata, il disaccoppiamento locale, una messa a terra pulita e, quando appropriato, un’alimentazione logica separata.
  • Il motore funziona soltanto in una direzione: verifica entrambi gli ingressi logici sul driver e conferma che lo standby o l’abilitazione siano attivati.
  • La velocità cambia appena con il PWM: verifica che il pin scelto supporti davvero il PWM e che il driver accetti il PWM su quell’ingresso.
  • Il driver diventa caldo: confronta la corrente di carico e quella di stallo con la portata continua, controlla la caduta di tensione e verifica se il gruppo di trasmissione è bloccato meccanicamente.
  • I sensori diventano rumorosi: separa il cablaggio del motore da quello dei sensori, aggiungi la soppressione raccomandata dal produttore del motore/driver e filtra le misurazioni solo dopo aver corretto il percorso elettrico.

Una volta che un motore funziona in modo prevedibile, duplica il canale per un robot a trazione differenziale. Il Simulatore di robot seguilinea mostra come due comandi di ruota con segno diventano sterzata, mentre il Simulatore del controllore PID mostra come la retroazione può regolare la velocità invece di affidarsi al ciclo di lavoro grezzo.

Mantieni le manopole di taratura dell’hardware

Due motori nominalmente identici producono raramente velocità identiche. Mantieni in software un fattore di scala per ruota e il comando minimo di avvio. Misura la differenza anziché nasconderla con una compensazione fissa e non spiegata. In seguito, encoder in quadratura potranno chiudere l’anello e correggere la velocità al variare della tensione della batteria e del carico.

Esplora il grafo

Fa parte di queste costruzioni

Progetti e percorsi di apprendimento che includono questo tutorial.

Per approfondire

Fonti