In questo articolo analizzeremo un sistema a microcontrollore per modulare la potenza erogabile a motori DC, lampade ad incandescenza, etc. Questa prima puntata fa parte della serie "DRIVER per motori DC" della Rubrica Firmware Reload, nella quale sono inseriti articoli tecnici della passata rivista cartacea Firmware, ancora di interesse per progettisti, ingegneri e appassionati di elettronica.
Come introduzione alla descrizione del dispositivo, ecco di seguito elencate le più importanti funzionalità:
- variazione della potenza (o velocità di rotazione dei motori) tramite coppia di pulsanti e potenziometro
- settabilità dei livelli minimo e massimo di potenza consentiti
- memorizzazione permanente di tali livelli
- settabilità dello step di incremento/decremento di potenza operato dai tasti
- blocco di emergenza del dispositivo pilotato
- programmabilità in-circuit tramite ICSP (In-Circuit Serial Programming)
- controllo visivo dello stato del sistema tramite led e display
Per coloro che da poco si sono affacciati al mondo dell’elettronica, sono doverose alcune brevi premesse teoriche. Come già accennato, il sistema, per modulare la potenza erogata al dispositivo elettrico pilotato, fa uso di un segnale PWM (Pulse Width Modulation). Un’onda PWM è un’onda rettangolare il cui impulso (generalmente lo stato alto del segnale) ha una durata che varia in funzione di una grandezza. In altre parole, viene modificato il D.C. in funzione di una grandezza modulante (Duty Cycle: rapporto tra durata dello stato alto ed il periodo dell’onda stessa - generalmente espresso in %). Nel nostro caso, questa grandezza è un valore che il microcontrollore determina, o leggendo la tensione sull’indice di un potenziometro, o modificandola alla pressione di uno dei due tasti: sw_up (per l’incremento) e sw_down (per il decremento). Per tutta la durata dello stato alto, il nostro dispositivo elettrico viene abilitato a funzionare, e per il restante tempo del periodo dell’onda rimarrà spento. Il risultato sarà quello di apportare potenza al dispositivo pilotato, in una quantità che è funzione del D.C., per l’appunto. Il microcontrollore che integra un dispositivo PWM, riesce a modificare il D.C. di un segnale generato da esso stesso, semplicemente scrivendo su di un registro un opportuno valore. I parametri dell’onda PWM come il periodo dell’onda (e quindi la sua frequenza), e la durata dello stato alto, sono determinati da semplici formule di calcolo, implementate dalla logica del micro stesso. I PIC integrano generalmente uno o più moduli CCP (Capture/Compare/PWM) che si appoggiano al segnale di sincronismo (clock) del micro stesso, ai timer, al prescaler e postscaler, per fornire le temporizzazioni volute dal programmatore. Il microcontrollore, oltre a fornire il segnale PWM, genera anche due segnali che andranno a determinare il verso di rotazione di un motore o, se si presenta il caso, di arrestarlo. I tre segnali necessari a pilotare il dispositivo elettrico (da adesso in poi un motore DC), ovvero l’onda PWM e i due segnali per il verso di rotazione (rot_or & rot_an), vengono amplificati in potenza da una coppia di driver di potenza. Le loro due uscite vengono così utilizzate per alimentare direttamente il nostro motore.
SCHEMA ELETTRICO
A questo punto, per dare subito un significato fisico alle premesse, esaminiamo lo schema elettrico visibile in Figura 1.
Al centro dello schema vedrete il PIC16F876A (U2), che implementa l’intera logica di funzionamento del dispositivo, e i diversi moduli di contorno che sono:
- U3 (ST-L293D) in basso a destra che pilota due motori
- il display a 7 segmenti per l’inserimento di alcuni parametri di funzionamento, e per la visualizzazione di certi stati del sistema
- i tre pulsanti e i loro circuiti anti-rimbalzo, due per l’incremento/decremento della potenza (sw_up & sw_down) e uno (sw_set) per l’inserimento di parametri funzionali (in alto a destra)
- le connessioni per l’ICSP
- l’alimentatore in basso a sinistra
- altre connessioni per i motori, l’alimentazione del circuito e dei motori, ecc.
Occupiamoci anzitutto del PIC e delle sue uscite. In Figura 2 potete vedere la piedinatura del microcontrollore. Esso presenta 3 porte di I/O:
- PORTA da 6 linee configurate sia come input che come output (tra queste si evidenzia AN0/RA0, utilizzata in questo circuito come canale di ingresso dell’ADC, il quale legge la tensione presente sull’indice di POT1
- PORTB da 8 linee configurate sia come input che come output; tra queste si evidenziano le linee PGD/RB7 & PGC/RB6 per l’ICSP e le due linee RB1 & RB2, rispettivamente per i segnali Rot_or e Rot_ant per il corretto verso di rotazione del motore
- PORTC anch’esso da 8 linee tutte configurate in output, utilizzato esclusivamente per pilotare i led del display a 7 segmenti (tranne il punto decimale DP) e per fornire l’onda PWM (CCP1/RC2). Adesso, diamo un’occhiata alla piedinatura di U3, un quadruplo driver di potenza di casa ST siglato L293D (vedi Figura 3)
Osservando lo schema elettrico e questa piedinatura, noterete come Ie due coppie di buffer (o driver) funzionino in parallelo, quindi gli ingressi IN1 e IN4 coincidono col segnale di polarizzazione per la rotazione oraria (e così anche le rispettive uscite OUT1 e OUT4). Stessa cosa per gli ingressi IN2 e IN3, che vengono pilotati comunemente dal segnale per la rotazione antioraria. Il segnale PWM, in uscita dal piedino 13 (RC2/CCP1) del micro, piloterà gli ingressi di abilitazione di queste due coppie, ovvero EN1 ed EN2. Si intuisce allora, per quanto già accennato all’inizio, che quando il livello del segnale PWM è alto i motori verranno alimentati secondo la polarizzazione impartita dai due segnali di ingresso, diversamente verranno diseccitati. Vi è da precisare che le tensioni di funzionamento di questo integrato sono 2: una a +5V per la logica interna (coincidente con quella del micro) e siglata Vss (pin 16), e l’altra è quella di potenza (alimentante i due motori) e siglata Vs (pin 8).
Adesso, occupiamoci del resto del circuito. Partiamo dal connettore CONN1 per i segnali dell’ICSP: in ordine crescente dei pin abbiamo i segnali Vpp, +5V, GND, PGD e PGC (il pin 6 non è collegato), esattamente coincidente con la piedinatura dei segnali in uscita dal programmatore PICkit2; in questo modo, risulterà agevolato l’interfacciamento del dispositivo con questo programmatore, per chi fosse intenzionato a modificare, a proprio piacere, il firmware di gestione del PIC. La rete R2-C1-R3 forza il reset del PIC all’accensione, agendo sul terminale MCLR/vpp. Per quanto riguarda il display, questo viene controllato direttamente dal PORTC, con l’accorgimento di far funzionare le linee in logica negativa: ciò consente una erogazione di corrente, da parte del PORT, decisamente migliore; in altre parole, per poter accendere un segmento bisognerà portare a livello basso la linea corrispondente. Ciò rende necessario un display ad anodo comune ed un circuito di alimentazione appropriato. Infatti, invece di usare una resistenza per ogni segmento, ho preferito fornire una tensione stabile direttamente sui due terminali di Anodo. Ciò è realizzato impiegando la rete R1-D1-T che fornisce sull’emettitore di quest’ultimo (un BJT NPN), una tensione di circa 2,8V. Adesso, considerando che in erogazione di corrente la linea del PORTC ha un livello di circa 0,7V, capiamo che ogni led del display verrà sottoposto ad una tensione differenza di circa 2,1V, valore sufficiente a farlo illuminare correttamente. Poi, abbiamo i due led usati per la segnalazione del verso di rotazione del motore (LED1/LED2), e LED3 che segnalerà la presenza di alimentazione sul circuito.
A questo proposito, si è inserito uno stabilizzatore di tensione (U1=7805) con i relativi condensatori di livellamento (C2, C4), il diodo di protezione contro l’inversione di polarizzazione dell’alimentazione (D2) e JP2, che può benissimo essere sostituito da un interruttore generale. Sulla parte destra e in alto, ritroviamo i 3 microswitch SW1, SW2, SW3 alias sw_set , sw_up e sw_down con i loro circuiti antirimbalzo a rete RC; per esempio, per sw_down abbiamo C9 in parallelo ed R12 connesso tra questo e la massa (la stessa funzione la svolgono C8-R11 per sw_up e C5-R8 per sw_set). Più in basso, abbiamo INT1 (interruttore o jumper)-R9 che consentono la disabilitazione di emergenza dei motori (quando l’interruttore viene aperto) e JP4-R10 per la scelta della modalità di funzionamento (Jumper aperto=singolo senso di rotazione; Jumper chiuso=doppio senso di rotazione). Continuando, abbiamo il quarzo da 4 MHz (X1) accompagnato dai due condensatori C6 e C7. Andando più in basso, osserviamo JP3 in serie alla linea PWM: questo forza la disabilitazione dei motori (ovvero di U3) quando viene aperto, dal momento che le due linee di abilitazione EN1-EN2 sono attive-alte, e che tra il Jumper e la massa è presente la resistenza R7. Per completare la descrizione del circuito, osserviamo la presenza del connettore CONN6 che riporta i tre segnali per il pilotaggio dei motori, le due tensioni di alimentazione (+5V e quella dei motori), nonché la massa. Questo consentirà, a chi lo desideri, di impiegare driver più potenti e/o di pilotare apparecchi in corrente alternata. Inoltre, vi è CONN7 a due terminali, che riporta la massa e la linea di interrupt siglata INT (o RB0, pin 21 del PIC). Questi due accorgimenti forniscono interessanti margini di sviluppo delle funzionalità del dispositivo.