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