CENT4UR™ – Driver di potenza per coppia di motori DC a spazzole. Esempio di pilotaggio con microcontrollore PIC
E’ con piacere che vi presento un altro progetto targato settorezero.com, destinato soprattutto ai robottari : CENT4UR™. Si tratta di un driver motori, o ponte H, ideato per il pilotaggio di una coppia di motori DC a spazzole aventi un assorbimento massimo di 2A ciascuno ed una tensione di alimentazione da 6 a 30V. CENT4UR™ è quindi adatto alla movimentazione di robot con ruote piccoli e medi.
CENT4UR™ è basato sul “buon vecchio” ponte H integrato L298N e presenta le seguenti caratteristiche:
- PCB industriale FR4, doppia faccia, solder mask rosso, serigrafia bianca lato componenti
- Singola tensione di alimentazione: e’ possibile alimentare la scheda con la sola tensione destinata ai motori
- Diodi di ricircolo ad alta efficienza
- Circuiteria di current sensing integrata
- Pilotaggio in modalità LAP con un solo segnale PWM per canale
- Ingressi separati per disabilitazione stadi di potenza
- Manuale in italiano completo ed esauriente
Ulteriori informazioni su come ottenere un PCB, sulla scheda e il download del manuale sono disponibili nella pagina della sezione servizi dedicata a CENT4UR. Ricordo che chi richiede un PCB di CENT4UR™ contribuisce a sostenere settorezero.com.
In questo articolo vi mostro come collegare CENT4UR™ al PIC16F877A e ad una coppia di motori. Prenderò come riferimento la scheda di sviluppo FreedomII
Indice dei contenuti
Esempio di controllo con PIC16F877A
Il diagramma seguente illustra il collegamento da fare tra CENT4UR™ e il PIC16F877A per poter sfruttare l’esempio allegato:
In realtà gli unici collegamenti strettamente necessari verso il picmicro sono i due ingressi PWM e la massa comune. Se leggete il manuale di CENT4UR potete capire l’importanza del leggere la corrente assorbita dai motori (per i quali sono necessari altri 2 collegamenti) e di fermarli in caso di emergenza (altri 2 collegamenti o 1 collegamento se si vogliono fermare simultaneamente).
L’esempio allegato utilizza un display compatibile HD44780 collegato sul banco di porte D (usato per mostrare il valore di PWM attualmente applicato al driver motori e l’assorbimento espresso in mA del motore A e del motore B separatamente), un trimmer collegato sulla porta RA1/AN1 per l’impostazione del duty cycle del segnale PWM e due pulsanti su RB4 e RB5 per disabilitare rispettivamente il motore A e il motore B. Sulla Freedom II tutti questi collegamenti sono già fatti e RB4 fa capo al pulsante identificato come BT1 e RB5 fa capo al pulsante BT2.
Utilizzando la Freedom 2 vi dovete ricordare unicamente di abilitare il display LCD tramite l’apposito jumper a 3 vie contrassegnato con “LCD” (il jumper deve chiudere i pin 1 e 2) e , solo per la revisione 3 di Freedom II, di mantenere fissa la retroilluminazione del display anzichè farla pilotare da RC1 chiudendo il jumper JP13 (posto sotto al display) in posizione 1-2. Altra alternativa è quella di togliere il jumper e rimanere quindi disattivata la retroilluminazione. Sulle revisioni 1 e 2 di Freedom II questo jumper non è presente, per cui vedrete variare la retroilluminazione del display in concomitanza della velocità dei motori dato che la stessa uscita RC1 viene usata sia per il PWM che per pilotare la base del transistor che abilita la retroilluminazione.
Questo video vi illustra il funzionamento del codice di esempio:
In pratica, girando il trimmer “ANALOG”, collegato su AN1, il valore letto dal convertitore AD viene trasferito ai registri di controllo del modulo CCP per impostare il valore di duty cycle. Essendo CENT4UR™ pilotato in modalità Locked-Anti-Phase (LAP), un valore di duty cycle prossimo al 50% causa l’arresto dei motori, un valore superiore ne causa la rotazione in un verso con velocità crescente man mano che ci si avvicina al valore massimo impostabile (100%); un valore di PWM inferiore a 512 causa la rotazione dei motori nel verso opposto con velocità crescente fino ad arrivare al valore minimo (0% ovvero segnale PWM a GND fisso).
Sulla riga superiore del display è mostrato il valore di duty cycle del PWM impostato dalla rotazione del trimmer, mentre la riga inferiore mostra l’assorbimento dei motori A e B rispettivamente espresso in milliampere. La pressione dei pulsanti BT1 e BT2 causa la disattivazione/riattivazione degli stadi di potenza A e B rispettivamente.
Cenni sul PWM
Anticipo già che se ancora non avete chiari i concetti di frequenza/periodo/duty cycle è bene che diate un occhio a wikipedia prima di continuare a leggere.
Sui PICmicro possiamo variare il valore del duty cycle in maniera indipendente per i vari canali. Dal momento, però, che i moduli CCP utilizzano la stessa base dei tempi (il Timer2), tutti i moduli saranno vincolati ad avere la stessa frequenza operativa. Quando si pilotano motori in PWM ci sono da fare varie considerazioni riguardo alla frequenza applicata. L’ideale sarebbe sempre scegliere una frequenza superiore o per lo meno prossima ai 20KHz in maniera tale che i motori non producano fischi udibili all’orecchio umano.
Sui PIC12/16 la formula per il calcolo del duty cycle è la seguente:
DutyCycle = ValoreCCP * Tosc * Prescaler |
In questa formula il duty cycle risulta espresso come durata del livello logico alto piuttosto che come percentuale come si è abituati. Il ValoreCCP è invece il valore da assegnare ai registri CCPxL (che contengono gli 8 bit più significativi del valore del duty cycle) e ai bit 4 e 5 dei registri CCPxCON (che rappresentano i due bit meno significativi). Il Duty Cycle su queste MCU è quindi un valore a 10bit.
Vediamo inoltre che il duty cycle, espresso come durata del fronte alto, dipende dalla frequenza operativa del picmicro e dal prescaler assegnato al Timer2. Chiarisco questo concetto: volendo assegnare il valore 512 (la metà di 10bit) ai registri CCP non è detto che il duty cycle risultante sia necessariamente del 50% (durata fronte alto = durata fronte basso) ma dipende dalla frequenza operativa del picmicro e dalla frequenza alla quale si è impostato il PWM.
Ho detto che nel mio esempio utilizzo il valore di tensione in uscita da un trimmer per l’impostazione del duty cycle e quindi per la regolazione di velocità dei motori. Anche il valore letto dal convertitore AD è a 10bit, per cui mi piacerebbe fare in modo che quando il trimmer è al centro, ovvero il modulo AD mi legge il valore 512, il duty cycle sia al 50% (motori fermi in modalità LAP, unica modalità prevista da CENT4UR™). In altre parole: devo scegliere i valori con cui operare in modo da avere una durata del fronte alto del segnale uguale alla durata del fronte basso quando il valore assegnato ai registri CCP del duty cycle vale 512.
Per ottenere questo devo fare alcuni ragionamenti all’inverso, ovvero calcolarmi il duty cycle (in realtà la sola durata del fronte alto, usando la formula del datasheet) quando il valore impostato nei registri CCP è 512. E quindi a ritroso trovare la frequenza alla quale impostare il PWM.
Utilizzando un quarzo da 20MHz, ho che Tosc vale 0,05µS, volendo impostare il valore più basso per il prescaler (1:1) e tenendo conto di ValoreCCP=512, ottengo:
DutyCycle = 512 * 0,05 * 1 = 25,6µS |
Questa è la durata del fronte alto quando i registri CCP del duty cyle sono impostati a 512 (con questo quarzo e questo valore di prescaler). Voglio quindi fare in modo che 512 mi corrisponda al 50% di duty cycle, per cui devo impostare la frequenza operativa del PWM in maniera tale che anche il fronte basso duri 25,6µS. Il periodo, cioè, deve valere 25,6µS + 25,6µS = 51,2µS che corrisponde ad una frequenza di 19,53KHz, prossima al limite dei 20KHz udibile dall’orecchio umano, valore che quindi mi sta bene (ma alcuni uditi molto fini potrebbero comunque udire il suono).
Il periodo del PWM, da datasheet, si calcola con la formula:
PeriodoPWM = (PR2+1) * 4 * TOSC * Prescaler = (PR2+1) * 4 * 0,05 * 1 |
Senza che sto qui a sviluppare tutti i calcoli inversi vi dico che il periodo vale 51,2 µS quando PR2 vale 255 (0xFF). Nella libreria allegata all’esempio imposto quindi PR2 al valore 255 nel setup, in maniera tale da avere una frequenza PWM di 19,5KHz e un duty cycle del 50% quando i registri CCP sono impostati al valore 512 e operiamo in modalità LAP. Vedete inoltre che utilizzando un quarzo da 20MHz non si può fare di meglio (aumentare la frequenza del PWM) dato che possiamo giocare soltanto sul valore di prescaler, ma l’abbiamo già messo a 1 e aumentarlo peggiora soltanto le cose dato che la frequenza diminuisce.
Ovviamente tali considerazioni non vanno fatte soltanto in base al fatto di poter udire o meno il fischio dei motori ma bisogna anche tener conto che alcuni motori potrebbero surriscaldarsi eccessivamente a frequenze ultrasoniche.
Download
In allegato l’esempio per pilotare CENT4UR™ con il PIC16F877A. Se volete che continui a pubblicare esempi di programmazione vi prego ancora una volta di non usare il codice o sue parti per ripubblicarle su altri siti e, se potete, mantenete in vita settorezero con i progetti della sezione servizi. Il file zip contiene il progetto MPLAB e i sorgenti per Hitech-C versione >9.81.
Per altri files relativi a CENT4UR™ e per avere un PCB, fate riferimento alla pagina ad esso dedicata nella sezione servizi.
Esempio pilotaggio CENT4UR con PIC16F877AA (614 download)