Controllo in corrente di un motore DC

UNIVERSITÀ DEGLI STUDI DI ROMA
TOR VERGATA
FACOLTÀ DI INGEGNERIA
CORSO DI LAUREA IN INGEGNERIA
DELL’AUTOMAZIONE
A.A. 2010/2011
Tesi di Laurea
CONTROLLO IN CORRENTE
DI UN MOTORE DC
RELATORE
CANDIDATO
prof. Daniele Carnevale
Pierluigi Di Franco
Alla mia fidanzata
Alessia Rosa
Indice
Ringraziamenti
1
Introduzione
2
1 Azionamento motore
4
1.1
I motori DC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.1.1
Circuito equivalente elettrico . . . . . . . . . . . . . . . . . . .
5
1.1.2
Caratterizzazione del carico meccanico . . . . . . . . . . . . .
8
1.2
Pilotaggio ON-OFF . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
1.3
Pilotaggio PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
1.4
Il ponte ad H . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
2 Realizzazione hardware
2.1
2.2
2.3
INDICE
16
L298N: specifiche tecniche . . . . . . . . . . . . . . . . . . . . . . . .
16
2.1.1
Dimensionamento Rsense . . . . . . . . . . . . . . . . . . . . .
19
Acquisizione dati: misura di Vsense . . . . . . . . . . . . . . . . . . . .
20
2.2.1
Amplificatore operazionale . . . . . . . . . . . . . . . . . . . .
21
2.2.2
Configurazione non invertente . . . . . . . . . . . . . . . . . .
23
2.2.3
Configurazione con filtro attivo . . . . . . . . . . . . . . . . .
24
Acquisizione dati: posizione e verso di rotazione . . . . . . . . . . . .
26
I
INDICE
2.3.1
Encoder tachimetrico . . . . . . . . . . . . . . . . . . . . . . .
26
2.3.2
Verso di rotazione . . . . . . . . . . . . . . . . . . . . . . . . .
27
3 Realizzazione software
3.1
3.2
29
Arduino Duemilanove . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
3.1.1
Linguaggio di programmazione
. . . . . . . . . . . . . . . . .
30
3.1.2
Impostare la frequenza PWM . . . . . . . . . . . . . . . . . .
33
3.1.3
Procedura di azionamento . . . . . . . . . . . . . . . . . . . .
34
Identificazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
3.2.1
Il problema della Dead Zone . . . . . . . . . . . . . . . . . . .
38
3.2.2
Stima della velocità angolare . . . . . . . . . . . . . . . . . . .
39
3.2.3
System Identification Toolbox . . . . . . . . . . . . . . . . . .
40
3.2.4
Risultati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
4 Progetto di regolatori
46
4.1
Controllo in posizione . . . . . . . . . . . . . . . . . . . . . . . . . . .
48
4.2
Controllo in corrente . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
5 Conclusioni e sviluppi futuri
55
Appendice A - Schema elettrico circuito di potenza
57
Appendice B - Codice Arduino
59
Appendice C - Codice MatLab
70
Elenco delle figure
74
Bibliografia
74
INDICE
II
Ringraziamenti
I ringraziamenti sono per mio padre Eduardo per avermi dato l’opportunità di studiare, e per la mia fidanzata Alessia per il costante supporto morale nella vita di
tutti i giorni. Ringrazio tutte le persone con cui ho condiviso le ore nel laboratorio
di robotica pesante, che mi hanno aiutato con la loro esperienza quando ne ho avuto
bisogno. In particolare ringrazio Andrea, i due Paolo, Danilo per il loro aiuto, e un
ringraziamento speciale per Fausto che all’ inizio della tesi mi ha assistito insegnandomi la saldatura e la comunicazione Arduino MatLab. Ovviamente ringrazio il prof.
Carnevale Daniele per l’ opportunità che mi ha dato con questa tesi e per il costante
aiuto e supporto.
Introduzione
1
Introduzione
Con la definizione "azionamenti elettrici" si indica una vasta gamma di sistemi composti da attuatori elettrici (i motori) utilizzati per generare il movimento, dai rispettivi
moduli di controllo, nonché degli organi di trasmissione e trasformazione del moto.
Questi azionamenti sono utilizzati nei più disparati settori applicativi che comprendono, tra l’altro, elettrodomestici, trazione ferroviaria, impiantistica industriale e civile
(pompe, ascensori, ... ), robot industriali, macchine a controllo numerico, strumentazione elettronica, periferiche di calcolatori (testine di stampanti, unità dischi, scanner,
...) , accessori automobilistici (vetri elettrici, tergicristalli, pompe della benzina) e
molti altri. Ciascuna di queste applicazioni ha requisiti differenti in termini di potenza installata e caratteristiche di comando. Inoltre, ci sono applicazioni in cui è
necessario regolare la velocità del motore (ad esempio mandrino di un trapano, pompa, ventilatore) ed altre in cui il motore va pilotato in posizione (ad esempio assi di
un robot industriale o di una fresa a controllo numerico), più raramente si utilizza un
controllo di coppia. Talvolta la regolazione è grossolana (ad esempio ventilatore acceso/spento a una o due velocità), altre volte è richiesta una regolazione molto precisa
(ad esempio macchina a controllo numerico). Per far fronte a questa enorme varietà
di esigenze sono state sviluppate differenti tipologie di motori e di relativi sistemi di
regolazione. Nei decenni scorsi, prima che cominciasse lo sviluppo dell’elettronica di
bassa ed alta potenza i sistemi di regolazione erano più semplici e ciascuno di essi
Introduzione
2
Introduzione
dedicato a specifici campi applicativi. Le prospettive sono profondamente mutate
durante la seconda metà degli anni 80; infatti, lo sviluppo di nuovi semiconduttori di
potenza (in particolare MOSFET e IGBT) ha permesso di realizzare, con costi decisamente competitivi, inverter caratterizzati da un elevato grado di affidabilità. Inoltre
lo sviluppo dei microprocessori (ed in particolare modo quello dei Microcontrollori e
dei Digital Signal Processors) ha consentito di impiegare tecniche di controllo molto
più sofisticate di quelle tradizionali. L’obbiettivo di questa tesi è la realizzazione di
un dispositivo elettronico di pilotaggio di un motore in corrente continua , e di controllare, tramite microcontrollore, le fondamentali grandezze meccaniche: posizione,
velocità angolare e coppia motrice. In particolare il lavoro svolto è stato suddiviso in
quattro capitoli, poichè quattro sono state le tematiche studiate:
1. Il primo capitolo introduce il funzionamento di un motore DC e le tecniche di
pilotaggio, descrivendo le problematiche da affrontare;
2. Nel secondo capitolo è descritta la realizzazione del circuito elettrico di comando
del motore e dei dispositivi per l’acquisizione delle grandezze di interesse, con
particolare attenzione alle scelte di dimensionamento dei componenti elettrici;
3. Il terzo capitolo descrive il programma software implementato su microcontrollore e PC per la fase di identificazione: tramite i dati di ingresso e uscita
è infatti possibile identificare, sfruttando opportuni algoritmi, la funzione di
trasferimento del dispositivo elettronico e del motore DC;
4. Nell’ultimo capitolo, avendo una buona approssimazione del comportamento
dinamico del motore, vengono presentati gli algoritmi di controllo di posizione,
velocità e coppia.
Introduzione
3
Capitolo 1
Azionamento motore
Questo capitolo ha lo scopo di introdurre il lettore all’azionamento di un motore DC. Dopo una descrizione dei principi di funzionamento di un motore DC e della sua modellazione matematica, seguirà una spiegazione delle tecniche di pilotaggio utilizzate,
introducendo in via teorica le problematiche affrontate.
1.1
I motori DC
Il motore in corrente continua (brevemente motore DC, dall’inglese: direct current)
è molto usato per piccole potenze e trova largo utilizzo nel settore dell’automazione
di asservimento e nella robotica. Il principio di funzionamento di un motore elettrico
è basato sull’interazione di due campi magnetici che si attraggono e respingono a
vicenda. Il motore è composto da una parte rotante detta rotore ed una parte fissa
detta statore. Lo statore è l’induttore di campo magnetico, mentre il rotore è l’indotto,
ovvero l’elemento soggetto al campo. Tra i due esiste un sottile strato (a forma
di corona) d’aria detto traferro. L’indotto è rappresentato da un circuito detto di
armatura. I conduttori dell’armatura sono posti all’interno delle cave, buchi ricavati
lungo il cilindro rotorico. L’armatura è alimentata dalla corrente ia , inviata tramite
le spazzole su un sistema di lamelle solidali al rotore detto collettore. L’induttore è
4
Cap. 1 Azionamento motore
§1.1 I motori DC
Figura 1.1: Sezione di un motore elettrico
rappresentato da un circuito detto di eccitazione. Lo statore è detto induttore perché è
la parte che genera il campo magnetico principale. Esso possiede i poli principali su cui
sono avvolte le bobine di eccitazione entro cui scorre la corrente ie . Il sistema appena
presentato di poli/bobine è detto avvolgimento di eccitazione. I motori DC, collegati
ad un’opportuna scheda di controllo, possono essere controllati con un segnale PWM
(oggetto della tesi), inoltre i motori DC di piccola potenza sono economici, facili da
reperire e spesso sono corredati di riduttore (gearbox).
1.1.1
Circuito equivalente elettrico
Le equazioni che seguono rappresentano il modello matematico del rotore, sotto le
seguenti ipotesi semplificative:
1. si assume che il circuito magnetico sia lineare;
5
§1.1 I motori DC
Cap. 1 Azionamento motore
2. si assume che l’attrito meccanico sia funzione lineare della velocità del motore.
Figura 1.2: Schema elettrico equivalente di un motore DC
In un motore DC, il fusso magnetico Φ è generato da avvolgimenti collocati sul statore.
Si assumerà che lo statore abbia una sola terminazione polare, caratterizzata da una
induttanza Le associata al relativo avvolgimento e da una resistenza Re associata alle
dispersioni nel conduttore (vedi Figura 1.2). L’equazione che descrive questo circuito
elettrico è data da:
ve (t) = Le
die
+ Re ie
dt
(1.1.1)
Poichè la relazione (1.1.1) è lineare, trasformando le variabili nel dominio di Laplace,
si ottiene:
dove Ke =
1
Re
Ke
ie (s)
=
ve (s)
1 + τe s
(1.1.2)
Le
Re
è la costante di tempo di statore.
è il guadagno di statore e τe =
Analogamente, si assume che il rotore abbia una sola terminazione polare caratterizzata da una resistenza di armatura Ra (qualche ohm), da un induttanza di armatura
La (milliHenry, ininfluente a regime ma importante alla partenza e per i problemi
che causa). Inoltre, va considerato nel modello elettrico del rotore l’effetto della forza
6
§1.1 I motori DC
Cap. 1 Azionamento motore
controelettromotrice e(t), che corrisponde ad una differenza di tensione indotta(dallo
statore), proporzionale alla velocità di rotazione. L’equazione associata al relativo
circuito elettrico è:
va (t) = La
dia (t)
+ Ra ia (t) + e(t)
dt
(1.1.3)
con va (t) e ia (t) rispettivamente tensione e corrente di armatura. Nuovamente, poiché
la relazione (1.1.3) è lineare, trasformando nel dominio di Laplace si ottiene:
ia (s)
Ka
=
va (s) − e(s)
1 + τa s
dove Ka =
1
Ra
è il guadagno di rotore e τa =
La
Ra
(1.1.4)
è la costante di tempo di rotore. Sulla
base delle proprietà fisiche del motore e delle relazioni che caratterizzano l’interazione
tra le quantità meccaniche e le quantità elettriche del motore, si può dimostrare che le
due seguenti relazioni sussistono. Queste relazioni forniscono un’ espressione esplicita
della forza controelettromotrice e e della coppia meccanica cm erogata dal motore:
e = K · ie · ω = K e · ω
(1.1.5)
c m = K · ie · ia = K c · ia
(1.1.6)
con Ke e Kc due costanti, proprie del motore, dette costante elttrica e di coppia, e ω
velocità angolare.
Osservazione 1.1.1. Dalle equazioni precedentemente riportate si nota come la coppia motrice sia direttamente proporzionale alla corrente d’armatura. L’oggetto della
tesi sarà quello di controllare la corrente ia , in modo tale che una volta calcolata
sperimentalmente la costante di proporzionalità Kc sia possibile avere un controllo in
coppia.
7
§1.1 I motori DC
Cap. 1 Azionamento motore
1.1.2
Caratterizzazione del carico meccanico
Il comportamento del carico meccanico è praticamente sempre di tipo non lineare,
basti pensare all’ attrito di primo distacco e all’ insorgere di movimenti d’ aria che
producono coppie resistenti di valore dipendente dal quadrato della velocità; spesso,
però, si effettua una implicita o esplicita linearizzazione attorno ad un punto di lavoro
in modo da impiegare un modello del carico di tipo lineare. Il più generale modello
lineare del carico può venire ricavato eguagliando la coppia motrice cm alla somma di
tre termini:
• un termine che rappresenta una coppia di carico esercitata sull’asse del motore;
• un termine proporzionale alla velocità ω di rotazione del motore secondo un
coefficiente di attrito F, pari alla somma del coefficiente di attrito del motore e
di quello del carico, riportato all’ asse del motore;
• un termine proporzionale alla derivata della velocità di rotazione del motore
secondo un momento di inerzia J, pari alla somma del momento di inerzia del
motore e di quello del carico, riportato all’ asse del motore.
Si ottiene, quindi, la seguente equazione:
cm = cr + F ω + J
dω
dt
(1.1.7)
Analogamente al caso elettrico, anche per le equazioni meccaniche si puo associare
una funzione di trasferimento lineare alla relazione (1.1.7):
Km
ω(s)
=
cm (s) − cr (s)
1 + τm s
dove Km =
1
F
è il guadagno meccanico e τm =
J
F
(1.1.8)
è la costante di tempo meccanica. Si
vuole ora ottenere la relazione diretta tra posizione e tensione di armatura. Integrando
8
§1.2 Pilotaggio ON-OFF
Cap. 1 Azionamento motore
entrambi i membri dell’equazione 1.1.8, sotto l’ipotesi di carico nullo che agisce sul
motore, e inserendo l’equazione 1.1.7 si ottiene:
θ(s) =
Km
KT ia (s).
s(1 + τm s)
(1.1.9)
Infine, sostituendo la 1.1.4 e la 1.1.5, e isolando θ(s) si ha:
θ(s) =
1.2
Km Ka
va (s)
s(τm τa s2 + (τm + τa )s + Ke + 1)
(1.1.10)
Pilotaggio ON-OFF
I motori DC possono essere controllati in vari modi: il pilotaggio più semplice è quello
ON-OFF che permette di comandare il motore solo alla massima velocità di rotazione
in un verso (interruttore ON) oppure fermarlo (interruttore OFF): questo controllo
può essere implementato con un interruttore (es. un mos o un transistor) e con un
diodo di ricircolo necessario per evitare danni al resto del circuito (il motore è un
carico con una componente induttiva). Lo schema è quello di Figura 1.3. In questa
configurazione la potenza dissipata sul transistor (uguale al prodotto di corrente per
tensione ai suoi capi) è sempre minima e tutta l’energia prelevata dall’alimentazione
è effettivamente usata dal motore. Infatti:
• quando il transistor conduce, la tensione ai suoi capi è prossima a 0 volt mentre
quella ai capi del motore è praticamente pari alla Valim . Il motore quindi ruota
alla massima velocità;
• quando il transistor è aperto la corrente nel MOS è evidentemente nulla e quindi
nulla la potenza dissipata dal MOS (e anche fornita a motore).
Il limite di questa tecnica di pilotaggio è evidente: il motore è fermo oppure ruota
alla massima velocità. L’ avvolgimento del motore è sostanzialmente un induttore,
9
Cap. 1 Azionamento motore
§1.2 Pilotaggio ON-OFF
Figura 1.3: Pilotaggio ON-OFF: quando l’interruttore è aperto il motore è fermo,
quando è chiuso gira alla massima velocità. A destra un esempio di implementazione
cioè un oggetto che tende a mantenere costante la corrente che in esso scorre. Quando
il transistor rappresentato nello schema precedente si chiude, la corrente raggiunge
il valore a regime in un certo tempo, secondo una curva esponenziale dipendente da
parametri interni del motore. Questo fatto non causa, in prima approssimazione, particolari problemi. Quando un transistor si apre, la corrente istantaneamente dovrebbe
andare a zero; l’induttore tende però ad impedire questo repentina diminuzione e per
fare questo tende a far salire la tensione sul collettore del transistor (immaginate il
transistor che, improvvisamente, sia diventato una resistenza molto elevata in cui
l’induttore tenta di far passare una corrente: per la legge di ohm, la tensione deve
salire). La tensione arriva facilmente a centinaia di volt, danneggiando il transistor.
Per evitare questo fenomeno distruttivo viene inserito in parallelo alla bobina del motore un diodo che fornisce alla corrente una via alternativa a quella del transistor nel
momento in cui questo si apre. I diodi da utilizzare in queste applicazioni devono
10
Cap. 1 Azionamento motore
§1.3 Pilotaggio PWM
avere due caratteristiche fondamentali:
• Essere veloci, cioè essere capaci di passare in poco tempo dalla condizione di
non passaggio di corrente a quella di conduzione e viceversa. In genere sono
richiesti tempi di intervento dell’ordine delle decine di nanosecondi.
• Essere capaci di gestire correnti elevate in quanto al momento dello spegnimento
tutta la corrente del motore, in genere ampere, passa nei diodi.
1.3
Pilotaggio PWM
Figura 1.4: Pulse With Modulation
Un segnale PWM (Pulse Width Modulation, ovvero modulazione a variazione
di larghezza d’ impulso) è un’ onda quadra di duty cycle variabile che permette di
controllare l’ assorbimento (la potenza assorbita) di un carico elettrico (nel nostro
11
Cap. 1 Azionamento motore
§1.3 Pilotaggio PWM
caso il motore DC), variando (modulando) il duty cycle. Il duty cycle è il rapporto
tra il tempo in cui l’onda assume valore alto e il periodo T (l’inverso della frequenza:
T=1/f). Con riferimento in Figura 1.4, ne segue che un duty cycle del 50% corrisponde
ad un’ onda quadra che assume valore alto per il 50% del tempo, un duty cycle dell’80%
corrisponde ad un’ onda quadra che assume valore alto per l’80% del tempo e basso
per il restante 20%, un duty cycle del 100% corrisponde ad un segnale sempre alto
e un duty cycle dello 0% ad un segnale sempre basso. L’onda rettangolare in uscita
da questo stadio è il segnale con cui vengono effettivamente pilotati gli switch (MOSFET) del convertitore di potenza. Questa tecnica permette di modificare la velocità
pur assicurando un rendimento energetico elevato. Il circuito è lo stesso utilizzato
nel funzionamento ON-OFF, già descritto nel precedente paragrafo. L’ idea è però
quella di pilotare la base del transistor con un’ onda quadra: se la commutazione
è piuttosto frequente (qualche KHz), a causa del comportamento da induttore, la
corrente media è sostanzialmente costante e proporzionale al duty cycle del segnale
sulla base del MOS. Il grafico in Figura 1.5 mostra l’ andamento della corrente nel
motore applicando, nella prima metà, un’ onda quadra (quindi un duty cycle del
50%) e, nella seconda metà, un segnale rettangolare con duty cycle del 75%. Il grafico
è idealizzato e nell’ ipotesi di motore fermo (si noti la corrente iniziale nulla). Si
noti anche il caratteristico andamento ‘‘seghettato’’ ma sostanzialmente costante.
Un’ osservazione è relativa al fatto che non tutti i motori sono adatti al pilotaggio
PWM, soprattutto alla frequenze più elevate: infatti la perdita nei circuiti magnetici
è proporzionale alla frequenza e potrebbe divenire inaccettabile, soprattutto se la
frequenza di pilotaggio supera la decina di KHz. Anche il transistor, se inadatto all’
applicazione o mal pilotato, può presentare surriscaldamenti a frequenza superiori
alla decina di KHz. Tra i molti vantaggi che si ottengono con l’ utilizzo di tecniche
12
Cap. 1 Azionamento motore
§1.4 Il ponte ad H
Figura 1.5: Andamento della corrente del motore sotto l’ azione dei una PWM
variabile
PWM, il più importante è che le perdite di potenza rimangono estremamente basse
se confrontate con l’ entità della potenza in uscita, inoltre il segnale PWM, proprio
per la sua natura digitale è facilmente manipolabile (è un’operazione relativamente
semplice variare la durata degli impulsi di un onda rettangolare).
1.4
Il ponte ad H
Il tipo di controllo appena presentato non permette di far girare il motore in entrambi
i versi di rotazione. Per far girare il motore nel verso opposto è necessario infatti
invertire il segno della corrente che passa all’ interno del motore stesso. Per far ciò si
usa un circuito chiamato ponte H costituito da 4 interruttori comandati e da 4 diodi di
ricircolo, il cui schema è rappresentato in Figura 1.6. Il nome deriva dalla somiglianza
del circuito alla lettera maiuscola H, dove il motore costituisce il segmento orizzontale
ed i quattro transistor i quattro segmenti verticali. Lo schema mostra come i quattro
13
§1.4 Il ponte ad H
Cap. 1 Azionamento motore
Figura 1.6: Schema ponte H
transistor sono connessi. In genere i due transistor inferiori sono detti di sink in
quanto assorbono la corrente proveniente da motore oppure low side switch; i due
transistor connessi direttamente alla Vcc sono detti di source oppure high side switch.
A seconda di quali transistor sono attivi, abbiamo diversi possibili percorsi per la
Figura 1.7: Funzionamento ponte H
corrente, illustrati nell’ immagine in Figura 1.7:
• (linea verde) Se è attivo un transistor di sink ed uno di source appartenenti
a lati opposti del ponte, abbiano passaggio di corrente nel motore. In questo
14
Cap. 1 Azionamento motore
§1.4 Il ponte ad H
caso il motore è in rotazione in un verso; per ottenere la rotazione opposta è
evidentemente necessario attivare la coppia simmetrica.
• (linea rossa) Se è attivo un transistor di sink ed uno di source appartenenti
allo stesso lato del ponte abbiamo un corto circuito. Inutile dire che questa
situazione deve essere evitata nel modo più assoluto in quanto porterebbe alla
distruzione del ponte o dell’ alimentazione in tempi brevissimi.
• (linea blu) Se tutti i transistor sono spenti non abbiamo maglie in cui possa
passare la corrente fornita dall’ alimentatore. Quella indicata è la via che l’
eventuale corrente accumulata dall’ induttore percorre: si tratta ovviamente
di un fenomeno temporaneo ma che deve necessariamente essere previsto per
quanto già illustrato. Terminata la scarica dell’ induttore non si ha più passaggio
di corrente e se il motore era precedentemente in moto si arresta lentamente a
causa degli attriti meccanici.
• (linea gialla) Se è attivo almeno uno dei transistor di source e nessuno di quelli
di sink non vi sono percorsi in cui passa la corrente fornita dall’ alimentatore.
La differenza rispetto alla situazione precedente è il sostanziale cortocircuito che
si viene a creare ai capi del motore: infatti la tensione ai capi del motore è pari
alla tensione diretta del diodo sommata a quella di conduzione del transistor.
L’ effetto è una vigorosa azione frenante causata dalla presenza del generatore
equivalente e già citato a proposito delle equazioni di funzionamento e dalla
conseguente corrente generata dal motore.
15
Capitolo 2
Realizzazione hardware
Questo capitolo riguarda il dimensionameto dei componenti per la
realizzazione del circuito elettrico di potenza per il pilotaggio motore, dopodiché verrano introdotti i sensori utilizzati per l’ aquisizione
delle grandezze da controllare: posizione e intensità di corrente.
2.1
L298N: specifiche tecniche
Esistono due tipi di ponti H: i ponti H discreti, costituiti da componenti sparsi come
transistor e diodi e i ponti H integrati, in questo caso tutto il circuito è racchiuso in un
package plastico di tipo DIP (dual in-line package) o simile. I ponti H integrati sono
molto versatili e, oltre a garantire una bassa occupazione di area nel circuito (in alcuni
casi, come il SN754410 e l’ L293D, contengono anche i diodi di ricircolo), hanno buone
prestazioni (l’ L298 può fornire fino a 2 A per ponte), possono essere essere montati
in parallelo per ottenere alte correnti e riescono a lavorare in un intervallo di tensioni
di alimentazione molto ampio (da 6 V a 48 V circa a seconda del modello). In Figura
2.1 si riporta la piedinatura del ponte H scelto per il progetto, ossia L298N, seguita
da una tabella che indica i massimi valori supportati dai pin. Altre informazioni utili
sono disponibili nel datasheet.
16
Cap. 2 Realizzazione hardware
§2.1 L298N: specifiche tecniche
Figura 2.1: L298N: pin connections (top view)
Symbol
VS
VSS
VI ,VEN
IO
Vsens
Ptot
Top
Tstg ,Tj
Parameter
Power Supply
Logic Supply Voltage
Input and Enable Voltage
Peak Output Current (each Channel)
Non Repetitive (t = 100ms)
Repetitive (80% on 20% off; ton = 10ms)
DC Operation
Sensing Voltage
Total Power Dissipation (Tcase = 75◦ C)
Junction Operating Temperature
Storage and Junction Temperature
Value
50 V
7V
-0.3 to 7 v
3A
2.5 A
2A
1 to 2.3 V
25 W
-25 to 130 ◦ C
-40 to 150 ◦ C
La figura 2.2 rappresenta lo schema di funzionamento di un ponte integrato. Tale
integrato è costituito da quattro mezzi ponti H (numerati in figura come 1-2-3-4)
ognuno dei quali è costituito da due transistor e da una logica che li comanda in
modo da accenderne solo uno alla volta: quando il transistor superiore di un mezzo
17
Cap. 2 Realizzazione hardware
§2.1 L298N: specifiche tecniche
Figura 2.2: Shema di funzionamento interno di un ponte H
ponte è in conduzione quello inferiore sarà necessariamente spento e viceversa. E’
inoltre presente un comando di ENABLE che permette di inibire il funzionamento
di una coppia di mezzi ponti. Si può inoltre notare la presenza di due pin dedicati
alla connessione di una resistenza di Sense per monitorare la corrente che scorre nel
motore (utile per controllare l’ assorbimento di corrente ed evitare rischiosi stalli del
motore). Ricapitolando, per ognuno dei due ponti presenti nell’ integrato abbiamo
a disposizione due ingressi di controllo per permettere il passaggio di corrente in un
verso e un ingresso di ENABLE per accendere e spegnere il ponte. Nella tabella
seguente si riportano le funzioni dei vari pin.
18
§2.1 L298N: specifiche tecniche
Cap. 2 Realizzazione hardware
Pin
1;15
Name
Sense A;Sense B
2;3
Out 1;Out 2
4
VS
5;7
Input 1;Input 2
6;11
Enable A;Enable
B
8
9
GND
VSS
10;12
Input 3;Input 4
13;14
Out 3;Out 4
2.1.1
Function
Tra questo pin e la terra è connesso il resistore(posto in
serie al carico) che permetterà di controllare la corrente che
attraversa il motore.
Uscita del ponte A; la corrente che fluisce attraverso questi
due pin è monitorata dal pin 1.
Tensione di alimentazione per lo stadio di potenza in uscita. Un condensatore non induttivo di 100 nF deve essere
collegato tra questo pin e la terra(per scaricare frequenze
rumorose).
Ingressi del ponte A compatibili con logica TTL(TransistorTransistot Logic).
Ingresso Enable compatibile con logia TTL(TransistorTransistot Logic): lo stato LOW disabilita il ponte A(enable
A) e/o il ponte B(enable B).
Ground(Terra).
Tensione di alimentazione per i blocchi logici. Un condensatore non induttivo di 100 nF deve essere collegato tra questo
pin e la terra(per scaricare frequenze rumorose).
Ingressi del ponte B compatibili con logica TTL(TransistorTransistot Logic).
Uscita del ponte B; la corrente che fluisce attraverso questi
due pin è monitorata dal pin 15.
Dimensionamento Rsense
Il resistore Rsense ha la funzione di assorbire la stessa corrente che fluisce nel motore(essendo posta in serie ad esso), permettendo cosı̀ di essere controllata. Infatti
è possibile misurare la tensione ai capi di tale resistore, e di conseguenza ricavare
tramite la legge di Ohm (Vsense = Rsense · I) il valore della corrente che vi fluisce istantaneamente, con Vsense e Rsense noti. Il valore di Rsense deve essere piccolo in modo
tale da essere molto piccola la tensione ai suoi capi: infatti tale deve essere l’ entità
della tensione di alimentazione sottratta al motore, per non influire sulla risposta del
sistema. Inoltre bisogna assicurarsi di non superare il valore di potenza dissipata consigliato nel datasheet del resistore. E’ necessario quindi conoscere il valore di corrente
19
Cap. 2 Realizzazione hardware
§2.2 Acquisizione dati: misura di Vsense
massima che vi fluisce attraverso. Per far ciò sono stati fatti test sperimentali atti a
mettere sotto stress il motore che è stato preso in considerazione: si è alimentato il
motore con tensione variabile nel tempo, con picchi estremi in modulo(facendo però
attenzione a non superare il limite sopportabile dal motore dichiarato nel datasheet),
applicando un carico variabile(semplicemente creando attrito con la mano sul carico).
Il valore di corrente erogata può essere letto direttamente sul display del regolatore
di tensione da laboratorio. In conclusione, al valore massimo di corrente misurata si
è aggiunto un offset di sicurezza, ottenendo cosı̀ il valore approssimato Imax = 1 A.
Considerando il materiale a disposizione in laboratorio si è optato per un resistore con
valore di resistenza pari a 0.22Ω, capace di dissipare una potenza di 0.5 W. In condi2
zioni estreme su questo resistore si dissiperà una potenza di P = Rsense · Imax
= 0.22
W, ben al di sotto del limite fisico di 0.5 W, e ai suoi capi ci sarà una tensione massima
accettabile Vsense = Rsense · Imax = 0.22 V.
2.2
Acquisizione dati: misura di Vsense
La tensione Vsense è generalmente dell’ ordine delle decine di millivolts, quindi troppo
piccola per essere misurata direttamene da un microcontrollore. In genere i pin di
questi dispositivi (vedi cap.2 sez.1) hanno una risoluzione di 10 bit e riceveno in
ingresso una tensione massima di 5 V, ottenendo perciò una quantizzazione con passi
di
5
1024
= 0.00488 V, decisamente troppo grandi rispetto alle variazione della Vsense .
Una possibile soluzione a questo problema è stata suggerita nell’ Osservazione 3.1.1.
Tuttavia, per mantenere un approccio più generale, la soluzione adottata nel progetto
è quella di applicare un amplificatore operazionale per amplificare il valore di Vsense
all’ ordine dei volt, in modo tale da rendere la quantizzazione accettabile. Assumendo
che i pin analogici del microcontrollore accettano un valore massimo di tensione pari
20
§2.2 Acquisizione dati: misura di Vsense
Cap. 2 Realizzazione hardware
a Vmax = 5 V, essendo Imax = 1 A e Rsense = 0.22Ω, il valore di amplificazione Av
ottimo sarà dato dalla seguente equazione:
Vmax = Av · Rsense · Imax
(2.2.1)
da cui, isolando Av e sostituendo i valori numerici si ottiene Av = 22.7272 ≈ 23.
2.2.1
Amplificatore operazionale
Figura 2.3: Amplificatore operazionale
L’ amplificatore operazionale (in inglese operational amplifier oppure op-amp) è l’
elemento più utilizzato dell’ elettronica analogica; è alla base degli amplificatori per
strumentazione, dei filtri e di una miriade di sistemi di analisi e processamento dei
dati analogici e digitali. Nello schema di amplificatore operazionale di Figura 2.3, eA
ed eB sono le tensioni di ingresso, iA e iB vengono chiamate correnti di bias, ZD è
l’impedenza differenziale di ingresso, A è il guadagno in anello aperto (amplificazione), ZO è l’ impedenza di uscita, VOS è la tensione di offset e ±VS sono le tensioni di
alimentazione. Per descrivere il funzionamento di base del dispositivo che utilizza l’
21
Cap. 2 Realizzazione hardware
§2.2 Acquisizione dati: misura di Vsense
Figura 2.4: TLC272: top view
amplificatore operazionale, si fa riferimento a un modello ideale che trascura alcune
caratteristiche reali a vantaggio delle semplificazioni matematiche. Le caratteristica
ideali e reali vengono confrontate come segue:
Caratteristica
Valore ideale
Guadagno in anello aperto A
∞
Tensione di offset VOS
0
Correnti di bias iA ,iB
0
Impedenza di ingresso ZD
∞
Impedenza di uscita ZO
0
Valore reale tipico
100000
±1mV a 25◦ C
da 10−6 a 10−14 A
da 105 a 1011 Ω
da 1 a 10 Ω
Il modello semplificato di amplificatore assume i valori ideali per tutti i parametri,
inoltre ipotizza che la risposta sia istantanea. Il fatto che la resistenza d’ ingresso sia
infinita implica che l’amplificatore non assorbe corrente da nessuno dei due terminali
d’ ingresso. Inoltre, il fatto che la resistenza d’ ingresso sia infinita e quella di uscita nulla fa sı̀ che un amplificatore operazionale ideale sia un perfetto amplificatore
di tensione. In Figura 2.4 è riportato lo schema elettrico del dispositivo integrato
utilizzato come amplificatore operazionale: TLC272; in particolare questo dispositivo integra due amplificatori operazionali e, come si vede dalla caratteristiche del
datasheet, approssima bene il comportamento ideale precedentemente descritto.
22
§2.2 Acquisizione dati: misura di Vsense
Cap. 2 Realizzazione hardware
2.2.2
Configurazione non invertente
Figura 2.5: Configurazione non invertente
L’ ipotesi di comportamento ideale rende relativamente semplice l’ analisi di circuiti che contengono amplificatori operazionali. Quando si desidera realizzare un’
amplificazione di tensione, si ricorre alle configurazioni di base invertente e non invertente: la prima sfasa di 180 gradi la tensione in uscita rispetto a quella in ingresso,
mentre la seconda no. La configurazione scelta nel progetto è quella non invertente,
in quanto tale configurazione richiede un solo terminale di alimentazione positiva per
l’ amplificatore, a differenza dell’ altra configurazione che richiede due alimentazioni
duali rispetto alla massa. Seguendo la Figura 2.5 è possibile ricavare le equazioni
caratteristiche del circuito:
Vo = RF · IF + Vin
(2.2.2)
e sostituendo
IF =
Vin
RE
(2.2.3)
23
§2.2 Acquisizione dati: misura di Vsense
Cap. 2 Realizzazione hardware
si ottiene
RF
) · Vin
RE
RF
Vo
=1+
Av =
Vin
RE
Vo = (1 +
(2.2.4)
(2.2.5)
Scelta arbitrariamente RE = 2kΩ, e la resistenza di feedback pari a RF = 47kΩ, si
ottiene Av = 23.5, valore compatibile con quello trovato nell’ equazione 2.2.1. La
resistenza RB ≈ RE ||RF ha il compito di minimizzare la tensione di offset VOS per gli
operazionali a base di BJT, mentre per i FET tale resistenza può essere in generale
omessa, a meno che RE e RF non siano dell’ordine dei MΩ.
2.2.3
Configurazione con filtro attivo
Uno dei problemi più importanti da considerare nell’acquisizione di un segnale è il
rapporto segnale/rumore. Essendo impossibile eliminare totalmente il rumore, diventa
importante filtrare il segnale in modo da rendere minimo il disturbo in confronto
con il segnale utile. La configurazione non invertente precedentemente descritta può
essere modificata aggiungendo un condensatore in parallelo alla resistenza di feedback,
come mostrato in Figura 2.6 a, il quale ha il compito di filtrare il rumore sopra una
determinata frequenza di soglia. Questo circuito ha una risposta in frequenza che non
è quella di un comune passa-basso passivo, ma comunque presenta un limite superiore
e quindi può, qualora interessi solo limitare la banda passante, produrre lo stesso
effetto. Intuitivamente il diagramma del modulo può essere compreso osservando che,
al crescere della frequenza, C2 tende a cortocircuitare R2 portando il guadagno a un
valore unitario. Più rigorosamente la funzione di trasferimento risulta:
Vo (s)
R1 + Z2 (s)
F (s) =
=
=
Vi (s)
R1
R1 +
1
1
+sC2
R2
R1
=
R1 + R2 + sR1 R2 C2
R1 (1 + sR2 C2 )
(2.2.6)
Questa funzione di trasferimento presenta un polo e uno zero esattamente come indi24
§2.2 Acquisizione dati: misura di Vsense
Cap. 2 Realizzazione hardware
Figura 2.6:
Possibile modalità di limitazione superiore della banda nella
configurazione non invertente
cato in Figura 2.6 b. Si noti come lo zero corrisponda al valore del polo moltiplicato
per il guadagno in centro banda e che, pertanto, se il guadagno è abbastanza elevato
(maggiore di 10), si può ritenere che lo zero non interferisca con il polo nella determinazione della frequenza a 3 dB e che quindi in queste condizioni si può supporre la
frequenza di taglio determinata solo dal polo ovvero:
ft =
1
.
2πR2 C2
(2.2.7)
Per determinare la frequenza del disturbo si è dato in ingresso al ponte H un valore
di PWM nullo e, misurando direttamente il segnale di uscita con un oscilloscopio, si
è rilevata la presenza di un segnale decisamente non desiderato, con il corrispettivo
valore di frequenza minima di fd = 350 Hz. Considerando che la frequenza di taglio va
presa almeno una decade prima della frequenza del disturbo, e sostituendo ft = 35 Hz
nell’equazione 3.2.8, si può calcolare la capacità del condensatore pari a C2 ≈ 0.1µF .
Il filtro impostato con i valori precedentemente calcolati ha reso il segnale in uscita
25
Cap. 2 Realizzazione hardware
§2.3 Acquisizione dati: posizione e verso di rotazione
molto più pulito, mantenendo comunque un tempo di ritardo ridotto nelle variazioni.
2.3
Acquisizione dati: posizione e verso di rotazione
Per ottenere un controllo in posizione e in velocità del motore, è necessario conoscere
la posizione angolare istantanea del rotore. L’ encoder incrementale è un tipo di
sensore che permette di ottenere queste informazioni. Tuttavia sono diffusi molti tipi
di encoder, detti tachimetrici, che permettono la sola misura della posizione mentre
non sono in grado di misurarne il verso di rotazione. Per questo tipo di encoder è
stato quindi necessario realizzare un apposito circuito in grado di ricavare il verso
di rotazione dalla misura della differenza di potenziale ai capi del motore. La sua
descrizione segue quella del funzionamento dell’encoder incrementale.
2.3.1
Encoder tachimetrico
Il trasduttore di posizione angolare, comunemente noto in ingegneria elettronica come
encoder, è un dispositivo elettromeccanico che converte la posizione angolare del suo
asse rotante in segnali elettrici numerici digitali. Negli encoder tachimetrici una traccia a tacche bianco-nere è fissata sull’ oggetto di cui si vuole misurare lo spostamento;
ogni volta che c’è un passaggio scuro-chiaro, un sensore ad effetto di Hall la rileva
ed invia un impulso che viene registrato da un contatore elettronico. La distanza
misurata è proporzionale al numero n di impulsi misurati dal contatore. Il numero
di impulsi contati nell’ unità di tempo è proporzionale alla velocità rilevata durante
lo spostamento; per questo l’ encoder è detto tachimetrico. In Figura 2.7 è riportato
lo schema di collegamento. Collegando una resistenza di pull-up da 10kΩ all’ uscita
26
Cap. 2 Realizzazione hardware
§2.3 Acquisizione dati: posizione e verso di rotazione
Figura 2.7: Collegamenti encoder
dell’ encoder, è possibile leggere gli impulsi con un microcontrollore e determinare la
velocità di rotazione del motore, oppure la distanza percorsa.
2.3.2
Verso di rotazione
Per ricavare il verso di rotazione del motore è sufficiente misurare la differenza di
potenziale ai capi di esso: il motore girerà in un verso o nell’ altro se questa sarà
positiva o negativa. E’ quindi necessario interfacciare la tensione da misurare con
il microcontrollore, il quale può ricevere in ingresso tensioni massime di 5 V. Un
amplificatore differenziale è adatto a tale scopo. In figura 2.8 è descritto il suo funzionamento: grazie all’ elevato guadagno di tensione disponibile, la caratteristica statica
ingresso/uscita dell’amplificatore operazionale presenta un intervallo di funzionamento lineare estremamente ridotto della tensione (differenziale) di ingresso, tipicamente
27
Cap. 2 Realizzazione hardware
§2.3 Acquisizione dati: posizione e verso di rotazione
Figura 2.8: Amplificatore differenziale
inferiore ad 1 mV. In altri termini, l’amplificatore restituisce in uscita la massima
tensione di alimentazione disponibile se l’ ingresso al nodo non invertente è superiore
a quello del nodo invertente; viceversa restituisce in uscita il valore dell’ alimentazione
inferiore. Il valore assunto dall’ uscita ci consente cosı̀ di stabilire se V+ è maggiore o minore di V− , l’amp.op. in questa configurazione esegue un confronto tra due
tensioni e si comporta come amplificatore della differenza tra due tensioni: da qui la
denominazione di amplificatore differenziale.
28
Capitolo 3
Realizzazione software
Dopo una breve introduzione sul microprocessore utilizzato per l’azionamento, verrà commentato il codice del programma e infine si discuteranno le tecniche di identificazione della funzione di
trasferimento del motore.
3.1
Arduino Duemilanove
Arduino è una piattaforma di prototipazione elettronica open-source che si basa su
hardware e software flessibili e facili da usare. Arduino è basato su una semplicissima
scheda di I/O e su un ambiente di sviluppo, che per la scrittura usa programmi in C e
C++ da far girare sulla scheda il cui microprocessore è programmabile utilizzando un
ambiente di sviluppo basato su Processing (linguaggio simil-C). Arduino è in grado
di comunicare con l’ ambiente in cui si trova attraverso una moltitudine di sensori
analogici e digitali azionando contemporaneamente luci, motori e qualsiasi altro tipo
di attuatore; può essere utilizzato per l’implementazione di progetti stand-alone ma
può anche interagire con software già esistenti sul computer. Arduino duemilanove è
la versione utilizzata nel progetto. Questo dispositivo, è basato sul microcontrollore
ATmega168 capace di 14 pin digitali di ingresso/uscita (6 dei quali utilizzabili come
uscita di un segnale Pulse With Modulation), 6 pin analogici in ingresso, 1 connessione
USB, un oscillatore a cristalli con frequenza di 16 MHz, un jack di alimentazione, e un
29
§3.1 Arduino Duemilanove
Cap. 3 Realizzazione software
Figura 3.1: Arduino duemilanove
tasto di reset. Di seguito si riporta un breve sommario delle caratteristiche tecniche
dell’Arduino.
Parametro
Microcontroller
Operating Voltage
Input Voltage(recommended)
Input Voltage(limits)
Digital I/O Pins
Analog Input Pins
DC Current per I/O Pin
DC Current for 3.3V Pin
Flash Memory
SRAM
EEPROM
Clock Speed
3.1.1
Valori di riferimento
ATmega168
5V
7-12V
6-20V
14 (of which 6 provide PWM output)
6
40 mA
50 mA
16 KB
1 KB
512 bytes
16 MHz
Linguaggio di programmazione
I microcontrollori Arduino possono essere programmati in un linguaggio basato su
C/C++, in un ambiente grafico sviluppato in Processing, utilizzando apposite librerie
30
Cap. 3 Realizzazione software
§3.1 Arduino Duemilanove
per la gestione dei segnali digitali ed analogici. Il linguaggio si compone di:
• Strutture (setup,loop,if,else,while,.....)
• Dati (variabili, costanti...)
• Funzioni
Le due strutture principali sono:
• Setup(): in seguito al boot, il microcontrollore esegue questa funzione in cui
vengono definite le istruzione per il setup quali configurazione dei pin, della
porta seriale... .
• Loop(): definisce il ciclo di istruzioni che il microcontrollore esegue fino al suo
reset o spegnimento.
Le funzioni pricipali utilizzate sono:
• P inM ode(pin, mode): definisce un determinato pin come OUTPUT o INPUT;
• AnalogRead(pin): legge il valore da un determinato pin analogico. Tale funzione
mappa il valore in ingresso compreso tra 0 e 5 V in uno quantizzato e intero
compreso tra 0 e 1024 unità;
• AnalogW rite(pin, value): dopo la chiamata della funzione, il pin genera un’
onda quadra stabile(PWM) di duty cicle definito fino alla prossima chiamata di
AnalogWrite(),DigitalWrite() o DigitalRead() sullo stesso pin. Questa funzione
lavora sui pin 3,5,6,9,10 e 11;
• DigitalRead(pin): legge il valore digitale da un pin digitale, HIGH o LOW;
31
Cap. 3 Realizzazione software
§3.1 Arduino Duemilanove
• DigitalW rite(): scrive HIGH o LOW in un pin digitale;
• millis(): restituisce il numero di millisecondi trascorsi dall’ inizio del corrente
programma;
• constrain(value, inf, sup): pone inf e sup come estremi di value;
• attachInterrupt(interrupt, f unction, mode): specifica una determinata funzione da chiamare ogni qual volta occorre un interrupt esterno. L’ interrupt 0 si
riferisce al pin 2, l’ interrupt 1 al pin 3.
Osservazione 3.1.1. In alcuni casi, ove il valore massimo di tensione del segnale
da misurare è inferiore ai 5V, è possibile utilizzare il pin AREF della scheda per
impostare il valore massimo di tensione. E’ consigliato collegare il voltaggio esterno
di riferimento al pin AREF tramite una resistenza di 5 Kohm ed un capacitore per
il filtraggio. Utilità: se quantizziamo un segnale analogico in 1024 valori tra 0V e
5V si ottiene una quantizzazione (alla massima risoluzione di 10bit) pari a 5/1024
V. Se tuttavia sappiamo che il segnale da digitalizzare non supera i 2V, possiamo
applicare 2V al pin AREF, utilizzare la funzione analogReference(type2), ed ottenere
una quantizzazione più fine, 2/1024 V, e quindi una precisione maggiore.
X
Osservazione 3.1.2. La funzione constrain(value, inf, sup) rappresenta un tipo di
non linearità nota come saturazione. Causa della saturazione è il limite fisico del
dispositivo, oltre il quale non è possibile raggiungere i valori desiderati. Nel caso
del motore DC il limite fisico è imposto da un valore di duty cicle pari a 255, che
corrisponde alla massima tensione di alimentazione. La saturazione è un fenomeno
che bisogna prendere in considerazione nella sintesi di regolatori per la stabilità del
sistema.
X
32
Cap. 3 Realizzazione software
3.1.2
§3.1 Arduino Duemilanove
Impostare la frequenza PWM
L’ATmega168 ha tre Timer noti come Timer 0,Timer 1,e Timer 2. I pin che gestiscono
la PWM sono raggruppati in base al Timer che li controlla e quindi dalla frequenza
fissa che possono generare:
• pin 5, 6: sono controllati dal Timer 0 e generano una frequenza di default di
976.5625 Hz;
• pin 9, 10: sono controllati dal Timer 1 e generano una frequenza di default di
488.28125 Hz;
• pin 3, 11: sono controllati dal Timer 2 e generano una frequenza di default di
976.5625 Hz.
Il valore della frequenza può essere impostato tramite la funzione, creata appositamente, setP W M F requency(pin, divisor) che va a modificare il timer clock dividendo
il clock di sistema per un fattore di scala predefinito. Arduino ha un clock di sistema
di 16 MHz e la frequenza del timer clock sarà uguale a quella del clock di sistema
diviso il fattore di scala. In particolare la frequenza viene settata nel seguente modo:
Pins 5 and 6: controlled by Timer 0
Setting
0x01
0x02
0x03
0x04
0x05
Divisor
1
8
64
256
1024
Frequency
62500
7812.5
976.5625
244.140625
61.03515625
TCCR0B = TCCR0B 0b11111000 | <setting>;
33
Cap. 3 Realizzazione software
§3.1 Arduino Duemilanove
Pins 9 and 10: controlled by Timer 1
Setting
0x01
0x02
0x03
0x04
0x05
Divisor
1
8
64
256
1024
Frequency
31250
3906.25
488.28125
122.0703125
30.517578125
TCCR1B = TCCR1B 0b11111000 | <setting>;
Pins 1 and 3: controlled by Timer 2
Setting
0x01
0x02
0x03
0x04
0x05
Divisor
1
8
64
256
1024
Frequency
31250
3906.25
488.28125
122.0703125
30.517578125
TCCR2B = TCCR2B 0b11111000 | <setting>.
Osservazione 3.1.3. Arduino utilizza internamente il Timer 0 per le funzioni millis()
e delay(), quindi bisogna fare attenzione al fatto che cambiare la frequenza di questo
timer causerà un risultato diverso per queste funzioni. Nel progetto questo problema
è stato sviato utilizzando un pin legato al Timer 1 per il segnale PWM.
3.1.3
X
Procedura di azionamento
Il programma utilizzato in Arduino per l’ azionamento del motore sarà oggetto di
questo paragrafo. Il corrispettivo codice di programmazione è riportato in Appendice
B. Esso è strutturato nella maniera seguente:
1. una parte di inizializzazione che si svolge nella struttura setup() di Arduino,
quindi eseguita una sola volta all’inizio dell’esecuzione del programma;
34
Cap. 3 Realizzazione software
§3.1 Arduino Duemilanove
2. una serie di prove sperimentali di azionamento e la misura delle corrispettive
uscite, atte ad essere successivamente elaborate da MatLab per catturare il
comportamento dinamico del motore;
3. l’ invio degli ingressi e delle uscite al MatLab.
Il ciclo infinito è strutturato in modo tale che l’azionamento e le conseguenti misure
delle uscite avvengano ogni Ts = 3 millisecondi, con Ts tempo di campionamento,
altrimenti il microprocessore rimane in idle fino al trascorrere di tale tempo. Le prove
sperimentali includono una serie di ingressi a gradino, rampe e sinusoidi. Le funzioni
maggiormente utilizzate sono (in ordine di apparizione):
• setup motors(): inizializza i vari pin come INPUT o OUTPUT;
• doEncoder1(): questa funzione viene richiamata ogni qualvolta giunge un interrupt al digital pin 3, dove l’ interrupt corrisponde all’onda quadra proveniente dall’ encoder: ad ogni interrupt la funzione provvede ad incrementare o
decrementare (confrontando il sensore di verso di rotazione) un contatore che
rappresenta la posizione angolare del motore in passi encoder;
• establishContact(): viene eseguita una sola volta nel setup(), ha lo scopo di
bloccare l’ inizio del loop() fino all’ esecuzione della procedura MatLab (descritta
più avanti) con cui avviene la comunicazione;
• move motor(motor, verse, value): gestice il movimento del motore, dove motor
vale 2 per il motore attualmente collegato, verse vale 1 o 2 in base alla direzione
desiderata, e value è il valore in duty cicle del segnale pwm che alimenterà il
motore;
35
Cap. 3 Realizzazione software
§3.2 Identificazione
• sendM essage(V sense, u, encoder, stop): quando chiamata invia al MatLab tramite porta seriale l’ingresso u, le uscite encoder e V sense misurate, e il segnale
stop di comunicazione interrotta.
La prova di azionamento è atta a rendere visibile il comportamento dinamico del
motore per la successiva procedura di identificazione: la prova è costituita da due
segnali a gradino, un segnale sinusoidale e una rampa; l’intera procedura è stata
inoltre ripetuta tre volte.
3.2
Identificazione
L’ identificazione dei sistemi è una scienza che si occupa di stimare i modelli matematici dei sistemi a partire da prove sperimentali. Per la stima di un modello dinamico
di un sistema, occorre quindi eccitarlo e disporre sia degli ingressi di eccitazione sia
delle uscite misurate. Esistone tre tipi di approccio possibili all’ identificazione:
• white box: il modello del sistema viene ricavato tramite leggi fisiche;
• grey box: il modello del sistema è noto, ma non si conoscono alcuni parametri
che devono quindi essere stimati;
• black box: non conosciamo nulla del sistema per il quale stimeremo sia la
struttura che i parametri.
Poichè il modello grey-box prevede una inizializzione dei parametri da stimare (ed
essendo questi sconosciuti), si è preferito seguire un approccio black box. L’ algoritmo utilizzato per la stima della funzione di trasferimento ingresso-uscita è il
P EM (Prediction Error Method): l’ idea sta nel costruire, a partire dalla struttura
di modello scelta (secondo particolari criteri), un predittore ovvero un sistema che
36
Cap. 3 Realizzazione software
§3.2 Identificazione
Figura 3.2: I processi da identificare
date le uscite e gli ingressi passati dà una stima dell’ uscita presente. Il PEM stima
i parametri cercati minimizzando gli errori di predizione, ovvero minimizzando un
funzionale di costo dipendente da questi errori che a loro volta sono funzione dei parametri incogniti e delle misure. In Figura 3.2 è riportato uno schema dei tre sistemi
che si vogliono identificare: il processo è costituito dal motore DC accoppiato all’amplificatore che lo alimenta, l’ ingresso è costituito dal valore di duty cicle del segnale
pwm, e l’ uscita è rappresentata rispettivamente dalla posizione angolare (in passi
encoder), dalla velocità angolare (in encoder al secondo) e dalla corrente di armatura
(in ampere).
37
Cap. 3 Realizzazione software
§3.2 Identificazione
Figura 3.3: a) Modello con dead zone b) Modello senza dead zone
3.2.1
Il problema della Dead Zone
La dead zone (o banda morta), è una banda di valori per l’ ingresso all’ interno della
quale si ha un appiattimento dell’uscita. Nel caso specifico dell’azionamento motore,
se si considera l’ ingresso v ∈ [0, 255] come valore di duty cicle della pwm, si ha che
per valori compresi tra 0 e 139 non si innesca il movimento del rotore (vedi Figura
3.3 a). La spiegazione fisica di tale comportamento è da ricercare nella coppia che il
motore deve esercitare per superare le forze di attrito statiche. Questo tipo di forze
possono essere divise essenzialmete in due grandi categorie: attrito statico o radente
(cr nell’equazione 1.1.7), che richiede una coppia costante per essere superata (causa
di dead zone), e attrito dinamico o viscoso (F ω nell’ equazione 1.1.7), che offre una
resistenza al variare della velocità. L’ attrito statico, oltre ad essere causa di dead
38
§3.2 Identificazione
Cap. 3 Realizzazione software
50
100
150
200
250
300
350
50
100
150
200
250
300
350
400
450
Figura 3.4: Modello di attrito
zone, riduce anche la coppia utile del motore. La non linearità dovuta alla dead zone
rende molto complicata la stima di un modello lineare per la posizione e velocità
angolare. In ragione di ciò, si è considerato un secondo ingresso u ∈ [0, 116] tale
che v = u + deadzone, in modo tale da cancellare la dead zone nel nuovo sistema
con ingresso u e uscita ω (Figura 3.3 b). Nel caso di uscita in corrente, invece, anche
l’attrito dinamico è causa di non linearità: in generale l’attrito è funzione della velocità
angolare secondo il grafico in Figura 3.4, ed è necessario conoscere i parametri di tale
curva per poter implementare una compensazione.
3.2.2
Stima della velocità angolare
Per ottenere una stima della velocità angolare è sufficiente applicare un filtro derivativo alla funzione di trasferimento della posizione. Il filtro è stato sintetizzato nel
dominio di Laplace, per poi essere discretizzato tramite il comando c2d(f iltro, T s
39
§3.2 Identificazione
Cap. 3 Realizzazione software
di MatLab. E’ noto che in Laplace l’operatore derivata corrisponde a moltiplicare
per s la f.d.t. della posizione, ma è altrettanto noto che un filtro cosı̀ fatto sarebbe
fisicamente non realizzabile. E’ necessario aggiungere un polo ‘veloce’, cioè facendo
riferimento all’equazione
s
τs + 1
(3.2.1)
con τ sufficientemente piccolo da poter ottenere una buona approssimazione del filtro
puramente derivativo. Dopo varie prove si è scelto un valore di τ pari a 0.04. Dopo
la discretizzazione il risultato ottenuto è
25(z − 1)
z − 0.9277
3.2.3
(3.2.2)
System Identification Toolbox
La procedura di identificazione è stata implementata in MatLab tramite le librerie
del System Identification Toolbox. Il codice matlab (riportato in Appendice C) è
strutturato in quattro parti:
1. acquisizione degli ingressi e delle uscite misurate da Arduino attraverso comunicazione seriale;
2. filtraggio dei segnali e preparazione dati;
3. lancio algoritmi di identificazione;
4. stampa dei risultati delle simulazioni;
Per ottenere una buona stima di un processo bisogna innazitutto che i segnali in gioco
siano sufficientemente esenti da rumore. Se necessario occorre quindi effettuare un’
operazione di prefiltraggio: filtrando i segnali di ingresso e uscita attraverso un filtro
40
Cap. 3 Realizzazione software
§3.2 Identificazione
lineare è possibile focalizzare la stima paramentrica del modello basata su determinati ranges in frequenza di dati. I processi fisici evolvono dinamicamente attorno a
punti di equilibrio. La presenza nei dati di caratteristiche statiche (valor medio) o
lentamente variabili può occultare le caratteristiche dinamiche, inficiando l’ efficienza
degli algoritmi di identificazione. E’ possibile usare il comando
y=detrend(ingresso)
per sottrarre i valori medi diversi dallo zero dall’ingresso. Una volta ottenuti i segnali
filtrati, bisogna creare uno speciale oggetto che raccoglie in un unico array i segnali
d’ ingresso e uscita. Questo è possibile farlo con il seguente comando:
data=iddata(y,u,Ts)
con y e u vettori contenenti le misure dell’uscita e dell’ ingresso, rispettivamente, e
T s il tempo di campionamento. Il comando
data=merge(data(t0:t1),data(t1:t2),data(t2:t3))
è utile per raggruppare oggetti iddata di esperimenti diversi: tramite gli estremi t1,
t2, t3 è possibile selezionare gli intervalli buoni ed escludere parte dei dati che può
essere affetta da disturbi, in modo tale che non influenzino il modello da stimare. Per
lanciare l’ algoritmo PEM e ottenere una funzione di trasferimento ingresso-uscita si
usa il comando
modello=pem(data,[na nb nc nd nf nk],’Property1’,value1,....)
dove i parametri hanno il seguente significato:
• modello rappresento un oggetto idmodel da cui si può estrapolare la funzione
di trasferimento con i comandi tf (modello) o zpk(modello);
41
Cap. 3 Realizzazione software
§3.2 Identificazione
• na è il numero di poli della funzione di trasferimento ingresso-uscita;
• nb è il numero di zeri più uno della funzione di trasferimento ingresso-uscita;
• nc è il grado del numeratore che si associa alla funzione di trasferimento del
disturbo;
• nd è il grado del denominatore del disturbo;
• nf è il grado del denominatore dell’ingresso;
• nk è il ritardo in campioni che occorre prima che l’ingresso incida sull’uscita (ad
esempio se nk = 1 allora l’uscita risente dei dati precedenti al tempo nk − 1).
Per i sistemi a tempo discreto c’è un minimo di un campione in ritardo, affinchè
l’ uscita dipenda dall’ ingresso precedente.
Questi parametri sono stati scelti facendo riferimento alle funzioni di trasferimento
del modello fisico ricavate nel Capitolo 1, provando di volta in volta ad aggiungere un
polo e/o uno zero per ottenere risultati più soddisfacenti. I migliori risultati si sono
ottenuti per i valori [3 3 0 0 0 1] per l’ uscita in corrente, e [3 1 0 0 0 1] per quella in
posizione. Le propietà possono essere:
• F ocus con possibili valori P rediction o Simulation;
• M axIter e T olerance gestiscono lo stop della ricerca iterativa;
• M axSize determina la più larga matrice formata dall’ algoritmo;
• altre (T ace,LimitError).
42
§3.2 Identificazione
Cap. 3 Realizzazione software
3.2.4
Risultati
I risultati dell’ identificazione sono riportati nei grafici in Figura 3.7. Come è possibile
notare, il modello di posizione è estremamente preciso, avendo un valore di fitting
(correlazione tra uscite simulate e misurate) sul 90%: questo è dovuto soprattutto alla
compensazione della deadzone. Per quanto riguarda la corrente, il valore di fitting è
comunque accettabile (circa 80%): si noti come l’ uscita simulata approssima bene
quella misurata per ingressi a gradino, mentre approssima male le rampe e le mezze
onde. La causa di questo è dovuta all’azione dell’ attrito dinamico, già discusso
nel paragrafo 3.2.1, che è funzione dalla velocità angolare del motore e che rende
non lineare il comportamento della corrente. L’ andamento della velocità angolare
è possibile ricavarlo applicando il filtro discusso nella sezione 3.2.2, e il risultato è
riportato in fig.3.6 Le funzioni di trasferimento ingresso-uscita cosı̀ ricavate, con tempo
di campionamento Ts = 3 millisecondi, sono:
P1 (z) =
0.008793
(z − 1)(z + 0.3725)(z − 0.2286)
(3.2.3)
funzione di trasferimento con ingresso u ∈ [0, 116] e uscita posizione angolare in passi
encoder;
P2 (z) =
0.21982
(z − 0.9277)(z − 0.2286)(z + 0.3725)
(3.2.4)
funzione di trasferimento con ingresso u =∈ [0, 116] e uscita velocità angolare in
impulsi/secondo;
P3 (z) =
6.4159 · 10−5 (z + 2.087)(z − 0.9739)
(z + 0.02321)(z 2 − 1.835z + 0.8443)
(3.2.5)
funzione di trasferimento con ingresso pwm ∈ [0, 255] e uscita in corrente misurata in
ampere.
43
§3.2 Identificazione
Cap. 3 Realizzazione software
Osservazione 3.2.1. Si può notare come la funzione di trasferimento P2 (z) della
velocità sia uguale a quella P1 (z) della posizione, a meno del polo in z = 1 dove in
P2 (z) è sostituito dal polo in z = 0.9277.
X
Ingresso u
200
100
100
50
Duty Cycle
150
0
0
−100
−50
−200
−100
−300
0
2
4
6
Tempo(sec)
8
10
−150
12
0
2
4
6
Tempo(sec)
8
10
12
Figura 3.5: Ingressi
Simulazione velocità
400
300
200
velocità(encoder/sec)
Duty Cycle
Ingresso pwm
300
100
0
−100
−200
−300
−400
0
2
4
6
Tempo(sec) (sec)
8
10
12
Figura 3.6: Stima della velocità
44
§3.2 Identificazione
Cap. 3 Realizzazione software
Simulazione corrente
0.5
Measured
modellocorr; fit: 80.12%
0.4
0.3
corrente(ampere)
0.2
0.1
0
−0.1
−0.2
−0.3
−0.4
−0.5
2
4
6
Tempo(sec)
8
10
Simulazione posizione
Measured
modellopos; fit: 89.81%
450
posizione(passi encoder)
400
350
300
250
200
150
100
50
0
2
4
6
Tempo(sec)
8
10
Figura 3.7: Posizione e Corrente
45
Capitolo 4
Progetto di regolatori
In questa capitolo si tratterà la sintesi di sistemi di controllo per la
posizione, la velocità e la corrente.
Figura 4.1: Sistema di controllo
Dato il sistema ad anello retroazionato in Figura 4.1, si vuole progettare un regolatore C(s) che soddisfi i principali requisiti di controllo, con P (s) processo comprendente il ponte H, il motore DC e i circuiti di acquisizione dati, e y uscita in posizione,
velocità o corrente. Le specifiche di progetto riguardano:
1. Precisione a regime: ci si riferisce alla capacità del sistema di seguire alcuni
segnali di riferimento con il minimo errore, in particolare per ingressi a gradino.
46
Cap. 4 Progetto di regolatori
2. Risposta nel transitorio: ci si riferisce all’andamento per tempi finiti dell’uscita del sistema in retroazione in risposta a tipici segnali in ingresso. Queste
specifiche possono essere date sia nel dominio del tempo (tempo di salita, di
ritardo, di assestamento, ecc.) sia nel dominio della frequenza (coefficiente di
smorzamento, pulsazione naturale, picco di risonanza e banda passante).
3. Stabilità: rifacendosi ai teoremi di Nyquist e Bode, è possibile valutare la
stabilità del sistema a ciclo chiuso, margine di fase e guadagno (robustezza).
Teorema 4.0.1. Teorema di Nyquist Condizione necessaria e sufficiente perchè
un sistema in retroazione con guadagno in anello P (z) sia asintoticamente stabile
è che il diagramma polare della funzione P (ejωT ) tracciato per −π/T ≤ ω ≤ π/T
circondi il punto critico −1 + j0 per tanti giri al finito in senso antiorario quanti
sono i poli di P (z) a modulo maggiore di uno, e per tanti mezzi giri al finito in senso
antiorario quanti i poli a modulo unitario.
Teorema 4.0.2. Sia dato un sistema descritto da una funzione di trasferimento, con
riferimento allo schema in retroazione,
W (z) =
C(z)P (z)
1 + C(z)P (z)
(4.0.1)
Allora:
• Il sistema è asintoticamente stabile se e solo se tutte le radici del polinomio
1+C(z)D(z), cioè i poli del sistema, sono entro il cerchio di raggio unitario con
centro nell’origine del piano, ossia se kpi k < 1, ∀i.
• Il sistema è stabile se tutti i poli a modulo unitario kpi k = 1 sono poli semplici
(la loro molteplicità è 1), mentre tutti i rimanenti poli sono entro il cerchio
unitario.
47
§4.1 Controllo in posizione
Cap. 4 Progetto di regolatori
• La posizione degli zeri, cioè delle radici del polinomio C(z)P(z), non influisce
sulla stabilità del sistema.
4.1
Controllo in posizione
Root Locus
1
Imaginary Axis
0.5
0
−0.5
−1
−1.5
−1
−0.5
0
Real Axis
0.5
1
Figura 4.2: Luogo delle radici P1 (s)
Il regolatore per il controllo in posizione del motore DC sarà progettato tramite
sintesi diretta nel luogo delle radici (Figura 4.2). La funzione di trasferimento viene
riportata per comodità,
P1 (z) =
0.008793
(z − 1)(z + 0.3725)(z − 0.2286)
(4.1.1)
Dal luogo delle radici si può notare, in ragione del teorema 4.0.2, che il sistema è
asintoticamente stabile per un regolatore proporzionale con un valore di guadagno
che rientra all’interno della circonferenza unitaria. Inoltre, la presenza di un polo
in z = 1 garantisce astatismo per ingressi a gradino. Il valore del guadagno è stato
scelto pari a kp = 15 poichè, considerando che la velocità di risposta rimane limitata
48
§4.1 Controllo in posizione
Cap. 4 Progetto di regolatori
Bode Diagram
Gm = 14.2 dB (at 210 rad/sec) , Pm = 72 deg (at 41.5 rad/sec)
Nyquist Diagram
20
0.5
0.4
0
0.3
−10
0.2
Imaginary Axis
Magnitude (dB)
10
−20
Phase (deg)
−30
0
0.1
0
−0.1
−180
−0.2
−360
−0.3
−0.4
−540
−0.5
−720
1
10
2
3
10
10
4
10
−1
−0.8
Frequency (rad/sec)
−0.6
−0.4
Real Axis
−0.2
0
Figura 4.3: Diagrammi di bode e di Nyquist per C(s)=15
Figura 4.4: Simulazione in simulink
dalla saturazione, un valore troppo alto sarebbe stato inutile o anche dannoso per il
transitorio. Dal diagramma di Nyquist riportato in fig. 4.3 si vede che il sistema è
asintoticamente stabile in quanto, per il teorema 4.0.1, per un solo polo a modulo
unitario la curva percorre un mezzo giro in senso antiorario intorno al punto -1+j0.
49
§4.1 Controllo in posizione
Cap. 4 Progetto di regolatori
C(s)=15
350
300
Passi Encoder
250
200
150
100
50
0
Estimated
Measured
0
0.5
1
1.5
Tempo(sec)
2
2.5
3
C(s)=15
200
rif
Estimated
Measured
150
Passi Encoder
100
50
0
−50
−100
−150
−200
0
0.5
1
1.5
Tempo(sec)
2
2.5
3
Figura 4.5: Risposta del sistema per ingresso costante e sinusoidale
Nella stessa figura è riportato il diagramma di Bode, da cui si può leggere il margine di
fase pari a γf = 72 gradi ad una pulsazione ω = 41.5 rad/sec, e il margine di guadagno
50
§4.2 Controllo in corrente
Cap. 4 Progetto di regolatori
pari a MG = 14.2 dB ad una pulsazione ω = 210 rad/sec. In fig.4.5 sono riportate
le risposte del sistema a ciclo chiuso per un ingresso costante pari a rif = 300 e per
un ingresso sinusoidale pari a rif = 150(2.093t), dove in blu è riportata la risposta
misurata, in rosso quella simulata e in verde il riferimento.
Osservazione 4.1.1. Nella simulazione in fig.4.8 non compare il blocco della dead
zone in quanto questa è stata compensata nell’ identificazione del modello (vedi sez.
3.2.1).
4.2
X
Controllo in corrente
Root Locus
1
1
0.5
0.5
Imaginary Axis
Imaginary Axis
Root Locus
0
−0.5
0
−0.5
−1
−1
−2
−1.5
−1
−0.5
Real Axis
0
0.5
1
−0.2
0
0.2
0.4
Real Axis
0.6
0.8
1
Figura 4.6: Luogo delle radici di P3 (s) a) senza controllore; b) con controllore.
La funzione di trasferimento ingresso con uscita in corrente è
P3 (z) =
6.4159 · 10−5 (z + 2.087)(z − 0.9739)
(z + 0.02321)(z 2 − 1.835z + 0.8443)
(4.2.1)
e il suo luogo delle radici è riportato in fig.4.6a. Per soddisfare la specifica di astatismo
per ingressi costanti è necessario porre un polo in z = 1. Per ottenero questo risultato
51
§4.2 Controllo in corrente
Cap. 4 Progetto di regolatori
è possibile spostare i poli che sono all’interno della circonferenza unitaria, per esempio
si è operato una cancellazione dei poli complessi coniugati e si è messo un unico polo in
z = 1. Per rendere il controllore fisicamente realizzabile (cioè grado relativo maggiore
o uguale di zero), si è aggiunto un ulteriore polo in posizione p = 0.9739 in modo
da cancellare uno zero per semplificare il grado della funzione di trasferimento. Il
controllore cosı̀ ottenuto è
C(z) =
100(z 2 − 1.835z + 0.8443)
(z − 1)(z − 0.9739)
(4.2.2)
In fig. 4.6b è riportato il risultato del controllore nel luogo delle radici. In particolare
il guadagno kp = 100 è stato scelto in modo tale da ottenere la massima velocità di
risposta, in considerazione della saturazione. Dal diagramma di Bode e di Nyquist
(fig. 4.7) della funzione di anello aperto C(z)P3 (z), si osserva che il sistema rispetta
le condizioni del criterio di Nyquist, quindi è asintoticamente stabile, con un margine
di fase γf = 88.3 gradi alla pulsazione ω = 6.59 rad/sec, e un margine di guadagno
MG = 37.7 dB alla pulsazione di ω = 442 rad/sec. La risposta del sistema a ciclo
chiuso per un riferimento costante pari a rif = 0.1 è riportata in figura 4.9, dove la
curva rossa è la risposta simulata, mentre la blu è quella misurata.
52
§4.2 Controllo in corrente
Cap. 4 Progetto di regolatori
Bode Diagram
Gm = 37.7 dB (at 442 rad/sec) , Pm = 88.3 deg (at 6.59 rad/sec)
Nyquist Diagram
20
0.015
−20
0.01
Imaginary Axis
Magnitude (dB)
0.02
0
−40
Phase (deg)
−60
−90
0.005
0
−180
−0.005
−270
−0.01
−360
−0.015
−450
0
10
1
10
2
10
Frequency (rad/sec)
3
10
4
10
−1
−0.9
−0.8
−0.7
Figura 4.7: Diagrammi di bode e di Nyquist per C(z) =
−0.6
−0.5
−0.4
Real Axis
−0.3
−0.2
−0.1
0
100(z 2 −1.835z+0.8443)
(z−1)(z−0.9739)
Figura 4.8: Simulazione in simulink
53
§4.2 Controllo in corrente
Cap. 4 Progetto di regolatori
C(s)=100(z2−1.835z+0.8443)/(z−1)(z−0.9739)
0.12
0.1
Ampere
0.08
0.06
0.04
0.02
0
Measured
Estimated
0
0.5
1
1.5
2
2.5
Tempo(sec)
3
3.5
4
4.5
Figura 4.9: Risposta del sistema per un ingresso costante
54
Capitolo 5
Conclusioni e sviluppi futuri
Il progetto realizzato durante il tirocinio ha richiesto la conoscenza di diverse materie
tipiche dell’ingegneria dell’informazione quali l’elettronica analogica e digitale, i sistemi di misura, l’informatica e la programmazione, e la teoria dei controlli automatici.
La prima parte del progetto è stata spesa interamente sulla realizzazione del circuito
elettronico di alimentazione del motore e per l’acquisizione dei segnali: il laboratorio
è stato necessario per usufruire sia dei componenti del circuito e del saldatore, strumenti relativamente economici, sia delle costose apparecchiature di laboratorio quali
regolatori professionali di tensione e strumenti per la misura di segnali. Nella seconda parte si è approfondita la conoscenza del microcontrollore Arduino studiandone
l’architettura e le librerie di programmazione. Infine è stato possibile implementare
una legge di controllo che rendesse il sistema a ciclo chiuso asintoticamente stabile e
sono stati ricavati dei modelli che permettono di simulare il comportamento del sistema. Particolare rilevanza assumono i possibili sviluppi futuri: avendo a disposizione
il modello del sistema è possibile ricavare i parametri fisici del motore (es. momento di inerzia, induttanza e resistenza di armatura, costanti elettrica e di coppia del
motore) confrontando i coefficienti con quelli del modello fisico, oppure ricavandoli
sperimentalmente; una volta calcolati tali parametri è possibile implementare un con-
55
Cap. 5 Conclusioni e sviluppi futuri
trollo di tipo non lineare per compensare la non linearità dovuta all’attrito, oppure
implementare un controllo in coppia.
56
Appendice A
Schema elettrico circuito di
potenza
Nelle figure seguenti é riportato lo schema elettrico del circuito di potenza dimensionato nel capitolo 4. Per maggiore chiarezza visiva, lo schema é stato suddiviso in due
metà. Invece in Figura 5.1 é riportata una foto con le indicazioni per le connessioni.
Figura 5.1: Risultato finale
57
Cap. 5 Conclusioni e sviluppi futuri
Figura 5.2: Schema elettrico
58
Appendice B
Codice Arduino
Main
//Edited by Pierluigi Di Franco
//H BRIDGE L 298
#include <Servo.h>
#include "inout.h"
#define
#define
#define
#define
motor1 1
motor2 2
way1 1
way2 2
//OTHERS
volatile int EncoderCounter1 = 0;
int rotation;
int rotazione;
unsigned long oldtime = 0;
long time = 0;
int count = 0;
int pari = 0;
extern int pwm1;
extern int read_ok;
int h = 0;
int oldtime2=0;
void setup()
{
setup_motors();
attachInterrupt(1, doEncoder1, RISING);
// attachInterrupt(1, changeRotation, CHANGE);
//Signals for Ident
Serial.begin(115200);
setPwmFrequency(9,1);
establishContact();
oldtime=millis();
//This Arduino is the Master and starts to send Data
}
void loop()
{
59
Cap. 5 Conclusioni e sviluppi futuri
if(millis()-oldtime>=Ts)
{
oldtime = millis();
int v1;
int pwm1;
int pwm2;
int stop_signal = 0;
while(h <= 10392)
{
if(millis()-oldtime2>=Ts)
{
oldtime2 = millis();
if(oldtime2 -time > Ts )
time = time+Ts;
else
time = millis();
int timeout;
v1 = analogRead(V1);
if (pari == 0)
{
if(count == 0)
{
timeout=500;
}
pwm1= 116;
count++;
if(count >= timeout)
{
pari = 1;
count=0;
}
}
if(pari == 1)
{
if(count == 0)
{
timeout=500;
}
pwm1= -116;
count++;
if(count>=timeout)
{
pari = 2;
count=0;
}
}
if (pari == 2)
{
if(count == 0)
{
timeout=500;
}
pwm1= 116;
count++;
if(count >= timeout)
{
pari = 3;
count=0;
}
60
Cap. 5 Conclusioni e sviluppi futuri
}
if(pari == 3)
{
if(count == 0)
{
timeout=500;
}
pwm1= -116;
count++;
if(count>=timeout)
{
pari = 4;
count=0;
}
}
if (pari == 4)
{
if(count == 0)
{
timeout=1000;
}
pwm1=116*sin(0.00628*(double)count);
count++;
if(count >= timeout)
{
pari = 5;
count=0;
}
}
if (pari == 5)
{
if(count == 0)
{
timeout=116;
}
pwm1= count;
count++;
if(count >= timeout)
{
pari = 6;
count=0;
}
}
if(pari == 6)
{
if(count == 0)
{
timeout=232;
}
pwm1= 116 - count;
count++;
if(count>=timeout)
{
pari = 7;
count=0;
}
}
if (pari == 7)
{
if(count == 0)
61
Cap. 5 Conclusioni e sviluppi futuri
{
timeout=116;
}
pwm1= -116 + count;
count++;
if(count >= timeout)
{
pari = 8;
count=0;
}
}
if (pari == 8)
{
if(count == 0)
{
timeout=500;
}
pwm1= 116;
count++;
if(count >= timeout)
{
pari = 9;
count=0;
}
}
if(pari == 9)
{
if(count == 0)
{
timeout=500;
}
pwm1= -116;
count++;
if(count>=timeout)
{
pari = 10;
count=0;
}
}
if (pari == 10)
{
if(count == 0)
{
timeout=500;
}
pwm1= 116;
count++;
if(count >= timeout)
{
pari = 11;
count=0;
}
}
if(pari == 11)
{
if(count == 0)
{
timeout=500;
}
pwm1= -116;
62
Cap. 5 Conclusioni e sviluppi futuri
count++;
if(count>=timeout)
{
pari = 12;
count=0;
}
}
if (pari == 12)
{
if(count == 0)
{
timeout=1000;
}
pwm1=116*sin(0.00628*(double)count);
count++;
if(count >= timeout)
{
pari = 13;
count=0;
}
}
if (pari == 13)
{
if(count == 0)
{
timeout=116;
}
pwm1= count;
count++;
if(count >= timeout)
{
pari = 14;
count=0;
}
}
if(pari == 14)
{
if(count == 0)
{
timeout=232;
}
pwm1= 116 - count;
count++;
if(count>=timeout)
{
pari = 15;
count=0;
}
}
if (pari == 15)
{
if(count == 0)
{
timeout=116;
}
pwm1= -116 + count;
count++;
if(count >= timeout)
{
63
Cap. 5 Conclusioni e sviluppi futuri
pari = 16;
count=0;
}
}
if (pari == 16)
{
if(count == 0)
{
timeout=500;
}
pwm1= 116;
count++;
if(count >= timeout)
{
pari = 17;
count=0;
}
}
if(pari == 17)
{
if(count == 0)
{
timeout=500;
}
pwm1= -116;
count++;
if(count>=timeout)
{
pari = 18;
count=0;
}
}
if (pari == 18)
{
if(count == 0)
{
timeout=500;
}
pwm1= 116;
count++;
if(count >= timeout)
{
pari = 19;
count=0;
}
}
if(pari == 19)
{
if(count == 0)
{
timeout=500;
}
pwm1= -116;
count++;
if(count>=timeout)
{
pari = 20;
count=0;
}
}
if (pari == 20)
64
Cap. 5 Conclusioni e sviluppi futuri
{
if(count == 0)
{
timeout=1000;
}
pwm1=116*sin(0.00628*(double)count);
count++;
if(count >= timeout)
{
pari = 21;
count=0;
}
}
if (pari == 21)
{
if(count == 0)
{
timeout=116;
}
pwm1= count;
count++;
if(count >= timeout)
{
pari = 22;
count=0;
}
}
if(pari == 22)
{
if(count == 0)
{
timeout=232;
}
pwm1= 116 - count;
count++;
if(count>=timeout)
{
pari = 23;
count=0;
}
}
if (pari == 23)
{
if(count == 0)
{
timeout=116;
}
pwm1= -116 + count;
count++;
if(count >= timeout)
{
pari = 24;
count=0;
}
}
if(pwm1 > 0)
{
pwm2 = pwm1+DeadZone;
65
Cap. 5 Conclusioni e sviluppi futuri
move_motor(2,1,constrain(pwm2,0,255));
rotation = constrain(analogRead(R),0,200);
rotazione = constrain(rotation,0,200);
}
if(pwm1 < 0)
{
pwm2 = abs(pwm1)+DeadZone;
move_motor(2,2,constrain(pwm2,0,255));
rotation = constrain(analogRead(R),200,1023);
rotazione = constrain(rotation,200,1023);
}
if(pwm1==0)
{
move_motor(2,2,0);
}
}
if(pwm1 >= 0)
sendMessage(v1,pwm1,EncoderCounter1,stop_signal);
else
sendMessage(-v1,pwm1,EncoderCounter1,stop_signal);
//
Serial.println(EncoderCounter1);
h++;
}
//fine while
stop_signal = 1;
move_motor(1,1,0);
sendMessage(v1,pwm1,EncoderCounter1,stop_signal);
}
}
//ISR for evaluating the Encoders
void doEncoder1()
{
if(digitalRead(encoder1PinA) == 1 && rotazione <=200){
EncoderCounter1++;
}
else{
EncoderCounter1--;
}
}
inout.cpp
#include
#include
#include
#include
#include
"inout.h"
<Servo.h>
<math.h>
<float.h>
<limits.h>
int read_ok = 0;
void establishContact()
{
while (Serial.available() <= 0)
{
Serial.print(shift16(’S’), BYTE);
Serial.print(zero16(’S’), BYTE);
delay(1);
}
}
void setup_motors()
66
Cap. 5 Conclusioni e sviluppi futuri
{
//Signals for Motor 1
pinMode(encoder1PinA, INPUT);
pinMode(Enable1, OUTPUT);
pinMode(Enable2, OUTPUT);
//Signals for Motor 2
pinMode(Enable3, OUTPUT);
pinMode(Enable4, OUTPUT);
//interrupts on encoders
pinMode(V1,INPUT);
pinMode(R,INPUT);
}
void move_motor(int motor,int way,int pwm1)
{
if(motor == 1 && way == 1)
{
digitalWrite(Enable3, HIGH);
digitalWrite(Enable4, LOW);
analogWrite(PWM2,pwm1);
}
if(motor == 1 && way == 2)
{
digitalWrite(Enable4, HIGH);
digitalWrite(Enable3, LOW);
analogWrite(PWM2,pwm1);
}
if(motor == 2 && way == 1)
{
digitalWrite(Enable1, HIGH);
digitalWrite(Enable2, LOW);
analogWrite(PWM1,pwm1);
}
if(motor == 2 && way == 2)
{
digitalWrite(Enable2, HIGH);
digitalWrite(Enable1, LOW);
analogWrite(PWM1,pwm1);
}
}
void readPcIn(int &pwm1,int &read_ok){
if (Serial.available()>0)
{
int v1;
long time;
//Lettura Segnali da Seriale
pwm1 = Serial.read();
time = millis();
Serial.flush();
if(pwm1 >=0)
{
move_motor(1,1,abs(pwm1));
readSensorIn(v1,1);
}
else
{
//Serial.println(pwm1);
move_motor(1,2,abs(pwm1));
readSensorIn(v1,2);
}
//
sendMessage(v1,pwm1,time,);
67
Cap. 5 Conclusioni e sviluppi futuri
}
}
void sendMessage(int data,int pwm,int stop_signal)
{
/*send data*/
Serial.println("V");
Serial.println(data);
// Serial.println("P");
Serial.println(pwm);
Serial.println(stop_signal);
}
void setPwmFrequency(int pin, int divisor) {
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if(pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else {
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if(pin == 3 || pin == 11) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x7; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}
inout.h
#include "WProgram.h"
#define DimByteBuffer 1
#define lastbyte 1
#define dati
10
//Definizione Funzioni
#define uint16(x,y) ((y << 8 ) + x)
#define shift16(x) (x >> 8)
#define zero16(x) (x & 0xFF)
#define Ts 3
//sampling time
#define V1
#define R
0
3
//Analog Pin for voltage sense read
//Digital Pin for rotation verse read
#define DeadZone 139
//First Motor
68
Cap. 5 Conclusioni e sviluppi futuri
#define PWM1 9 //enable pin of the H bridge
//requires a PWM signal (digital pin 5)
#define Enable1 4//logic.a of the H bridge
//to set the direction of rotation with logic.b
#define Enable2 6//logic.b of the H bridge
//to set the direction of rotation with logic.a
//Second Motor
#define PWM2 11 //enable pin of the H bridge requires
//a PWM signal (digital pin 11)
#define Enable3 12//logic.a of the H bridge to set
// the direction of rotation with logic.b
#define Enable4 10//logic.b of the H bridge to set
// the direction of rotation with logic.a*)
//Encoder Motor 1
#define encoder1PinA 3 //Encoder 1 A channel, interrupt 0
//ENCODERS AMT
#define CountsXround 2048
void
void
void
void
void
void
void
void
readPcIn(int &pwm1,int &read_ok);
establishContact(void);
sendMessage(int data,int pwm,int stopsignal);
readSensorIn(int &v1,int way);
setup_motors(void);
Setup_sensors(void);
move_motor(int motor,int way,int pwm1);
setPwmFrequency(int pin, int divisor);
69
Appendice C
Codice MatLab
clear all
clc
close all
%%
s = serial(’COM6’);
set(s,’BaudRate’, 115200);
set(s,’DataBits’, 8);
set(s,’StopBits’, 1);
set(s,’OutputBufferSize’, 200000);
set(s,’InputBufferSize’, 200000);
fopen(s);
s.ReadAsyncMode = ’continuous’;
Ts=0.003;
connection = 0;
ok = 0;
TimeInterval=0; %time interval between each input.;
filtro=tf(1,[1/50 1]);
filtrod = c2d(filtro,Ts);
while(connection == 0)
if(s.BytesAvailable > 0 )
%Dimensione del Buffer istante per istante
DimAvailable=s.BytesAvailable/2;
%Lettura Buffer
data = fread(s,s.BytesAvailable,’uint8’);
%Unione Byte
for j=1: DimAvailable,
Buffer(j)=data(j*2)+(bitshift(data(j*2-1),8));
end
%Unione Buffer con il precedente messaggio
%Buffer=[NewBuffer,Buffer];
for j=1: length(Buffer),
Buffer(j);
if(Buffer(j) == ’S’)
ok = 1;
display([’done 1’]);
break
else
connection = 0;
display([’not done’]);
end
end
end
70
Cap. 5 Conclusioni e sviluppi futuri
if(ok == 1)
connection = 1;
display([’done 2’]);
end
end
if(connection == 1)
u(1)=’k’;
a=typecast(uint16(u(1)), ’uint8’);
Enter(1)=a(1);
Enter(2)=a(2);
fwrite(s,Enter);
end
read_v=0;
read_u=0;
read_t=0;
read_s=0;
i= 1;
stop = 0;
while(stop == 0)
%% Recive data from arduino
w=fscanf(s,’%d’);
% must define the input % d or %s, etc.
if(size(w)>0)
if(w(1)==’V’ && read_v==0)
v=fscanf(s,’%d’);
%v=[0,1023]
v1(i)=(v*5)/1023;
%v1=[0,5] volt, conversione in volt
read_v=1;
end
if(read_v==1 && read_u==0)
u1(i)=fscanf(s,’%d’);
if(u1(i)> 0)
pwm(i)=u1(i)+139;
end
if(u1(i)<0)
pwm(i)=u1(i)-139;
end
read_u=1;
end
if(read_v==1 && read_u==1 && read_t==0)
pos(i)=fscanf(s,’%d’);
read_t=1;
end
end
if(read_v==1 && read_t==1 && read_u==1 && read_s==0)
stop=fscanf(s,’%d’);
if(stop==0)
%se stop=0 riazzera i flag
read_v=0;
read_u=0;
read_t=0;
read_s=0;
end
i=i+1;
end
end
%% Close serial connection
stopasync(s);
fclose(s);
delete(s);
71
Cap. 5 Conclusioni e sviluppi futuri
clear s;
amp = 24.5;
%amplificazione
R
= 0.22;
%R sensore
v2
= v1/amp;
v3 = lsim(filtrod,v2)’;
i1 = v2/R;
%i1=v1/R R=0.22 ohm
i2=v3/R;
%FILTRO DERIVATIVO
filtro2=tf([1 0],[1/25 1]);
filtro2d=c2d(filtro2,Ts);
vel=lsim(filtro2d,pos)’;
%% IDENTIFICAZIONE
%prepara dati
datacorr=iddata(i2’,pwm’,Ts);
datapos=iddata(pos’,u1’,Ts);
datavel=iddata(vel’,u1’,Ts);
datacorr=merge(datacorr(1:3455),datacorr(3455:6911),datacorr(6911:10366));
datapos=merge(datapos(1:3455),datapos(3455:6911),datapos(6911:10366));
datavel=merge(datavel(1:3455),datavel(3455:6911),datavel(6911:10366));
%lancio algoritmi
modellocorr = pem(datacorr,[3 3 0 0 0 1],’focus’,
’prediction’,’tolerance’,1e-8,’maxiter’,500);
modellopos = pem(datapos,[3 1 0 0 0 1],’focus’,
’prediction’,’tolerance’,1e-8,’maxiter’,500);
%modellotot = pem(datatot,3);
%funzioni di trasferimento
Fmodellocorr = tf(modellocorr.b,modellocorr.a,Ts);
Fmodellopos = tf(modellopos.b,modellopos.a,Ts);
Fmodellovel = Fmodellopos*filtro2d;
%% GRAFICI
figure(1)
plot(Ts*[0:1:length(pwm(1:3455))-1],pwm(1:3455))
title(’Ingresso pwm’)
xlabel(’Tempo(sec)’)
ylabel(’Duty Cycle’)
figure(2)
plot(Ts*[0:1:length(u1(1:3455))-1],u1(1:3455))
title(’Ingresso u’)
xlabel(’Tempo(sec)’)
ylabel(’Duty Cycle’)
figure(3)
compare(getexp(datacorr,1),modellocorr,’r’);
title(’Simulazione corrente’)
xlabel(’Tempo(sec)’)
ylabel(’corrente(ampere)’)
figure(4)
72
Cap. 5 Conclusioni e sviluppi futuri
compare(getexp(datapos,1),modellopos,’r’);
title(’Simulazione posizione’)
xlabel(’Tempo(sec)’)
ylabel(’posizione(passi encoder)’)
figure(5)
lsim(Fmodellovel,u1(1:3460)’);
title(’Simulazione velocità’)
ylabel(’velocità(encoder/sec)’)
xlabel(’Tempo(sec)’)
73
Elenco delle figure
1.1
1.2
1.3
1.4
1.5
1.6
1.7
2.1
2.2
2.3
2.4
2.5
2.6
Sezione di un motore elettrico . . . . . . . . . . . . . . . . . .
Schema elettrico equivalente di un motore DC . . . . . . . .
Pilotaggio ON-OFF: quando l’interruttore è aperto il motore è fermo, quando è chiuso gira alla massima velocità. A
destra un esempio di implementazione . . . . . . . . . . . . .
Pulse With Modulation . . . . . . . . . . . . . . . . . . . . . .
Andamento della corrente del motore sotto l’ azione dei una
PWM variabile . . . . . . . . . . . . . . . . . . . . . . . . . . .
Schema ponte H . . . . . . . . . . . . . . . . . . . . . . . . . .
Funzionamento ponte H . . . . . . . . . . . . . . . . . . . . . .
5
6
10
11
13
14
14
17
18
21
22
23
2.7
2.8
L298N: pin connections (top view) . . . . . . . . . . . . . . .
Shema di funzionamento interno di un ponte H . . . . . . . .
Amplificatore operazionale . . . . . . . . . . . . . . . . . . . .
TLC272: top view . . . . . . . . . . . . . . . . . . . . . . . . .
Configurazione non invertente . . . . . . . . . . . . . . . . . .
Possibile modalità di limitazione superiore della banda nella
configurazione non invertente . . . . . . . . . . . . . . . . . .
Collegamenti encoder . . . . . . . . . . . . . . . . . . . . . . .
Amplificatore differenziale . . . . . . . . . . . . . . . . . . . .
3.1
3.2
3.3
3.4
3.5
3.6
3.7
Arduino duemilanove . .
I processi da identificare
a) Modello con dead zone
Modello di attrito . . . .
Ingressi . . . . . . . . . . .
Stima della velocità . . .
Posizione e Corrente . . .
4.1
4.2
4.3
4.4
Sistema di controllo . .
Luogo delle radici P1 (s)
Diagrammi di bode e di
Simulazione in simulink
. .
. .
b)
. .
. .
. .
. .
. . . . . . . . .
. . . . . . . . .
Modello senza
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . .
. . . . . . .
dead zone
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
Nyquist per C(s)=15 .
. . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
25
27
28
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
30
37
38
39
44
44
45
.
.
.
.
.
.
.
.
.
.
.
.
46
48
49
49
74
ELENCO DELLE FIGURE
4.5
4.6
ELENCO DELLE FIGURE
4.7
4.8
4.9
Risposta del sistema per ingresso costante e sinusoidale . . .
Luogo delle radici di P3 (s) a) senza controllore; b) con controllore. . . . . . . . . . . . . . . . . . . . . . . . 2. . . . . . . .
−1.835z+0.8443)
Diagrammi di bode e di Nyquist per C(z) = 100(z
(z−1)(z−0.9739)
Simulazione in simulink . . . . . . . . . . . . . . . . . . . . . .
Risposta del sistema per un ingresso costante . . . . . . . . .
50
51
53
53
54
5.1
5.2
Risultato finale . . . . . . . . . . . . . . . . . . . . . . . . . . .
Schema elettrico . . . . . . . . . . . . . . . . . . . . . . . . . .
57
58
75
Bibliografia
[1] A. Bellini, “Elettronica industriale 1”, Aracne, 2004.
[2] C. Bonivento - C. Melchiorri - R. Zanasi, “Sistemi di controllo
digitale”, Progetto Leonardo, 1995.
[3] Ernest O. Doebelin, “Strumenti e metodi di misura”, McGraw-Hill,
2004.
[4] Luca Zaccarian, “Motori CC ed encoders incrementali”,
[5] Alessandro Sbaraglia, “Sistema di controllo su microcontrollore per
motori CC ed encoder magnetici”, Tesi di laurea, 2009.
[6] Roberto De Simone, “Azionamento di motori in corrente continua
tramite microcontrollori”, Tesi di laurea, 2004.
[7] MathWorks, “System Identification Toolbox”
76