Controlli motori DC con LPC2101

In questo articolo si illustra come utilizzare il microcontrollore LPC2101 (NXP) per il pilotaggio di motori DC (Direct Current).

Un motore brushless DC (BLDC) è un motore elettrico sincrono alimentato da corrente diretta di energia elettrica (DC) con un sistema di controllo elettronico a commutazione. A differenza di uno Brushed DC, non ha bisogno di contatti elettrici striscianti sull’albero motore per funzionare (da qui il nome); un motore Brushed (figura 1) è costituito da uno statore (magnete permanente) e un rotore (elettromagnete).

Figura 2: motori DC.

Figura 1: motori DC.

Dalla attrazione dei poli  magnetici opposti e dalla repulsione degli stessi si genera una coppia rotante. Il principale  svantaggio  di questo di motori BLDC sta nel maggiore costo. Al contrario dei motori a Brushed, infatti, il controllo viene effettuato elettronicamente con un circuito integrato venduto assieme al motore; per questo non è solitamente possibile utilizzare un potenziometro o un reostato (inefficiente ma estremamente economico). Se si suppone di alimentare la bobina, un campo magnetico si genera tra le armature che provoca il movimento  del motore. Quando le armature diventano allineati orizzontalmente, la bobina inverte il campo magnetico e il processo di rotazione continua (figura 2).

Figura 3: principio di funzionamento di motori DC.

Figura 2: principio di funzionamento di motori DC.

Il rotore è costituito da una serie di spire solidali con l’albero rotante; il collegamento elettrico con l’alimentazione è costituito da due spazzole striscianti (brush) che costituiscono la parte più delicata del motore. Si tratta di cilindri in carbone o contatti in metallo che strisciano sul alcuni contatti elettrici ricavati nell’albero  (il collettore). Il circuito equivalente di un motore DC è costituito dai seguenti componenti posti in serie: una resistenza (Ra di qualche ohm), un induttore (milliHenry, ininfluente a regime ma importante alla partenza e per i problemi che causa) e da un generatore di tensione Eg, proporzionale alla velocità di rotazione (figura 3).

Figura 1: circuito equivalente dei motori DC.

Figura 3: circuito equivalente dei motori DC.

La legge che ne regola il funzionamento è la seguente:

dove Va è la tensione di alimentazione, Ra è la resistenza tra le armature, L è l’induttanza tra le armature, Kt   e Km   sono due costanti (di tempo e di motore), Cm è la coppia motrice e ω la velocità di rotazione. In generale, la velocità di rotazione di un motore DC è proporzionale  alla tensione applicata ad esso e la coppia è proporzionale alla corrente. Il controllo della velocità può essere ottenuto mediante variazione della tensione di alimentazione, uso di resistenze o controlli elettronici. La direzione del campo DC motore, inoltre, può essere cambiata invertendo il campo o le connessioni dell’armatura ma non entrambi. La tensione effettiva può essere variata con l’inserimento di una serie di resistenze o di un controllo elettronico di tiristori o transistor.

Le tecniche di pilotaggio possono essere le seguenti:

➤ Bidirectional rotation: pilotando il motore con 4 mosfet agendo opportunamente sul verso della corrente (figura 4).

Figura 4: bidirectional rotation.

Figura 4: bidirectional rotation.

➤ Pilotaggio lineare: si ottiene quando l’alimentazione è collegato all’uscita di un circuito elettronico che genera una tensione continua, per esempio un amplificatore operazionale di potenza adeguata oppure un regolatore di tensione.

➤ Pilotaggio On/Off: realizzato attraverso un transistor che lavora in commutazione cioè o in conduzione o come circuito aperto, come un interruttore.

➤ Speed Control: la velocità del motore varia con la tensione applicata. Usando un Pulse W idth Modulation (PWM) a frequenza fissata e duty cycle variabile è possibile variare la velocità del motore stesso (figura 5).

Figura 5: speed control.

Figura 5: speed control.

In una possibile applicazione (figura 6) i segnali  PWM sono generati da due timer; un terzo utilizzato per la scelta della frequenza dei segnali.

Figura 6: esempio di connessione circuitale.

Figura 6: esempio di connessione circuitale.

La velocità è regolata per mezzo di un potenziometro usando l’input ADC del LPC2101. La tecnica con l’utilizzo del PWM è controllato per mezzo di un processore. Presenta alta efficienza con potenza quasi interamente trasferita al motore. In particolare, il  pilotaggio con un segnale PWM può essere effettuato nel seguente modo:

➤ Sign/magnitude PWM: occorre un segnale PWM per l’ampiezza ed uno costante per il verso di rotazione. Il  duty cycle del segnale PWM varia tra lo 0% (motore fermo) ed il 100% (motore a piena velocità); esso deve essere applicato direttamente ad una coppia diagonale di transistor mentre l’altra deve essere spenta. L’ingresso di segno serve per scegliere a quale coppia di transistor applicare il segnale  PWM.

➤ Locked anti-phase PWM: occorre un solo segnale PWM tale che quando è alto è in conduzione una coppia di transistor, quando è basso l’altra coppia. L’effetto è quello di forzare la corrente nel motore prima in un verso, poi nell’altra: a causa dell’induttanza si ha una stabilizzazione intorno al valor medio. In particolare quando un duty cycle è del 50% la corrente è nulla, la tensione media nulla e quindi il motore è fermo. Quando il duty cycle tende al 100% il motore ruota a piena velocità in un verso, quando è dello 0%, ruota a piena velocità nell’altro verso.

In un circuito conosciuto come “tritatutto”, la tensione applicata al motore viene regolata attraverso una opportuna commutazione della tensione di alimentazione. Con una tensione di 100 V la tensione media al motore applicata sarà circa 25 V. Dal momento che la serie di motori DC sviluppa una coppia motrice molto alta, è spesso utilizzato in applicazioni quali locomotive elettriche e Il microprocessore utilizzato per il pilotaggio di motori DC è LPC2101. LPC2101 è basato su tecnologia ARM7 da 16/32 bit con emulazione in tempo reale e supporto di traccia embedded. La CPU ARM7  utilizza la tecnologia pipeline per l’esecuzione delle istruzioni. L’ARM7 è un tipo di architettura loadstore. I dati vengono caricati da una memoria centrale in un set di registri (memoria secondaria), quindi vengono eseguiti le varie istruzioni di processamento di dati. Successivamente  i dati sono riportati nella memoria centrale. La caratteristiche principali dei controllori LPC2101 (figure 8, 9 e 10) possono essere riassunte nel modo seguente:

➤ Processore ARM7DMI-S 32 bit 70 MHz.

➤ RAM statica su chip a 8 kB.

➤ Programmazione su sistema (ISP) e programmazione su applicazione (IAP) tramite software bootloader integrato su chip.

➤ Controllore di interrupt vettorizzato con priorità e indirizzi di vettore configurabili.

➤ L’interfaccia embedded ICE-RT abilita punti di arresto e di controllo. Le routine di servizio di interrupt possono continuare ad essere eseguite, mentre il debug delle operazioni a priorità alta è eseguito dal software integrato su chip RealMonitor™.

➤ L’interfaccia Embedded Trace Macrocell permette una tracciatura in tempo reale ad alta velocità non intrusiva dell’esecuzione di istruzione.

➤ Interfacce seriali multiple.

➤ ADC a 10 bit.

➤ Contatore di eventi esterni a 16 bit.

Figura 8: LPC 2101, schema a blocchi.

Figura 8: LPC 2101, schema a blocchi.

 

Figura 9: LPC2101, pinout.

Figura 9: LPC2101, pinout.

 

Figura 10: alcuni modelli della famiglia LPC210x

Figura 10: alcuni modelli della famiglia LPC210x

Il progetto

Il microprocessore  utilizzato è LPC2101 per le sue caratteristiche tecniche elencate in precedenza e oltre ad essere il meno costoso. Il motore DC che considereremo è il Maxon Re-40 da 150 W con 6920 RPM a 12 V massima corrente applicabile di 6 A. Il motore viene utilizzato nel modo continuo con pilotaggio PWM (mode continuous, figura 11).

Figura 11: Continuous Mode.

Figura 11: Continuous Mode.

In relazione alla scelta del motore scegliamo il MOSFET  PH1875L per il sistema in progetto. Le caratteristiche di questo componente elettronico possono essere riassunte nel seguente modo:

➤ tensione DrainSource: 75 V;

➤ corrente di Drain: 45.8 A;

➤ bassa resistenza termica;

➤ tecnologia: TrenchMOS.

L’importanza dell’utilizzo di questi Mosfet è dovuta al fatto di regolare opportunamente  il segnale fornito al motore. In figura 12 riportiamo un esempio di applicazione. Il  tutto viene gestito mediante un software (figura 13) scritto in C e compilato usando uVision (ARM7RealView V3.0). I principali moduli costituenti il main programm sono:

➤ lettura potenziometro per una velocità desiderata;

➤ lettura e controllo della corrente del motore;

➤ set duty cycle PWM;

➤ set comunicazione RS232;

Figura 12: Driver Mosfet.

Figura 12: Driver Mosfet.

 

Figura 13: main program.

Figura 13: main program.

Nel listato 1 è riportato il codice del ciclo While di gestione del motore con il relativo significato.

while(1)
  {
  ADC_Sample();                           // prende l’ultimo valore letto dall’ADC

  if (motorCurrent > MAX_Im)              // Controllo corrente del motore
     state = ST_COAST;

  if (f_10ms)                             // ogni 10 milli secondi
  {
    f_10ms = 0; // reset flag
    if (actualSpeed > desiredSpeed)
       actualSpeed —;
    else if (actualSpeed < desiredSpeed)
       actualSpeed ++;

    switch (state)
    {
       case ST_COAST:                     // aspetta per il reset del sistema
         break;
       case ST_STOP:
         if (desiredSpeed < 123)          // cambia verso ?
                            state = ST_REVERSE;
                            else if (desiredSpeed > 132)      //
Avanti ?
                            state = ST_FORWARD;
         break;
      case ST_BRAKE:
         if (bemf1 < 5 && bemf2 < 5)      // aspetta, il motore
                                          // è stato stoppato

        {
        actualSpeed = 127;
        state = ST_STOP;
        }
        break;
        case ST_FORWARD:
        if (desiredSpeed < 133)         // non avanti?
               state = ST_BRAKE         // ferma !

        break;
      case ST_REVERSE:
        if (desiredSpeed > 122)         // non cambia verso ?
                state = ST_BRAKE;       // ferma!

        break;
        default:
        break;
    }
  }
  if (f_200ms)                        // ogni 200 milli secondi
     {
     f_200ms = 0;                     // reset flag
     PrintString(“ “); PrintByte(bemf1);
     PrintString(“ “); PrintByte(bemf2);
     PrintString(“ “); PrintByte(desiredSpeed);
     PrintString(“ “); PrintByte(motorCurrent);
     PrintString(“\r”);
     }
  }
}
Listato 1

 

 

Scrivi un commento

EOS-Academy
EOS-Academy