100
UNIVERSITÀ DEGLI STUDI DI TRIESTE Dipartimento di Ingegneria e Architettura Laurea Triennale in Ingegneria dell’Informazione Realizzazione su FPGA di un’architettura versatile per controllare l’equilibrio di un pendolo inverso 16 ottobre 2014 Laureando Relatore Federico Madotto Chiar.mo Prof. Stefano Marsi Anno Accademico 2013/2014

UNIVERSITÀ DEGLI STUDI DI TRIESTE - units.it · UNIVERSITÀ DEGLI STUDI DI TRIESTE DipartimentodiIngegneriaeArchitettura Laurea Triennale in Ingegneria dell’Informazione Realizzazione

Embed Size (px)

Citation preview

UNIVERSITÀ DEGLI STUDI DITRIESTE

Dipartimento di Ingegneria e Architettura

Laurea Triennale in Ingegneria dell’Informazione

Realizzazione su FPGA di un’architetturaversatile per controllare l’equilibrio di un

pendolo inverso

16 ottobre 2014

Laureando RelatoreFederico Madotto Chiar.mo Prof. Stefano Marsi

Anno Accademico 2013/2014

Al nonno Sergio,che ha sempre creduto in me

e mi è sempre vicino.A mamma e papà,

i genitori migliori del mondo.

Indice

Elenco delle figure iv

Notazione vi

Acronimi vii

Introduzione viii

Ringraziamenti xi

I Descrizione del sistema 1

1 Architettura del sistema 21.1 Gli elementi del sistema . . . . . . . . . . . . . . . . . . . . . 31.2 Struttura della logica implementata . . . . . . . . . . . . . . . 6

2 Realizzazione della logica per la generazione ed elaborazionedell’onda quadra 92.1 Avalon MM e Avalon ST . . . . . . . . . . . . . . . . . . . . . 9

2.1.1 Avalon MM . . . . . . . . . . . . . . . . . . . . . . . . 92.1.2 Avalon ST . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.2 Blocco «onda_quadra»: generazione dell’onda quadra . . . . . 112.2.1 Realizzazione del modulo onda_quadra . . . . . . . . . 12

2.3 Blocco «media»: calcolo della media dei campioni in entrata . 172.3.1 Realizzazione del modulo media . . . . . . . . . . . . . 18

3 Il pendolo inverso 243.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243.2 Descrizione del modello matematico del pendolo inverso ad un

grado di libertà . . . . . . . . . . . . . . . . . . . . . . . . . . 243.3 Dinamica del pendolo inverso . . . . . . . . . . . . . . . . . . 25

3.3.1 Dinamica dell’asta . . . . . . . . . . . . . . . . . . . . 263.3.2 Dinamica del carrello . . . . . . . . . . . . . . . . . . . 28

i

INDICE

3.3.3 Equazioni di moto del sistema . . . . . . . . . . . . . . 293.3.4 Funzione di trasferimento . . . . . . . . . . . . . . . . 29

3.4 Esempio di stabilizzazione del sistema: controllore PID . . . . 31

II Gestione del sistema via software 35

4 Ambiente di sviluppo software per il processore Nios II 364.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.2 Nios II Software Build Tool for EclipseTM . . . . . . . . . . . 38

4.2.1 Generazione della libreria di sistema . . . . . . . . . . 384.2.2 Accesso e comunicazione con le periferiche . . . . . . . 384.2.3 Creazione e compilazione del software . . . . . . . . . 394.2.4 Caricamento del software ed esecuzione . . . . . . . . 39

5 Utilizzo delle funzionalità di base del sistema 405.1 Impostazione della frequenza dell’onda quadra . . . . . . . . . 405.2 Impostazione dell’ampiezza dell’onda quadra . . . . . . . . . . 425.3 Lettura dei dati forniti dal blocco che calcola la media . . . . 42

5.3.1 Lettura della media . . . . . . . . . . . . . . . . . . . 425.3.2 Lettura del dato in ingresso al CODEC audio . . . . . 43

5.4 Invio al plotter delle istruzioni per lo spostamento . . . . . . . 43

6 La lettura dell’angolo 45

7 Semplice approccio per il controllo del pendolo inverso 527.1 Idea di base . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537.2 Implementazione della soluzione . . . . . . . . . . . . . . . . . 54

III Test sul funzionamento della logica realizzata 57

8 Test sul funzionamento del blocco onda_quadra 588.1 Test sul corretto comportamento del modulo onda_quadra . . 588.2 Visualizzazione dell’onda quadra analogica generata . . . . . . 59

9 Test sul funzionamento del blocco media 619.1 Test sul corretto funzionamento del modulo media . . . . . . 619.2 Utilizzo del blocco media per visualizzare l’onda quadra in

entrata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629.3 Andamento della media al variare della posizione del joystick 64

ii

INDICE

IV Tutorial 66

10 Tutorial sull’implementazione della parte software del siste-ma 67

V Parte Finale 74

Conclusioni 75

A Listati in Verilog 77A.1 Modulo onda_quadra . . . . . . . . . . . . . . . . . . . . . . . 77A.2 Modulo media . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

B Listati in C 81B.1 Semplice controllo del pendolo inverso . . . . . . . . . . . . . 81B.2 Salvataggio dei dati del segnale campionato dall’ADC su SRAM

e stampa a schermo . . . . . . . . . . . . . . . . . . . . . . . . 83B.3 Stampa a schermo dei dati di media . . . . . . . . . . . . . . 84

Bibliografia 85

iii

Elenco delle figure

1.1 Schema dei componenti principali del sistema . . . . . . . . . 21.2 La scheda di prototipazione Altera R© DE1 . . . . . . . . . . . 31.3 Il plotter Graphtech MP4300 . . . . . . . . . . . . . . . . . . 31.4 L’asta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.5 Basetta millefori con potenziometri, joystick e prese jack da

3.5mm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.6 Schema semplificato dell’architettura del sistema . . . . . . . 51.7 Rappresentazione dei blocchi presenti nel sistema generato in

Qsys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.8 Il sistema nel suo complesso . . . . . . . . . . . . . . . . . . . 8

2.1 Segnali principali utilizzati in un’interfaccia Avalon-MM slave 102.2 Segnali principali utilizzati in un’interfaccia Avalon-ST . . . . 112.3 Segnali di input/output del blocco «onda quadra» . . . . . . 122.4 Simulazione dei segnali LRCK, ready e valid relativi al blocco

onda_quadra . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.5 Segnali di input/output del blocco «media» . . . . . . . . . . 182.6 Simulazione dei segnali LRCK, ready e valid relativi al blocco

media . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.1 Modello di un pendolo inverso ad un grado di libertà . . . . . 253.2 Diagramma di corpo libero dell’asta . . . . . . . . . . . . . . 263.3 Diagramma di corpo libero del carrello . . . . . . . . . . . . . 283.4 Risposta impulsiva del sistema . . . . . . . . . . . . . . . . . 303.5 Risposta allo scalino del sistema . . . . . . . . . . . . . . . . . 313.6 Schema del sistema completo di controllore . . . . . . . . . . 313.7 Diagramma di Nyquist della funzione ad anello aperto . . . . 333.8 Risposta impulsiva del sistema controllato . . . . . . . . . . . 343.9 Risposta allo scalino del sistema controllato . . . . . . . . . . 34

4.1 Fasi di progetto del sistema . . . . . . . . . . . . . . . . . . . 364.2 Hardware Abstraction Layer (HAL) . . . . . . . . . . . . . . . 37

iv

ELENCO DELLE FIGURE

6.1 Scelta del sistema di riferimento rispetto alla posizione delplotter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

6.2 Angolo misurato . . . . . . . . . . . . . . . . . . . . . . . . . 466.3 Scelta del nome dei potenziometri . . . . . . . . . . . . . . . . 476.4 Mappa ampiezza-angolo dei canali sinistro (in blu) e destro

(in rosso) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486.5 Approssimazione ai minimi quadrati dei dati misurati (canale

sinistro) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 496.6 Approssimazioni lineari dei dati del canale sinistro (approssi-

mazione ai minimi quadrati in blu, approssimazione utilizzatanel progetto in rosso) . . . . . . . . . . . . . . . . . . . . . . . 50

6.7 Approssimazione ai minimi quadrati dei dati misurati (canaledestro) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

6.8 Approssimazioni lineari dei dati del canale destro (approssi-mazione ai minimi quadrati in blu, approssimazione utilizzatanel progetto in rosso) . . . . . . . . . . . . . . . . . . . . . . . 51

7.1 Funzionamento del programma per il controllo: a sinistra l’o-peratore mantiene il pendolo fermo ad un’inclinazione; a de-stra il carrello si è spostato portando il pendolo in posizioneverticale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

7.2 Scelta del sistema di riferimento rispetto al plotter . . . . . . 537.3 Proiezioni del pendolo sui due piani di rotazione . . . . . . . . 53

8.1 Analisi dei segnali contatore (secondo segnale) e ampiezza(terzo segnale), con riferimento al segnale LRCK (primo segnale) 58

8.2 Onda quadra analogica osservata con un’oscilloscopio . . . . . 59

9.1 Analisi dei segnali audio_abs (secondo segnale), e somma (ter-zo segnale), contatore (quarto segnale) e somma_stored (quin-to segnale) con riferimento al segnale LRCK (primo segnale) . . 61

9.2 Grafico dell’onda quadra campionata dal convertitore A/D . . 649.3 Valori di media catturati mentre l’asta compie un movimento

circolare. Sull’asse verticale ci sono i dati relativi al canaledestro, sull’asse orizzontale quelli relativi al canale sinistro . . 65

10.1 Creazione del progetto in Eclipse: impostazioni . . . . . . . . 6810.2 Schermata principale . . . . . . . . . . . . . . . . . . . . . . . 6910.3 Pulsante per la creazione di un nuovo file sorgente C/C++ . . 7010.4 Creazione di un nuovo file sorgente C/C++ . . . . . . . . . . 7010.5 Pulsante per il salvataggio del file sorgente C . . . . . . . . . 7110.6 Progetto BSP . . . . . . . . . . . . . . . . . . . . . . . . . . . 7110.7 Canali standard e interfacce . . . . . . . . . . . . . . . . . . . 7210.8 Compilazione del progetto . . . . . . . . . . . . . . . . . . . . 7210.9 Caricamento su scheda ed esecuzione del programma . . . . . 73

v

Notazione

, raggruppatore delle migliaia.

. separatore decimale.

F (s) trasformata di Laplace di una funzione f(t).

k versore, vettore di lunghezza unitaria. Se non diversamente specifica-to, fissato un riferimento cartesiano xyz, i, j e k sono i versori cheindividuano le direzione degli assi rispettivamente x, y, e z.

~A vettore di modulo A e componenti (Ax, Ay, Az). Risulta quindi ~A =

Axi +Ay j +Azk.

vi

Acronimi

BSP Board Support Package.

EDS Embedded Design Suite.

elf Executable and Linking Format file.

FPGA Field Programmable Gate Array.

GUI Graphic User Interface.

HAL Hardware Abstraction Layer.

HDL Hardware Description Language.

IDE Integrated Development Environment.

PID Proporzionale Integrale Derivativo.

SBT Software Build Tool.

sof SRAM Object File.

vii

Introduzione

In questa tesi si è affrontato il problema della realizzazione di un’architetturache potesse poi essere utilizzata per il controllo dell’equilibrio di un pendoloinverso.

Il lavoro è stato svolto interamente in collaborazione con la collega ChiaraCremon, che nella tesi «Progetto di un sistema per il controllo di un pendoloinverso attraverso attuatori elettromeccanici» [1] ne ha descritto la primaparte relativa al progetto del sistema che si è andati a realizzare, passandodalla preliminare descrizione dei componenti (fisici e non) utilizzati per arri-vare poi alla descrizione delle modalità in cui questi sono stati connessi tradi loro.La seconda parte del lavoro è descritta invece in questa tesi: in essa si trat-terà di come sono stati realizzati alcuni degli elementi del sistema che si èprogettato, della loro gestione tramite software e si daranno i risultati dialcuni test sul loro funzionamento.

Si è scelto di trattare l’argomento del controllo del pendolo inverso poi-ché esso ci ha permesso di apprendere nozioni sulle logiche programmabiliche non si sono affrontate nel percorso della Laurea Triennale e di applicareconcetti che spaziano dalla Fisica all’Elettronica, dai Controlli Automaticialle Reti Logiche.

Ma che cos’è un pendolo inverso? Esso non è altro che un pendolo sempli-ce «ribaltato»: quest’ultimo è costituito da una massa vincolata attraversoun filo inestensibile ad un punto fisso soprastante, che permette alla massadi compiere un moto oscillatorio nello spazio fino a che, in presenza di at-trito, non venga raggiunta la posizione di equilibrio, in cui la massa si trovaesattamente al di sotto del perno.Nel pendolo inverso il perno è posto al di sotto della massa e la posizionedi equilibrio si ha quando la massa si trova esattamente al di sopra del per-no. È facilmente intuibile che nel pendolo inverso, al posto del filo, ci saràbisogno di un’astina rigida che permetta alla massa di poter stare ad unadistanza fissa dal perno, al di sopra di esso e in particolare nella posizione diequilibrio.

viii

INTRODUZIONE

I due tipi di pendolo si differenziano principalmente nella stabilità della loroposizione di equilibrio: se si sposta di poco la massa da questa posizione, nelpendolo semplice (in presenza di attrito) la massa tenderà a tornarci dopoun certo tempo (posizione di equilibrio stabile), nel pendolo inverso invecela massa tenderà a cadere e non tornerà mai in posizione verticale (posizionedi equilibrio instabile).Per mantenere l’equilibrio del pendolo inverso sorge quindi la necessità dipoter agire attivamente su di esso: si può fare in modo che il perno al qualeè fissata l’asta rigida sia mobile, in modo tale da assecondare le perturbazionidella posizione di equilibrio per fare sì che la massa non cada.

Pertanto, nel progetto di questa tesi si è deciso di fissare il perno delpendolo inverso ad un sistema in grado di assumere varie posizioni su diun piano, costituito da un vecchio plotter a penna, un dispositivo utilizzatoper la stampa su supporti di grandi dimensioni che è possibile comandare apiacere inviando delle semplici istruzioni di tipo testuale.Per l’invio di queste istruzioni si è utilizzata una scheda di sviluppo, l’Altera R©DE1, che permette la realizzazione di sistemi integrati facilmente progetta-bili e configurabili in base ai requisiti che si hanno.Il cuore della scheda Altera R© DE1 è l’FPGA, un chip che, se opportuna-mente configurato e programmato, permette la realizzazione di circuiti logiciadatti ad ogni tipo di esigenza. Su questo chip è inoltre possibile implemen-tare un vero e proprio processore, chiamato Nios II, che verrà configuratoper effettuare il controllo del sistema e che pertanto provvederà ad inviareopportunamente le istruzioni al plotter su come muovere il suo carrello a cuiè fissato il pendolo.

Per quanto riguarda la struttura del pendolo inverso si è scelto di utiliz-zare una bacchetta per suonare lo xilofono, formata da un’astina rigida conuna pallina in legno fissata ad un’estremità.

Per fare sì che il pendolo rimanga in posizione verticale è necessario muo-vere il carrello del plotter sapendo di quanto e in quale direzione è inclinatal’astina del pendolo: si è quindi pensato di utilizzare come sensore per l’incli-nazione uno dei due joystick presente su un controller di una PlayStation R©.Si è smontato il joystick dal controller, lo si è saldato su una basetta milleforidi piccole dimensioni e si è fissata la bacchetta al joystick stesso, che costi-tuisce quindi sia il sensore per l’inclinazione, sia il perno per il pendolo. Labasetta è stata poi installata sul carrellino del plotter utilizzando una pastaadesiva e rimovibile, per non danneggiare il carrello.

Il joystick è costituito da due potenziometri disposti ortogonalmente chepermettono di rilevare l’inclinazione dell’asta lungo i due assi di rotazionepossibili (l’asta non può ruotare attorno al suo asse). Per poter ottenereun’indicazione sull’inclinazione del pendolo c’è bisogno di fornire in ingresso

ix

INTRODUZIONE

ai due potenziometri un segnale di ampiezza nota che verrà attenuato daidue potenziometri a seconda di quanto l’asta è inclinata nelle due direzioni.Per fornire il segnale di ingresso e poter leggere il segnale così modificatodai potenziometri si sono sfruttate le porte audio di ingresso ed uscita dicui la scheda DE1 è equipaggiata. Sulla basetta millefori si sono quindisaldate insieme al joystick due porte jack da 3.5mm per poter effettuare ilcollegamento.Sia la porta di ingresso ai potenziometri che quella di uscita sono dotate didue canali: uno per ognuno dei due potenziometri.

Sarebbe stato comodo poter fornire ai potenziometri un valore di tensio-ne continua e leggere poi il valore di questa tensione in uscita, ma il CODECcon cui è equipaggiata la scheda DE1 nasce per applicazioni in campo audio,e pertanto non consente né la generazione, né tantomeno l’acquisizione disegnali a bassa frequenza. Per ottenere un risultato simile a quello in cui siandrebbe ad utilizzare una tensione continua si è scelto allora di utilizzareun segnale di onda quadra che avesse una banda di frequenze compatibilecon le specifiche del CODEC audio montato sulla scheda di sviluppo.Supponendo che l’onda quadra sia ideale, calcolandone il valore assoluto sa-rebbe possibile ottenere la tensione continua desiderata. Non essendo idealeperò, per ottenere un risultato simile è stato necessario considerare multiplidel periodo del segnale, calcolarne il valore assoluto e farne la media.

Nella tesi si descriveranno com’è stata realizzata la logica che si occupadi compiere le due operazioni descritte, ovvero la generazione del segnale dionda quadra e il calcolo della media del valore assoluto di un multiplo di pe-riodo del segnale di onda quadra proveniente dall’uscita dei potenziometri,per entrambi i canali.

Grazie alla presenza del processore Nios II, è possibile gestire il sistemacosì realizzato via software: nella tesi si tratterà anche di come si possanoimpostare i parametri di frequenza e ampiezza dell’onda quadra generata edi come si possano leggere i dati di media calcolati dalla logica utilizzandodelle semplici procedure o funzioni in C.Si è inoltre realizzato un programma che permette di posizionare il carrellodel plotter in maniera che il pendolo vada nella posizione verticale di equi-librio, con l’ipotesi semplificativa che ci sia un operatore che mantenga ilpendolo ad un’inclinazione desiderata.

Ci sarà poi un breve capitolo dedicato al test della logica realizzata edinfine un tutorial in cui si spiegheranno passo per passo le operazioni dacompiere per poter far eseguire al processore i programmi in C utilizzati inquesta tesi. Questo tutorial è da intendersi come la continuazione del tutorialche si può trovare in [1], riguardante la realizzazione della parte logica delprogetto.

x

Ringraziamenti

Desidero ricordare tutti coloro che mi hanno aiutato nella stesura di questatesi: ad essi va la mia gratitudine.

Vorrei innanzitutto ringraziare il Professor Stefano Marsi per i preziosiinsegnamenti, i continui suggerimenti, le critiche e le osservazioni che hannopermesso la stesura di questa tesi.

Inoltre ringrazio sentitamente il Professor Sergio Carrato che è semprestato disponibile ad ascoltare i nostri dubbi e a proporre valide soluzioni,fornendoci oltretutto un bel po’ di materiale fondamentale per la realizza-zione di questo lavoro.

Intendo poi ringraziare il personale della Biblioteca tecnico-scientificadell’Università di Trieste, che ha sempre accolto prontamente le mie conti-nue richieste per prorogare le scadenze dei prestiti dei documenti dei qualimi sono servito per la stesura della tesi.

Ringrazio Stefano Bianchi, creatore del template in LaTeX che ho utiliz-zato come spunto per realizzare questa tesi e di cui ho molto apprezzato ilfrontespizio.

Naturalmente ringrazio Chiara, la validissima collega con cui ho passatol’estate lavorando a questo progetto, che mi ha proposto sempre validi sug-gerimenti durante la stesura e che mi ha sopportato giorno dopo giorno.

Infine ho desiderio di ringraziare con affetto i miei genitori, i colleghi egli amici che mi sono stati vicini nel corso di questi ultimi mesi.

Vorrei inoltre precisare che spetta a me, e a me solo, la responsabilitàper ogni errore contenuto in questa tesi.

xi

Parte I

Descrizione del sistema

1

Capitolo 1

Architettura del sistema

Come si è affermato nell’Introduzione, in questa tesi viene descritta la secon-da parte del lavoro svolto per il progetto e la realizzazione di un’architetturautilizzabile per il controllo di un pendolo inverso.Prima di parlare di come sono stati realizzati i componenti logici necessarialla realizzazione di questo progetto, si ritiene necessario fare in questo ca-pitolo un breve richiamo sull’architettura del sistema realizzato.I dettagli sul progetto e la documentazione sui componenti si possono tro-vare nella tesi «Progetto di un sistema per il controllo di un pendolo inversoattraverso attuatori elettromeccanici» [1] di Chiara Cremon, complementarea questa e costituente la prima parte del progetto.

Figura 1.1: Schema dei componenti principali del sistema

2

CAPITOLO 1. ARCHITETTURA DEL SISTEMA

1.1 Gli elementi del sistema

Nella Figura 1.1 sono stati schematizzati i componenti principali presentatinell’Introduzione: vi sono la scheda di prototipazione Altera R© DE1 [2][3]equipaggiata con un’FPGA Altera R© Cyclone II EP2C20F484C7 [4] (Figu-ra 1.2), un plotter a penna Graphtech MP4300 [5] (Figura 1.3), un’asta conuna pallina di legno ad un’estremità costituente il pendolo inverso (Figu-ra 1.4) e fissata al joystick della PlayStation R© che regola i due potenziometriposizionati parallelamente ai due assi di rotazione del pendolo (Figura 1.5).

Figura 1.2: La scheda di prototipazione Altera R© DE1

Figura 1.3: Il plotter Graphtech MP4300

Figura 1.4: L’asta

Il pendolo, fissato al joystick, è libero di ruotare lungo due assi di ro-tazione: per rilevare il suo moto si è pensato di utilizzare i potenziometri(che costituiscono il joystick) come partitori resistivi variabili che, fornita

3

CAPITOLO 1. ARCHITETTURA DEL SISTEMA

Figura 1.5: Basetta millefori con potenziometri, joystick e prese jack da3.5mm

una tensione d’ingresso, restituiscono una tensione d’uscita proporzionale aquella d’ingresso secondo un coefficiente variabile dipendente dall’inclinazio-ne dell’asta nelle due direzioni.Il coefficiente variabile dei due potenziometri nominalmente varia con l’in-clinazione in maniera prossima al lineare.

Per poter rendere possibile il collegamento tra i potenziometri e la schedaAltera R© DE1, il joystick è stato saldato su una basetta millefori insieme adue porte jack da 3.5mm (Figura 1.5). Potenziometri e scheda sono statiquindi collegati tramite due cavi stereo maschio-maschio con jack da 3.5mm:uno per l’input e uno per l’output dei potenziometri. La basetta milleforiè stata poi collocata sul carrello del plotter utilizzando una pasta adesiva erimovibile, per evitare il danneggiamento del carrello.

Si sarebbe voluto inviare ai due potenziometri una tensione continuadi valore noto per poi leggere la tensione fornita in uscita da essi e poterottenere, confrontando ingresso ed uscita, l’indicazione sull’inclinazione delpendolo che si vuole ottenere.

La scheda Altera R© DE1 non è però in grado di fornire o rilevare segnalianalogici alle basse frequenze, in quanto l’unico CODEC disponibile a bordoè il CODEC Audio Wolfson WM8731 [6], destinato all’acquisizione e all’e-missione di segnali che hanno una banda poco più ampia di quella dell’udibile(da circa 20Hz a circa 20 kHz).

Nel progetto del sistema è stato quindi necessario cercare di ottenerel’indicazione sull’angolazione del pendolo utilizzando un segnale che potes-se essere trattato dal CODEC audio installato sulla scheda e che desse unrisultato simile a quello che si otterrebbe utilizzando tensioni continue.

Si è scelto dunque di inviare a ciascuno dei due potenziometri un’ondaquadra analogica, che viene attenuata in ampiezza in maniera proporzionaleall’angolo di inclinazione dell’asta.

Nel caso ideale, considerandone il valore assoluto, l’onda quadra si com-

4

CAPITOLO 1. ARCHITETTURA DEL SISTEMA

porta esattamente come una tensione continua; essendo però il segnale nonideale, con transizioni dal livello alto al livello basso che quindi non sonoistantanee e con imperfezioni dovute ai filtri passabanda del CODEC sia iningresso che in uscita alla scheda DE1, per ottenere un buon risultato non èsufficiente analizzare in ogni istante il valore assoluto dell’onda quadra, maè necessario considerare qualche periodo del segnale, farne il valore assolutoe poi calcolarne una media.

La generazione del segnale di onda quadra ed il calcolo della media delvalore assoluto di una porzione del segnale in uscita dai potenziometri èaffidata a due blocchi logici che sono stati realizzati appositamente e chevengono implementati all’interno dell’FPGA.Essi però trattano esclusivamente dati digitali: si farà uso del CODEC audioa bordo della scheda ed in particolare dei convertitori D/A (per la genera-zione dell’onda quadra analogica) e A/D (per il campionamento del segnaleche proviene dai potenziometri).

Figura 1.6: Schema semplificato dell’architettura del sistema

La Figura 1.6 rappresenta quindi una descrizione del sistema più detta-gliata rispetto a quella vista in precedenza: all’interno della scheda DE1 visono ora indicati alcuni dei componenti che sono stati utilizzati nel progetto,

5

CAPITOLO 1. ARCHITETTURA DEL SISTEMA

tra cui i convertitori presenti nel CODEC audio e i due blocchi logici sopradescritti.

Nella figura compare anche il processore Nios II [7], implementabilesull’FPGA utilizzata e che servirà per gestire il movimento del carrello delplotter per via software, inviando dei comandi di posizione utilizzando unlinguaggio di tipo testuale. Il processore servirà anche per poter impostare iparametri (frequenza ed ampiezza) dell’onda quadra.

Infine, la scheda DE1 è connessa al plotter tramite una porta RS-232.Grazie ad essa, i comandi generati dal processore vengono inviati al plotter,che muoverà il carrello nella posizione desiderata, imprimendo una certaforza sul pendolo che modificherà la sua inclinazione.

1.2 Struttura della logica implementata

Si vuole ora andare ad elencare brevemente gli elementi che compongono lalogica implementata sull’FPGA. Per una trattazione approfondita di comequesti sono stati configurati ed interconnessi tra loro, si rimanda a [1].

La logica di questo progetto è stata implementata utilizzando il softwareQuartus II Web Edition, versione 13.0sp1 [8] (l’ultima che supporta la fa-miglia di FPGA Altera R© Cyclone II a bordo della scheda Altera R© DE1)ed il tool Qsys [9], che facilita il progetto di un sistema generando automa-ticamente i circuiti logici necessari alla connessione tra moduli elementaririutilizzabili, già pronti o creabili ad-hoc.Per lo sviluppo della logica si è scelto di realizzare un unico elemento strut-turale che prenderà come input e output segnali provenienti dai piedini fisicidell’FPGA.I blocchi che sono stati integrati all’interno di questo elemento, rappresentatischematicamente nella Figura 1.7, sono:

• due blocchi per la gestione dei segnali di clock [10] e di reset che vengonoutilizzati dai vari moduli;

• il processore Nios II, per la gestione del sistema via software;

• i generatori del segnale di onda quadra (uno per il canale destro e unoper il canale sinistro);

• i blocchi dedicati al calcolo della media dei campioni provenienti dalCODEC audio;

• un blocco (Audio) [11] che si occupa di gestire (ad esempio serializzandoe deserializzando) i dati in entrata o in uscita dal CODEC audio;

• un blocco dedicato alla configurazione tramite protocollo I2C [12] delCODEC audio [13];

6

CAPITOLO 1. ARCHITETTURA DEL SISTEMA

Figura 1.7: Rappresentazione dei blocchi presenti nel sistema generato inQsys

• un blocco dedicato alla gestione dei segnali per poter leggere e scriveresulla memoria SDRAM di cui la scheda Altera R© DE1 è equipaggiata[14];

• un blocco per la gestione dell’interfaccia RS-232 della scheda Altera R©DE1 [14];

• un blocco che permette lo scambio di dati con il Nios attraverso il cavoUSB-Blaster [14].

Nel prossimo capitolo ci si concentrerà sui blocchi evidenziati nella Figu-ra 1.7.

7

CAPITOLO 1. ARCHITETTURA DEL SISTEMA

Figura 1.8: Il sistema nel suo complesso

8

Capitolo 2

Realizzazione della logica perla generazione ed elaborazionedell’onda quadra

In questo capitolo si andrà a descrivere come sono stati realizzati i com-ponenti che si occupano di generare l’onda quadra, utilizzata come inputai potenziometri, e di calcolare la media dei valori ottenuti campionando ilsegnale di onda quadra proveniente dai potenziometri, quindi attenuato inampiezza.Prima di entrare nel dettaglio della realizzazione, è però necessario richiama-re brevemente alcune nozioni su Avalon MM e Avalon ST, le due interfacceprincipali per l’interconnessione tra blocchi in un sistema creato con il toolQsys.

2.1 Avalon MM e Avalon ST

Si vuole dare nei paragrafi seguenti una breve descrizione dei segnali utilizzatinelle interfacce Avalon MM e Avalon ST [15].Per una trattazione più approfondita si rimanda a [1].

2.1.1 Avalon MM

Le interfacce Avalon Memory-Mapped (Avalon-MM) consentono la lettura ela scrittura tra componenti di tipo master e di tipo slave in un sistema in cuigli ingressi e le uscite sono mappati in memoria (Memory-Mapped), ovveroin un sistema in cui viene utilizzato lo stesso bus per specificare l’indirizzofisico sia di memorie, che di interfaccie di input e output.Un Avalon-MMmaster utilizza un bus per specificare l’indirizzo che identificaun Avalon-MM slave e può leggere o scrivere dati utilizzando delle lineededicate.

9

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

Sebbene l’interfaccia Avalon-MM preveda l’utilizzo di numerosi segnali, qui sidarà un’indicazione sui soli segnali che sono stati utilizzati in questo progetto,in particolare riferiti ad un componente Avalon-MM slave.Nella Figura 2.1 sono illustrati i segnali che sono stati utilizzati nel progetto.

Figura 2.1: Segnali principali utilizzati in un’interfaccia Avalon-MM slave

Questi sono:

• address: bus utilizzato da un Avalon-MM master per specificare l’in-dirizzo di un Avalon-MM slave. Quest’ultimo riceve in input non l’in-dirizzo che l’Avalon-MM master ha specificato ma un indirizzo relativo,per cui l’indirizzo base risulta sempre essere 0;

• chipselect: segnale che, se al livello logico alto, indica all’Avalon-MMslave che dovrà ricevere o inviare dei dati ad un Avalon-MM master;

• read: segnale che, se al livello logico alto, indica la volontà di unAvalon-MM master di voler leggere un dato dall’Avalon-MM slave;

• write: segnale che, se al livello logico alto, indica la volontà di unAvalon-MM master di voler inviare un dato per l’Avalon-MM slave;

• writedata: bus su cui viaggiano i dati che un Avalon-MMmaster vuoletrasmettere ad un Avalon-MM slave;

• readdata: bus su cui viaggiano i dati che un Avalon-MM slave tra-smette ad un Avalon-MM master dopo aver ricevuto da quest’ultimouna richiesta di lettura di un dato.

2.1.2 Avalon ST

Per i componenti che necessitano di trasmettere in una sola direzione segnalia banda larga e con bassi tempi di trasmissione risulta conveniente utilizzarele interfacce di tipo Avalon Streaming (Avalon-ST).La trasmissione dei dati avviene seguendo varie possibili metodologie, a se-conda della complessità dei componenti.È previsto che vi sia una sorgente (source), l’estremità dell’interfaccia del

10

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

componente che invia il dato, ed un «pozzo» (sink), l’estremità dell’interfac-cia del componente che riceve il dato.Analogamente all’Avalon-MM, anche l’interfaccia Avalon-ST predispone nu-merosi segnali da poter utilizzare: si analizzeranno però solo i segnali prin-cipali necessari alla riuscita di una semplice comunicazione ed utilizzati inquesto progetto.Nella Figura 2.2 sono evidenziati i tre segnali chiave nella trasmissione didati da un Avalon-ST source ad un Avalon-ST sink.

Figura 2.2: Segnali principali utilizzati in un’interfaccia Avalon-ST

Questi sono:

• valid: posto al livello logico alto dall’Avalon-ST source quando il datoè pronto per la trasmissione;

• ready: posto al livello logico alto dall’Avalon-ST sink quando questo èpronto a ricevere un nuovo dato;

• data: bus su cui viaggiano i dati da trasmettere.

2.2 Blocco «onda_quadra»: generazione dell’onda qua-dra

Per poter rilevare l’inclinazione del pendolo inverso si è scelto di fornire ininput ai due potenziometri utilizzati, attraverso un cavo audio stereo, duesegnali di onda quadra con caratteristiche identiche di ampiezza e frequenza.Per poter ottenere il segnale analogico necessario, si è andati a creare unalogica che realizzasse un segnale digitale di onda quadra che verrà poi fornitoal convertitore digitale/analogico a bordo della scheda DE1.Questo blocco, descritto in Verilog [16][17] e che si andrà a chiamare «onda_quadra»(il codice sorgente completo si può trovare all’Appendice A.1), è stato pen-sato per poter essere integrato all’interno di un sistema realizzato con il toolQsys, realizzando quindi una nuova interfaccia [18] per un più facile riutiliz-zo e per semplificare la creazione della logica necessaria per la gestione delloscambio di dati con i blocchi realizzati da terze parti presenti nella libreria

11

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

delle interfacce di Qsys ed utilizzati nel progetto.

Il blocco è stato progettato per generare un unico segnale digitale di ondaquadra: dovendo fornire il segnale a due potenziometri, è stato necessarioaggiungere al sistema in Qsys due istanze dello stesso blocco, una per ilcanale audio sinistro ed una per il canale audio destro. Un’istanza sola nonbasterebbe poiché non è possibile collegare un’interfaccia Avalon ST sourcecontemporaneamente a due interfacce Avalon ST sink.

All’interno del sistema in Qsys, le due istanze del blocco onda_quadra,dotate di interfacce Avalon-ST source sono state collegate alle due interfacceAvalon-ST sink del blocco Audio dedicate ai due canali audio destro e sini-stro.Quest’ultimo blocco si occupa, tra le altre cose, di prelevare ad una deter-minata frequenza (la stessa con la quale si è impostato il CODEC audio) idati (campioni) che costituiscono i segnali di onda quadra, serializzarli edinviarli al convertitore digitale/analogico che fornirà all’esterno della schedai segnali analogici di onda quadra desiderati.Le due istanze di onda_quadra sono state inoltre collegate tramite interfacceAvalon-MM slave anche al processore Nios II, per permettere di impostaredifferenti valori di frequenza e ampiezza del segnale via software.

2.2.1 Realizzazione del modulo onda_quadra

Figura 2.3: Segnali di input/output del blocco «onda quadra»

Prima di tutto, sono state definite le porte di input e output del moduloonda_quadra: oltre ai segnali clock (il clock che, nel sistema utilizzato, hauna frequenza di 50MHz) e reset, si sono predisposti i segnali necessari perl’utilizzo delle interfacce Avalon-ST (ready, valid e audio, dove quest’ulti-mo costituisce il bus su cui viaggiano i dati da trasmettere) e Avalon-MM(chipselect, address, write e writedata). Si noti che non si sono utilizza-ti, per quanto riguarda l’interfaccia Avalon-MM, i segnali read e readdata in

12

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

quanto non era necessario implementare alcuna funzionalità che permettessedi prelevare qualche tipo di informazione dal blocco.Per le porte di output è stato necessario definire i tipi di dato a loro associa-te: per i dati che necessitano di essere memorizzati, si è scelto di utilizzare itipi di dato Verilog reg, mentre per le variabili che devono assumere valoriottenuti da un’espressione o pari ad un dato conservato in un registro si èdeciso di utilizzare il tipo wire, come nel caso del bus audio.

7 module onda_quadra8 (9 //INPUTS10 input c lock , r e s e t ,11 //Avalon ST12 input ready ,13 //Avalon MM14 input [ 1 : 0 ] address ,15 input ch i p s e l e c t , wr ite ,16 input [ 3 1 : 0 ] wr itedata ,1718 //OUTPUTS19 //Avalon ST20 output reg va l i d = 1 ,21 output wire [ 1 5 : 0 ] audio22 ) ;

Sono stati poi definiti alcuni registri interni che permettono il funziona-mento del modulo: ampiezza, in cui viene memorizzato il valore dell’am-piezza dell’onda quadra, di default impostato a 10, 000 (dove per ampiezzasi intende la semiampiezza dell’escursione che il segnale compie passando dalfronte alto, +ampiezza, al fronte basso, -ampiezza), contatore, che tieneconto di quanti campioni vengono inviati al blocco Audio per ogni semipe-riodo del segnale, permettendo quindi di ottenere una frequenza desidera-ta, campioni, in cui è memorizzato il numero di campioni da inviare perogni semiperiodo ed infine flag, un segnale ausiliario che permette di farincrementare correttamente il contatore.

25 reg [ 1 5 : 0 ] ampiezza = 16 ’ d10000 ;26 reg [ 1 5 : 0 ] contato re = 16 ’ d0 ;27 reg [ 3 1 : 0 ] campioni = 32 ’ d24 ;28 reg f l a g = 1 ;

È da notare che il bus audio è di tipo wire, ed ampiezza sarà il suodriver:

30 assign audio = ampiezza ;

13

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

Come si è accennato in precedenza, il blocco Audio preleva dai moduliche generano l’onda quadra un campione per il dato sinistro ed un campioneper il dato destro con una frequenza pari a quella di lavoro del convertitoreD/A ovvero, nel caso di questo progetto, 48 kHz.I dati prelevati vengono poi serializzati e forniti ai convertitori D/A per i duecanali del CODEC audio, che si occuperanno di generare i segnali analogicidi onda quadra.Sfruttando il fatto che i convertitori elaborano 48, 000 campioni al secondo,per ottenere una particolare frequenza dell’onda quadra si è pensato di agi-re sul valore memorizzato nel registro campioni: in ogni periodo dell’ondaquadra digitale vi saranno un numero (intero) pari a 2 · campioni campioni.La frequenza fout dell’onda quadra in uscita dal blocco sarà quindi pari a

fout =48, 000

2 · campioni=

24, 000

campioniHz (2.2.1)

Se si desidera ottenere un’onda quadra di frequenza fdesHz, basteràimpostare il valore di campioni come:

campioni =24, 000

fdes, campioni ∈ N (2.2.2)

Da questa relazione si nota come non sia possibile impostare un qualsiasivalore di frequenza: campioni dev’essere infatti un numero intero, e quindifdes dovrà essere tale che 24,000

fdes∈ N, ovvero dovrà essere un sottomultiplo

(intero) di 48,0002 = 24, 000

Per non appesantire la logica si è scelto di non fare alcun controllo sul-l’interezza di campioni quando viene fornito un valore di fdes attraversol’interfaccia Avalon-MM: ci si assicurerà invece che la condizione venga ri-spettata quando si realizzerà la procedura in C per permettere di impostareuna frequenza a piacere tramite software (vedi Paragrafo 5.1).

La frequenza di default che si è voluto utilizzare per il blocco è 1 kHz:campioni è stato quindi inizializzato a 24,000

1,000 = 24 (riga 27).

Per poter operativamente inviare un campione 48, 000 volte al secon-do, si è deciso di mantenere il segnale di valid costantemente alto (riga20), sfruttando il fatto che il blocco Audio preleverà i campioni alla fre-quenza di 48 kHz. Il blocco Audio invierà infatti a ciascuno dei due modulionda_quadra un impulso di ready 48, 000 volte al secondo, che segnala l’av-venuta acquisizione del campione.Ciò si può vedere nella Figura 2.4, dove viene rappresentata una simulazio-ne in cui si può osservare il comportamento dei segnali LRCK (il segnale a48 kHz utilizzato dal CODEC audio per scandire l’acquisizione dei dati de-stinati al canale sinistro, quando LRCK è alto, ed al canale destro, quandoLRCK è basso), ready e valid riferiti al solo canale sinistro (per il canale

14

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

Figura 2.4: Simulazione dei segnali LRCK, ready e valid relativi al bloccoonda_quadra

destro la situazione è analoga, solo che gli impulsi di ready vengono inviatiin corrispondenza del fronte negativo del segnale LRCK).

Si è quindi fatto in modo che, quando viene rilevato un impulso diready, si incrementi contatore il quale, quando raggiunge un valore paria campioni, viene azzerato. Contemporaneamente, il valore contenuto nelregistro ampiezza viene cambiato di segno (righe 64-67).Il registro flag è necessario perché l’impulso di ready dura due colpi di clocka 50MHz e ciò, se non si utilizzasse una variabile ausiliaria, farebbe incre-mentare il contatore di due unità per ogni impulso.flag, posto inizialmente a 1, viene portato a 0 quando viene rilevato chesia ready che flag stesso sono alti. Allo stesso tempo viene incrementato ilcontatore (righe 55-58), che non viene ulteriormente incrementato se inveceready è alto e flag non lo è. Quest’ultimo viene riportato al livello alto soloquando viene rilevato che sia ready che flag sono uguali a 0, ovvero quandoè terminato l’impulso di ready (righe 60-62).

55 i f ( ready && f l a g ) begin56 contato re <= contato re + 1 ’ d1 ;57 f l a g <= 0 ;58 end5960 i f ( ! ready && ! f l a g ) begin61 f l a g <= 1 ;62 end6364 i f ( contato re == campioni ) begin65 ampiezza <= −ampiezza ;66 contato re <= 0 ;67 end

È stata inoltre implementata la possibilità di eseguire un reset asincronoche azzera il contatore, imposta i valori predefiniti di ampiezza e campioni(per ottenere un’onda quadra di ampiezza 10, 000 a 1 kHz) e porta il segnalevalid ed il segnale ausiliario flag al valore 1 di default:

15

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

32 always @(posedge c l o ck or posedge r e s e t ) begin33 i f ( r e s e t ) begin34 va l i d <= 1 ;35 contato re <= 0 ;36 ampiezza <= 16 ’ d10000 ;37 campioni <= 32 ’ d24 ;38 f l a g <= 1 ;39 end

Infine, il resto del codice è stato dedicato all’impostazione della frequenzae dell’ampiezza dell’onda quadra tramite interfaccia Avalon-MM.Se l’indirizzo relativo indicato dal processore Nios II è 0, è possibile cambia-re la frequenza dell’onda agendo sulla variabile campioni come descritto inprecedenza.Se l’indirizzo indicato è invece 1, è possibile cambiare il valore del registroampiezza a piacere (tenendo conto che il generatore di onda quadra ammetteampiezze positive e negative a 16 bit scritte in notazione complementata a2).

43 i f ( c h i p s e l e c t && wr i t e ) begin4445 i f ( address == 2 ’ h0 ) begin46 campioni [ 3 1 : 0 ] <= 24000/( wr i tedata [ 3 1 : 0 ] ) ;47 end4849 i f ( address == 2 ’ h1 ) begin50 ampiezza [ 1 5 : 0 ] <= wri tedata [ 1 5 : 0 ] ;51 end5253 end

Il codice sorgente Verilog descritto dovrà essere utilizzato per creare unnuovo componente in Qsys, avendo cura di assegnare correttamente i segnaliutilizzati ai tipi di segnale previsti dalle interfacce Avalon-ST e Avalon-MM.

16

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

2.3 Blocco «media»: calcolo della media dei cam-pioni in entrata

L’onda quadra attenuata in ampiezza dai potenziometri viene fatta arrivareal convertitore A/D della scheda Altera R© DE1, i cui dati seriali in uscitavengono trattati dal blocco Audio che li rende disponibili alle sue interfacceAvalon-ST source (una per il canale sinistro ed una per il canale destro) informa parallela, alla frequenza di campionamento del CODEC, ovvero 48 kHznel caso di questo progetto.Date le limitazioni dovute al fatto che l’onda quadra non è ideale, per ottene-re l’indicazione sull’ampiezza dell’onda (e quindi sull’inclinazione lungo unadirezione dell’asta del pendolo, ad essa proporzionale) non basta prelevareun valore e calcolarne il valore assoluto: è necessario raccogliere un numerosufficientemente elevato di campioni, farne il valore assoluto e calcolarne lamedia. Dato che inoltre l’andamento di un’onda quadra reale ha comporta-menti differenti per quanto riguarda il fronte di salita ed il fronte di discesa,per ottenere un buon risultato si dovrà fare in modo tale che il numero dicampioni su cui calcolare la media sia un multiplo del numero dei campionipresenti in un periodo dell’onda quadra. È questo il compito del blocco,chiamato «media», che si è andati realizzare (il codice sorgente completo sipuò trovare all’Appendice A.2).

Anche in questo caso il modulo in Verilog è stato progettato per poteressere aggiunto alla libreria di interfacce predisposte dal tool Qsys, ed inoltreeseguirà le sue funzioni trattando un solo canale audio: all’interno del sistemain Qsys sarà necessario creare due istanze del blocco media, una per ognicanale.

Ciascuna delle due istanze è predisposta di un’interfaccia Avalon-ST sink,grazie alla quale si riceveranno, per ogni canale ad una frequenza di 48 kHz, idati provenienti dalle interfacce Avalon-ST source del blocco Audio; le istan-ze sono inoltre dotate di un’interfaccia Avalon-MM slave, che permette lalettura tramite software dei dati calcolati dal blocco ed il passaggio di infor-mazioni sulla frequenza dell’onda quadra che si sta utilizzando.

17

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

2.3.1 Realizzazione del modulo media

Figura 2.5: Segnali di input/output del blocco «media»

Inizialmente sono state definite le porte di input e output del modulo, tra cuiclock e reset ed i segnali necessari all’utilizzo delle interfacce Avalon-ST eAvalon-MM:

10 module media11 (12 //INPUTS13 input c lock , r e s e t ,14 //Avalon ST15 input va l id ,16 input signed [ 1 5 : 0 ] audio ,17 //Avalon MM18 input [ 1 : 0 ] address ,19 input ch i p s e l e c t , read , write ,20 input [ 1 5 : 0 ] wr itedata ,2122 //OUTPUTS23 //Avalon ST24 output reg ready = 1 ,25 //Avalon MM26 output reg [ 1 5 : 0 ] readdata27 ) ;

A differenza del blocco onda_quadra, per quanto concerne l’interfacciaAvalon-MM, sono state qui predisposte le porte read e readdata, necessarieperché il blocco media dovrà poter fornire i risultati delle sue elaborazioni alprocessore Nios II.

18

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

Sono stati poi definiti i registri ed un bus di tipo wire interni, tra cui:audio_reg in cui viene immagazzinato il dato proveniente dal blocco Audioquando questo è segnalato come valido, aubio_abs, variabile di tipo wireche ha come driver un’espressione che permette il calcolo del valore assolutodel registro audio_reg (riga 36), somma in cui viene immagazzinata la som-ma temporanea dei campioni, somma_stored in cui viene registrato il valorefinale di somma ogni qualvolta il blocco ha completato la somma del numerodi campioni desiderato, contatore, che tiene conto del numero di campionisommati fino ad un certo istante e campioni, il registro che contiene l’infor-mazione sul numero di campioni da sommare.

30 reg signed [ 1 5 : 0 ] audio_reg ;31 wire [ 1 5 : 0 ] audio_abs ;32 reg [ 3 1 : 0 ] somma , somma_stored ;33 reg [ 1 5 : 0 ] contato re = 0 ;34 reg [ 3 1 : 0 ] campioni = 144 ;3536 assign audio_abs [ 1 5 : 0 ] = audio_reg [ 1 5 ] ? (~( audio_reg

[ 1 5 : 0 ] ) + 1 ’ b1 ) : ( audio_reg [ 1 5 : 0 ] ) ;

Come accennato, alla riga 36 del codice in Verilog riportato si assegna aaudio_abs il valore assoluto del registro audio_reg: per calcolarlo, tenendopresente che i dati registrati in audio_reg sono di tipo signed e sono rap-presentati in notazione complementata a 2, si è scelto di fare un controllo sulbit più significativo del registro; se questo risulta essere 0 significa che il nu-mero registrato in audio_reg è positivo e perciò si fa in modo che audio_absassuma questo valore; se invece il bit più significativo è pari a 1, il numerorappresentato è negativo: si calcola allora il complemento a 2 di audio_regnegando il bus bit per bit (utilizzando l’operatore ~) e sommandoci 1, pas-sando infine questo valore ad audio_abs.

Per l’acquisizione dei dati si procede facendo un controllo sul segnale divalid proveniente da una delle due interfacce del blocco Audio.Inizialmente il segnale di ready lo si è posto 1 per indicare al blocco Audioche si è pronti a ricevere un nuovo dato.

Nella Figura 2.6 viene rappresentata una simulazione di come vengonogestiti i segnali LRCK, ready e valid relativi al solo canale sinistro, sui qualisi basa l’acquisizione dei dati a 48 kHz.

Il blocco Audio invierà 48, 000 volte al secondo per ogni canale un impul-so di valid per indicare che il dato fornito sulla corrispondente interfacciaAvalon-ST source è valido: se quindi sia ready che valid risultano essereallo stato alto, si è scelto di salvare nel registro audio_reg il valore che si

19

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

Figura 2.6: Simulazione dei segnali LRCK, ready e valid relativi al bloccomedia

trova sulla porta audio di input. Contemporaneamente, ready viene portatoa 0 per indicare che il blocco media è in fase di elaborazione:

56 i f ( ready && va l i d ) begin57 audio_reg <= audio ;58 ready <= 0 ;59 end

audio_abs a questo punto avrà assunto il valore assoluto del numeroregistrato in audio_reg (riga 36); controllando che l’impulso di valid siaterminato, se il contatore indica che è necessario sommare ulteriori campio-ni, in somma viene fatto in modo che al valore precedentemente registratovenga aggiunto il valore presente sul bus audio_bus, contatore viene fattoincrementare e, dato che a questo punto sarà possibile acquisire un nuovodato, ready viene posto nuovamente a 1:

62 else i f ( ( ! ready ) && ( contato re < campioni ) && ( ! va l i d )) begin

63 somma <= somma + audio_abs ;64 contato re <= contato re+1’b1 ;65 ready <= 1 ;66 end

Quando si è sommato il numero di campioni desiderato, ovvero quan-do il contatore assume un valore pari a campioni, si è scelto di registra-re in somma_stored il dato in quel momento contenuto nel registro somma;quest’ultimo, insieme a contatore, viene poi azzerato:

68 else i f ( contato re == campioni ) begin69 somma_stored <= somma ;70 somma <= 32 ’ d0 ;71 contato re <= 13 ’ d0 ;72 end

Così facendo è possibile accedere al valore salvato in somma_stored men-tre viene effettuata contemporaneamente un’altra operazione di somma sunuovi campioni.

20

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

Essendo l’operazione di divisione molto dispendiosa in termini di risorse,per non rallentare il funzionamento della logica si è scelto di registrare ilvalore della somma del valore assoluto dei campioni e non la loro effettivamedia aritmetica. Quest’ultima, ottenuta dalla divisione tra somma_storede campioni, verrà calcolata solamente se richiesta dal processore Nios IItramite interfaccia Avalon-MM all’indirizzo relativo 0 (righe 84 e 85).

77 always @(posedge c l o ck or posedge r e s e t )78 begin7980 i f ( r e s e t ) readdata <= 32 ’ d0 ;8182 else i f ( c h i p s e l e c t && ( read ) )83 begin84 i f ( address == 2 ’ h0 ) //media85 readdata <= somma_stored/ campioni ;86 else i f ( address == 2 ’ h1 ) // dato87 readdata <= audio_reg ;88 else i f ( address == 2 ’ h3 ) // campioni89 readdata <= campioni ;90 else91 readdata <= 15 ’ d0 ;92 end93 end

Come si può notare dal codice, è stata implementata anche la possibilitàdi richiedere al blocco media, tramite interfaccia Avalon-MM, il dato salvatonel registro audio_reg (utile ad esempio per visualizzare i dati codificati dalconvertitore A/D), richiedendo un dato all’indirizzo relativo 1 (righe 86-87),e il numero di campioni su cui si sta eseguendo la media, richiedendo un datoall’indirizzo relativo 3 (righe 88-89).

Analogamente al caso del blocco onda_quadra, è da notare che il nu-mero di campioni su cui calcolare la media dev’essere intero. Inoltre, comespecificato in precedenza, si è scelto che esso sia un multiplo del numerodi campioni presenti in un periodo dell’onda quadra campionata fornita dalblocco Audio.Di default, l’onda quadra generata dal blocco che si è realizzato ha comeparametri un’ampiezza di 10, 000 e una frequenza di 1 kHz. Tenuto contoche il convertitore A/D ha una frequenza di campionamento di 48 kHz, siottiene che il numero nT,1 kHz di campioni presenti in un periodo dell’ondaquadra è:

nT,1 kHz =48, 000

1000= 48 (2.3.1)

21

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

Sperimentalmente si è osservato che un buon risultato di media, convariazioni trascurabili e che approssimasse bene il valore dell’ampiezza del-l’onda quadra in ingresso alla scheda DE1, si ottiene facendo la media su 3o più periodi del segnale.Si è scelto quindi di impostare il valore di default di campioni a:

campioni = nT,1 kHz · 3 = 48 · 3 = 144 (2.3.2)

Se però la frequenza dell’onda quadra utilizzata nel sistema non fossequella di default, ad 1 kHz, è necessario che venga specificata tramite inter-faccia Avalon-MM (utilizzando l’indirizzo relativo 2) la frequenza in uso:

50 i f ( c h i p s e l e c t && ( wr i t e == 1 ’ b1 ) ) begin51 i f ( address == 2 ’ h2 ) // f requenza52 campioni <= 144000/( wr i tedata [ 1 5 : 0 ] ) ; // 3∗(48000/

wr i t eda ta )53 end

Il numero di campioni su cui dovrà essere effettuata la media è calcolatocome:

campioni = nT · 3 (2.3.3)

dove nT , se fdes Hz è la frequenza desiderata, è in generale pari a:

nT =48, 000

fdes, nT ∈ N (2.3.4)

Anche qui, come nel caso del blocco onda_quadra, si pone il problemasulla scelta della frequenza desiderata: essa deve rendere nT intero, e perchéquesto avvenga essa dovrà essere un sottomultiplo intero di 48, 000.

Per non appensantire la logica, si è scelto di non effettuare il control-lo sull’interezza di nT , bensì si è deciso di lasciare alla procedura in C chepermetterà l’impostazione della frequenza dell’onda quadra (vedi Paragrafo5.1) il compito di inviare ai blocchi onda_quadra e media un valore fdes difrequenza ammissibile.

Infine si è implementata la possibilità di eseguire un reset asincrono cheazzera i valori registrati in somma, audio_reg, somma_stored e contatore ereimposta il valore di default di campioni a 144:

38 always @(posedge c l o ck or posedge r e s e t )39 begin40 i f ( r e s e t ) begin41 somma <= 32 ’ d0 ;

22

CAPITOLO 2. REALIZZAZIONE DELLA LOGICA PER LAGENERAZIONE ED ELABORAZIONE DELL’ONDA QUADRA

42 audio_reg <= 0 ;43 somma_stored <= 32 ’ d0 ;44 contato re <= 13 ’ d0 ;45 campioni <= 144 ;46 end

Analogamente al blocco onda_quadra anche per il blocco media bisogne-rà effettuare la procedura per creare un nuovo componente in Qsys, avendocura di assegnare correttamente le porte predisposte di input e output ai tipidi segnale previsti dalle interfacce Avalon-ST e Avalon-MM.

23

Capitolo 3

Il pendolo inverso

3.1 Introduzione

Il pendolo semplice è un sistema fisico costituito da un corpo puntiformedotato di massa incernierato, per mezzo di un filo inestensibile, ad un pernoattorno al quale è libero di oscillare.

Nel pendolo inverso il corpo puntiforme è posto al di sopra del perno edè ad esso vincolato attraverso un’asta rigida, considerabile priva di massa.Il perno inoltre è libero di muoversi in una o più direzioni per garantire l’e-quilibrio del pendolo, ovvero per mantenere la posizione verticale dell’asta.Solitamente il perno si trova montato su un carrello soggetto ad una forzache ne determina il movimento.A seconda del numero di direzioni in cui il carrello e l’asta possono muoversisi parlerà di pendolo inverso ad uno o due gradi di libertà.Per semplicità si andrà ad analizzare il comportamento del pendolo inversoad un grado di libertà: per trattare il caso a due gradi di libertà come quellodel progetto, basterà proiettare il pendolo su due piani perpendicolari traloro (e paralleli ai due assi di rotazione del pendolo) e trattare le proiezionicome se fossero indipendenti [19].

3.2 Descrizione del modello matematico del pendo-lo inverso ad un grado di libertà

Assunta come ulteriore ipotesi semplificativa l’assenza di attriti nella cernie-ra, il sistema può essere rappresentato come nella Figura 3.1.

Vi è un corpo puntiforme di massa m fissato ad uno degli estremi diun’asta rigida incernierata all’altro estremo al baricentro di un carrello dimassa M .L’asta, di lunghezza l e massa trascurabile, forma con l’asse verticale unangolo θ(t).

24

CAPITOLO 3. IL PENDOLO INVERSO

Figura 3.1: Modello di un pendolo inverso ad un grado di libertà

I è il momento di inerzia dovuto al corpo puntiforme, rispetto all’asse dirotazione passante per il punto P , baricentro del carrello. Al carrello èapplicata una forza esterna ~F (t), parallela all’asse x e che imprime lungoquesta direzione un’accelerazione al carrello il cui baricentro si trova in ogniistante nella posizione x(t).Nella stessa direzione di ~F (t) ma in verso opposto, è presente una forza diattrito viscoso ~Fatt(t) = k ∂x∂t di coefficiente k.Sul perno infine agiscono due forze ~Ra(t) e ~Rc(t), uguali ed opposte: la prima(~Ra(t)) è esercitata sull’asta, la seconda (~Rc(t)) è esercitata sul carrello.Osservazione 1.Si noti che per la descrizione di questo modello si è scelto, per semplicità,di supporre che l’asta sia priva di massa. Dato che però si è tenuto contodel momento di inerzia I di asta e corpo puntiforme, il modello descritto èapplicabile anche ad un generico corpo rigido incernierato al carrello, a pattoche di esso si conoscano momento di inerzia e posizione del baricentro.

3.3 Dinamica del pendolo inverso

In questa sezione si andrà a studiare il comportamento del sistema nel tem-po.Per farlo, si analizzeranno separatamente le dinamiche dei due sottosistemiasta (comprendente l’asta rigida ed il corpo puntiforme) e carrello, studiando

25

CAPITOLO 3. IL PENDOLO INVERSO

il moto traslatorio ed il moto rotatorio per entrambi i casi.Si procederà poi al calcolo della funzione di trasferimento del sistema linea-rizzato per esprimere il comportamento del sistema, mettendone in relazioneingresso ed uscita.

3.3.1 Dinamica dell’asta

Moto traslatorio

Per lo studio del moto traslatorio dell’asta si andranno a trattare separata-mente le forze che agiscono lungo l’asse x e lungo l’asse y.

Figura 3.2: Diagramma di corpo libero dell’asta

In Figura 3.2 sono rappresentate le forze agenti sull’asta.Come si può notare, la forza ~Ra(t) si può scomporre in due forze ~Ra,x(t) e~Ra,y(t) dirette rispettivamente lungo gli assi x e y.Applicando la seconda legge di Newton separatamente agli assi x e y siottiene: {

~Ra,x(t) = m~ax~Ra,y(t) +m~g = m~ay

(3.3.1)

Dove ~ax e ~ay costituiscono l’accelerazione dell’asta lungo gli assi x e y e~g è l’accelerazione gravitazionale (diretta nel senso negativo dell’asse y).

26

CAPITOLO 3. IL PENDOLO INVERSO

Riscrivendo le equazioni in termini delle componenti si ha:{Ra,x(t) = max

Ra,y(t)−mg = may(3.3.2)

Si noti il cambio di segno nella seconda equazione.Preso un sistema di riferimento come nella Figura 3.2, la posizione istantaneadel baricentro dell’asta risulta essere:{

xb(t) = x(t) + l sin θ(t)

yb(t) = l cos θ(t)(3.3.3)

Le componenti delle accelerazioni ax e ay si possono quindi scrivere comederivate seconde della posizione istantanea del baricentro:{

ax = ∂2xb(t)∂t2

= ∂2[x(t)+l sin θ(t)]∂t2

ay = ∂2yb(t)∂t2

= ∂2[l cos θ(t)]∂t2

(3.3.4)

Sostituendo le 3.3.4 nelle 3.3.2 si ottiene quindi la descrizione del mototraslatorio dell’asta: {

Ra,x(t) = m∂2[x(t)+l sin θ(t)]∂t2

Ra,y(t)−mg = m∂2[l cos θ(t)]∂t2

(3.3.5)

Moto rotatorio

Per lo studio del moto rotatorio si devono andare a studiare i momenti delleforze agenti sul sistema asta.Prendendo sempre come riferimento la Figura 3.2, si può scegliere come poloper il calcolo dei momenti il baricentro dell’asta di coordinate (xb(t), yb(t)).Il momento meccanico totale dell’asta Mz(t) calcolato nel polo (xb(t), yb(t))è dato dalla somma dei momenti delle forze:

Mz(t) = Ra,y(t)l sin θ(t)−Ra,x(t)l cos θ(t) (3.3.6)

Mz(t) ha verso entrante nel foglio (se i e j sono i versori lungo gli assi x ey, Mz(t) giace sulla direzione e verso di j × i). Assumendo come positivoil verso orario di rotazione e supponendo I costante nel tempo, si può scri-vere l’equazione del moto rotatorio uguagliando Mz(t) con il prodotto delmomento angolare I e l’accelerazione angolare ∂2θ

∂t2:

Mz(t) = I∂2θ(t)

∂t2(3.3.7)

ovvero, sostituendo l’espressione di Mz(t):

Ra,y(t)l sin θ(t)−Ra,x(t)l cos θ(t) = I∂2θ

∂t2(3.3.8)

27

CAPITOLO 3. IL PENDOLO INVERSO

Equazioni del moto dell’asta

Unendo i risultati dati dall’analisi dei moti traslatorio e rotatorio dell’asta,si ottiene il seguente sistema che descrive la dinamica dell’asta:

Ra,x(t) = m∂2[x(t)+l sin θ(t)]∂t2

Ra,y(t)−mg = m∂2[l cos θ(t)]∂t2

Ra,y(t)l sin θ(t)−Ra,x(t)l cos θ(t) = I ∂2θ∂t2

(3.3.9)

3.3.2 Dinamica del carrello

Il carrello può muoversi solo lungo l’asse x e senza nessuna componente ditipo rotatorio: la sua dinamica sarà semplicemente descritta dallo studiodelle forze agenti lungo la direzione del suo spostamento.

Figura 3.3: Diagramma di corpo libero del carrello

Analogamente allo studio della dinamica dell’asta, osservando il diagram-ma di corpo libero di Figura 3.3 (dove si sono volutamente omesse le forzeagenti sull’asse verticale, che non porterebbero a nessun risultato utile allostudio del sistema) e applicando la seconda legge di Newton si ottiene:

F (t)−Rc,x(t)− k∂x(t)

∂t= M

∂2x(t)

∂t2(3.3.10)

L’Equazione 3.3.10 descrive la dinamica del carrello.

28

CAPITOLO 3. IL PENDOLO INVERSO

3.3.3 Equazioni di moto del sistema

Unendo i risultati ottenuti nello studio dei due sottosistemi asta e carrello,si ottiene il sistema 3.3.11 che descrive la dinamica complessiva del pendoloinverso:

Ra,x(t) = m∂2[x(t)+l sin θ(t)]∂t2

IRa,y(t)−mg = m∂2[l cos θ(t)]

∂t2II

Ra,y(t)l sin θ(t)−Ra,x(t)l cos θ(t) = I ∂2θ∂t2

IIIF (t)−Rc,x(t)− k ∂x(t)∂t = M ∂2x(t)

∂t2IV

(3.3.11)

Tenendo conto che Ra,x = Rc,x, questo sistema può essere ridotto sostituendole espressioni di Ra,x(t) e Ra,y(t) (ricavate dalle equazioni I e II) nella III enella IV.Si ottiene quindi il sistema (non lineare) che descrive la dinamica del pendolo:ml(

∂2[l cos θ(t)]∂t2

+ g) sin θ(t)−ml(∂2[x(t)+l sin θ(t)]

∂t2

)cos θ(t) = I ∂

2θ(t)∂t2

F (t)−m(∂2[x(t)+l sin θ(t)]

∂t2

)− k ∂x(t)∂t = M ∂2x(t)

∂t2

(3.3.12)

3.3.4 Funzione di trasferimento

Si vuole ora andare a calcolare la funzione di trasferimento del sistema, perottenere una relazione tra ingresso ed uscita più agevole da trattare di unsistema non lineare di equazioni differenziali.Per farlo è necessario innanzitutto linearizzare il sistema. Dato che l’obiettivoè di mantenere il pendolo nella posizione di equilibrio (θ = 0), il sistemapuò essere linearizzato supponendo che θ(t) sia prossimo a 0, così da poterapplicare le seguenti approssimazioni:

θ(t) ≈ 0 =⇒ sin θ(t) ≈ θ(t), cos θ(t) ≈ 1 (3.3.13)

ottenendo:{(I +ml2)∂

2θ(t)∂t2−mlgθ(t) = −ml ∂

2x(t)∂t2

(M +m)∂2x(t)∂t2

+ k ∂x(t)∂t = F (t)−ml ∂2θ(t)∂t2

(3.3.14)

Applicando la trasformata di Laplace alle Equazioni 3.3.14, si trova{[(I +ml2)s2 −mlg]Θ(s) = −mls2X(s)

[(M +m)s2 + ks]X(s) = F (s)−mls2Θ(s)(3.3.15)

29

CAPITOLO 3. IL PENDOLO INVERSO

Dal sistema 3.3.15 si ricava dunque l’espressione della funzione di trasfe-rimento G(s) del sistema linearizzato attorno al punto θ ≈ 0:

G(s) :=Θ(s)

F (s)=

mls

[m2l2 − (M +m)(I +ml2)] s3 − k(I +ml2)s2 + (M +m)mgls+ kmgl(3.3.16)

È possibile verificare con il criterio di Routh-Hurwitz che questa funzio-ne di trasferimento è caratterizzata da uno zero nell’origine, due poli realinegativi e un polo reale positivo: il sistema risulta essere quindi non asinto-ticamente stabile.Utilizzando valori ragionevoli per le costanti in gioco (M = 100 g, m = 15 g,l = 25 cm, k = 0.1Nsm−1, g = 9.81ms−1, I = 0.001 kgm2), la funzione ditrasferimento G(s) risulta essere:

G(s) ≈ 1.01937s

(1 + 0.220353s)(1 + 1.15299s)(1− 0.223347s)(3.3.17)

Utilizzando questa funzione di trasferimento sono stati realizzati i graficidella risposta all’impulso (Figura 3.4) e allo scalino (Figura 3.5), da cui sipuò intuire anche visivamente che il sistema non ha un’uscita (l’inclinazionedell’asta) convergente.

0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5−9

−8

−7

−6

−5

−4

−3

−2

−1

0x 10

9

Impulse Response

Time (seconds)

Am

plit

ud

e

Figura 3.4: Risposta impulsiva del sistema

30

CAPITOLO 3. IL PENDOLO INVERSO

0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5−2

−1.8

−1.6

−1.4

−1.2

−1

−0.8

−0.6

−0.4

−0.2

0x 10

9

Step Response

Time (seconds)

Am

plit

ud

e

Figura 3.5: Risposta allo scalino del sistema

3.4 Esempio di stabilizzazione del sistema: control-lore PID

Un controllore Proporzionale Integrale Derivativo (PID) agisce sull’uscita diun sistema combinando un’azione proporzionale, che riduce la differenza trail riferimento e la variabile controllata (l’errore) a regime, aumentando lavelocità del sistema ma tendendo a destabilizzarlo, un’azione integrale, cheannulla l’errore a regime (se si ha un riferimento costante) ma destabilizza ilsistema tendendo a farlo oscillare, aumentandone il tempo di assestamento,ed infine un’azione derivativa, che tende a rallentare il sistema ma allo stessotempo stabilizzandolo, riducendo il tempo di assestamento.

Il sistema completo di controllore può essere schematizzato come illustra-to nella Figura 3.6:

Figura 3.6: Schema del sistema completo di controllore

Sapendo che la G(s) presenta uno zero nell’origine, due poli reali negativie un polo reale positivo, è possibile innanzitutto riscrivere l’Equazione 3.3.16

31

CAPITOLO 3. IL PENDOLO INVERSO

nel seguente modo:

G(s) =µs

(1 + sτ1)(1 + sτ2)(1− sτ3)(3.4.1)

con µ, τ1, τ2, τ3 reali e positivi.Si scrive poi la funzione di trasferimento generica di un regolatore PID:

C(s) = µp +µis

+ µds = µi

µdµis2 +

µpµis+ 1

s(3.4.2)

Dove µp è l’azione proporzionale, µis è l’azione integrale, µds è l’azione

derivativa del controllore.La funzione di trasferimento di un controllore di tipo PID ha sempre due

zeri (che devono essere a parte reale negativa) ed un polo nell’origine.Per tentare di stabilizzare il sistema è lecito quindi eliminare i due poli aparte reale negativa, con l’ottica di ottenere una funzione di trasferimentoad anello chiuso che abbia un solo polo reale la cui posizione potrà poi essereregolata agendo sui parametri del controllore PID.Se si opera una cancellazione di questo tipo si otterrà infatti una funzionead anello aperto del tipo

La(s) =k

1 + sα, k, α ∈ R (3.4.3)

e ad anello chiuso una

Lc(s) =L(s)

1 + L(s)=

k

1 + k + sα(3.4.4)

che, per garantire l’asintotica stabilità del sistema, dovrà avere la radice deldenominatore a parte reale negativa.

Per eliminare i poli reali negativi della G(s) si impone quindi la condi-zione:

µdµis2 +

µpµis+ 1 = (1 + sτ1)(1 + sτ2) (3.4.5)

che porta quindi ad avere la seguente funzione di trasferimento per ilcontrollore:

C(s) =µis

(1 + sτ1)(1 + sτ2) (3.4.6)

La funzione di trasferimento ad anello aperto Ga(s) è data da:

Ga(s) = C(s)G(s) =µµi

1− sτ3(3.4.7)

e si ottiene quindi la funzione di trasferimento ad anello chiuso Gc(s):

Gc(s) =Ga(s)

1 +Ga(s)=

µµi1−sτ3

1 + µµi1−sτ3

=

µµi1+µµi

1 + s(−τ3µµi1+µµi

) (3.4.8)

32

CAPITOLO 3. IL PENDOLO INVERSO

che ha un unico polo reale.Per far sì che il sistema retroazionato sia asintoticamente stabile, dev’essere

−τ3µµi1 + µµi

> 0 (3.4.9)

Essendo τ3 e µ reali e positivi, la costante integrativa del controlloredovrà risultare:

− 1

µ< µi < 0 (3.4.10)

Soddisfando dunque le equazioni 3.4.5 e 3.4.10 si ottiene, in anello chiuso,il sistema asintoticamente stabile desiderato.

Con i valori utilizzati in precedenza, e quindi con µ ≈ 1.01937, dev’essereche:

− 0.981 < µi < 0 (3.4.11)

Con, ad esempio, µi = −0.2, si ottiene la funzione di trasferimento ad anellochiuso Gc(s):

Gc(s) ≈ −0.256082

0.0571951s+ 1(3.4.12)

Si può vedere attraverso il diagramma di Nyquist della funzione ad anel-lo aperto (Figura 3.7) come il sistema rispetti il criterio di Nyquist perl’asintotica stabilità.

−1 −0.9 −0.8 −0.7 −0.6 −0.5 −0.4 −0.3 −0.2 −0.1 0−0.2

−0.15

−0.1

−0.05

0

0.05

0.1

0.15

0.2

Nyquist Diagram

Real Axis

Imagin

ary

Axis

Punto (−1,0)

Figura 3.7: Diagramma di Nyquist della funzione ad anello aperto

33

CAPITOLO 3. IL PENDOLO INVERSO

Inoltre, dalle risposte all’impulso e allo scalino rappresentate per comple-tezza, si vede come il sistema, completo di controllo, abbia un’uscita limitataa regime:

0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5−4.5

−4

−3.5

−3

−2.5

−2

−1.5

−1

−0.5

0

Impulse Response

Time (seconds)

Am

plit

ud

e

Figura 3.8: Risposta impulsiva del sistema controllato

0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5−0.35

−0.3

−0.25

−0.2

−0.15

−0.1

−0.05

0

Step Response

Time (seconds)

Am

plit

ud

e

Figura 3.9: Risposta allo scalino del sistema controllato

34

Parte II

Gestione del sistema viasoftware

35

Capitolo 4

Ambiente di sviluppo softwareper il processore Nios II

In questo capitolo si descriveranno le modalità che consentono lo sviluppodi software che può essere eseguito dal processore Nios II.

Figura 4.1: Fasi di progetto del sistema

36

CAPITOLO 4. AMBIENTE DI SVILUPPO SOFTWARE PER ILPROCESSORE NIOS II

4.1 Introduzione

Fino ad ora ci si è occupati del progetto dell’hardware della piattaforma; oraci si concentrerà invece sull’elemento evidenziato nella Figura 4.1, dedicatoalla gestione del software del progetto che si andrà a realizzare.L’architettura del sistema prevede infatti che parte delle sue funzionalitàvengano gestite per mezzo di soluzioni software, per motivi di maggiore fles-sibilità, possibilità di riutilizzo di moduli elementari, minore complessità einferiori tempi di sviluppo, con lo svantaggio però di ottenere prestazioni in-feriori rispetto alla soluzione hardware che però, per lo scopo di questa tesi,sono decisamente accettabili.Per l’esecuzione del software si è quindi scelto di utilizzare il soft processorNios II, un processore che può essere implementato su FPGA sintetizzandouna descrizione in linguaggio HDL (Hardware Description Language) fornitadal produttore Altera R©.

Altera R© mette a disposizione l’ambiente di sviluppo Nios II EmbeddedDesign Suite (EDS), che si occupa di creare automaticamente il Board Sup-port Package (BSP), fornendo un opportuno livello di astrazione hardware(HAL [20], Hardware Abstraction Layer) per poter permettere il correttoscambio di istruzioni tra software e hardware.

Figura 4.2: Hardware Abstraction Layer (HAL)

37

CAPITOLO 4. AMBIENTE DI SVILUPPO SOFTWARE PER ILPROCESSORE NIOS II

4.2 Nios II Software Build Tool for EclipseTM

Il Nios II Embedded Design Suite (EDS) è comodamente utilizzabile attra-verso un’interfaccia grafica (GUI) [21]; per la gestione del software di questoprogetto si è scelto di utilizzare il Nios II Software Build Tool (SBT) forEclipseTM[22], un ambiente di sviluppo basato su EclipseTM, software opensource multipiattaforma che supporta svariati linguaggi ad alto livello, inparticolare C che è quello su cui è basato il progetto di questa tesi.Pur essendo un’applicazione indipendente, il Nios II SBT for EclipseTMlavoracongiuntamente a Quartus II: per poterlo utilizzare è necessario disporre diun progetto valido generato da quest’ultimo.

4.2.1 Generazione della libreria di sistema

Al momento della creazione di un progetto in Nios II SBT for EclipseTM,l’applicazione si occupa di creare una libreria di sistema basata sulle varieperiferiche, indirizzi di memoria, impostazioni di interrupt che caratterizzanoogni singolo sistema basato su Nios II: questa libreria è una sorta di databasein cui sono definiti i nomi delle periferiche utilizzate associati ai corrispettiviindirizzi di memoria e alcune definizioni ad-hoc per poter rendere compatibililibrerie standard C con lo specifico sistema utilizzato. Essa costituisce ilBoard Support Package (BSP) di cui si è fatto cenno nell’Introduzione diquesto capitolo.In questa libreria risiede anche l’informazione necessaria al reindirizzamentodei canali standard [23] (stdout, stdin, stderr) verso opportune interfacce.Nel progetto, il flusso di dati inviato al canale stdout verrà reindirizzato allaporta seriale RS-232 presente sulla scheda DE1 per poter inviare comandi ditipo testuale al plotter.

4.2.2 Accesso e comunicazione con le periferiche

Ci sono più possibilità per accedere e comunicare con le periferiche connesseal Nios II.A seconda delle esigenze e della complessità delle operazioni da compiere, èpossibile accedere direttamente ai registri della periferica, utilizzare le inter-facce provviste dal livello di astrazione hardware (HAL) oppure utilizzare lalibreria standard C ANSI compatibile con il sistema utilizzato.Nel progetto verranno utilizzate la prima tecnica, a basso livello, per legge-re le informazioni sull’inclinazione dell’asta del pendolo e la terza tecnica,ad alto livello, per inviare al plotter i comandi necessari per il movimentodesiderato del carrello.

38

CAPITOLO 4. AMBIENTE DI SVILUPPO SOFTWARE PER ILPROCESSORE NIOS II

4.2.3 Creazione e compilazione del software

Dopo aver creato il progetto, vengono predisposti file e cartelle per il correttofunzionamento del software da realizzare: il processo di creazione, scritturae modifica dei file contenenti il codice sorgente scritto ad alto livello segue leprocedure tipiche di ogni ambiente di sviluppo integrato (IDE).La compilazione dei file sorgente avviene internamente all’applicazione e ilrisultato del processo è un file .elf (Executable and Linking Format File)eseguibile dal processore Nios II.

4.2.4 Caricamento del software ed esecuzione

Prima di poter eseguire il programma, è necessario caricare sulla scheda:

• il file .sof (SRAM Object File) generato da Quartus II e contenente ladescrizione a livello hardware del sistema;

• il file .elf generato in fase di compilazione.

A questo punto sarà possibile eseguire il software e, se desiderato, effettuareprocedure di debugging.

39

Capitolo 5

Utilizzo delle funzionalità dibase del sistema

In questo capitolo si andrà a descrivere come si può interagire con il sistemaprogettato tramite software.Si parlerà di come è possibile impostare la frequenza e l’ampiezza dell’ondaquadra generata, leggere il valore della media di un certo numero di campionidell’onda quadra entrante nella scheda Altera R© DE1, leggere i campionistessi e dare comandi di posizione al plotter.

5.1 Impostazione della frequenza dell’onda quadra

Quando si è descritto il funzionamento del blocco di logica dedicato allagenerazione dell’onda quadra si è assunto che la frequenza inviata come pa-rametro sarebbe stata un sottomultiplo di 48 kHz

2 (vedi Paragrafo 2.2) per farein modo di ottenere un segnale di onda quadra che abbia lo stesso numero(intero) di campioni ai livelli alto e basso e per far sì che abbia una frequenzaben definita. Si ricorda infatti che 48 kHz è la frequenza di funzionamentocon cui è stato impostato il convertitore D/A a bordo della scheda Altera R©DE1.Per rendere più semplice l’utilizzo del componente anche in vista di un futuroriutilizzo, si è scelto di creare una procedura in C impostafrequenza che,dato un numero intero che rappresenta la frequenza desiderata, si occupi diimpostarlo, se possibile, come frequenza dell’onda quadra (righe 13-15 delcodice sorgente riportato a fine paragrafo); se il numero fornito alla procedu-ra non fosse invece un sottomultiplo di 48,000

2 , essa calcola automaticamenteun valore vicino alla frequenza desiderata che rispetti il vincolo imposto.Nel caso quest’ultimo non venga rispettato, per calcolare il valore di fre-quenza ammissibile si trova il risultato c della divisione 48 kHz

2∗fdes (dove perfdes si intende il valore di frequenza desiderata passata come parametro alla

40

CAPITOLO 5. UTILIZZO DELLE FUNZIONALITÀ DI BASE DELSISTEMA

procedura) e si calcola

f ′des =48 kHz2 ∗ c

(5.1.1)

f ′des, che non è intero, viene arrotondato al suo valore intero più vicino (righe9-12 del codice sorgente) ed il risultato dell’operazione di arrotondamento (f)viene comunicato al blocco generatore dell’onda quadra tramite interfacciaAvalon-MM, scrivendo il dato in corrispondenza dell’indirizzo al quale il ge-neratore è mappato (righe 16 e 17).Il controllo sulla divisibilità tra 48,000

2 e fdes è stato effettuato utilizzandol’operatore modulo (%), che restituisce il resto della divisione intera tra di-videndo e divisore (riga 9): nel caso il risultato non fosse 0, la proceduraprosegue con il calcolo della frequenza ammissibile.Dato che nel sistema progettato si presume che il blocco che calcola la mediadei campioni dell’onda quadra in entrata alla scheda riceva un’onda quadradella stessa frequenza di quella in uscita, si è scelto di inviare il dato dellafrequenza calcolata anche a questo blocco, cosicché possa calcolare la mediasu un numero intero di campioni (righe 18 e 19).Per utilizzare la procedura è necessario controllare che gli indirizzi base a cuisono raggiungibili i blocchi logici per la generazione dell’onda quadra e peril calcolo della media corrispondano agli effettivi valori assegnati automati-camente dal tool Qsys in fase di generazione della logica.Il codice in C per l’implementazione della procedura descritta è quindi ilseguente:

1 #define media_r ( volat i le int ∗) [ IND ._BASE_MEDIADX]2 #define media_l ( volat i le int ∗) [ IND ._BASE_MEDIASX]3 #define quadra_r ( volat i le int ∗) [ IND ._BASE__ONDAQ.DX]4 #define quadra_l ( volat i le int ∗) [ IND ._BASE_ONDAQ.SX]56 void imposta f requenza ( int f d e s ) {7 int f ;8 f loat c ;9 i f (48000%(2∗ f d e s ) != 0) {10 c = 48000 .0/(2∗ f d e s ) ;11 f = ( int ) ( round (48000 .0/ c ) ) ;12 }13 else {14 f = fde s ;15 }16 ∗( quadra_r ) = abs ( f ) ;17 ∗( quadra_l ) = abs ( f ) ;18 ∗(media_r + 2) = abs ( f ) ;19 ∗(media_l + 2) = abs ( f ) ;20 }

41

CAPITOLO 5. UTILIZZO DELLE FUNZIONALITÀ DI BASE DELSISTEMA

5.2 Impostazione dell’ampiezza dell’onda quadra

Molto più semplice è il caso dell’impostazione dell’ampiezza dell’onda qua-dra.Va precisato che per ampiezza si intende un valore positivo pari a metà del-l’escursione del segnale dal livello alto al livello basso.È stata realizzata una procedura (impostaampiezza) che scrive il valoreassoluto del numero intero che rappresenta l’ampiezza desiderata in corri-spondenza degli indirizzi ai quali sono mappati i generatori di onda quadraper i canali destro e sinistro.Si tenga presente che il generatore accetta valori a 16 bit scritti in notazio-ne complementata. Il numero da fornire alla procedura dovrà essere quindicompreso tra −32768 e 32767. Il codice sorgente per l’implementazione dellaprocedura è il seguente:

1 #define quadra_r ( volat i le int ∗) [ IND ._BASE__ONDAQ.DX]2 #define quadra_l ( volat i le int ∗) [ IND ._BASE_ONDAQ.SX]34 void impostaampiezza ( int ades ) {5 ∗( quadra_r+1) = abs ( ades ) ;6 ∗( quadra_l+1) = abs ( ades ) ;7 }

5.3 Lettura dei dati forniti dal blocco che calcola lamedia

5.3.1 Lettura della media

Per la lettura del dato di media fornito dalla logica implementata nel pro-getto, basta che si prelevi il valore desiderato richiedendolo all’indirizzo baseal quale è stato mappato il blocco.Potrebbe però capitare che il dato prelevato non venga interpretato come unnumero a 16 bit con segno, quindi è necessario assicurarsi di leggerlo corret-tamente.Per farlo, Altera R© fornisce la libreria alt_types.h (utilizzabile previa espli-cita inclusione nel codice sorgente dopo la creazione di un progetto in EclipseTM)che permette l’utilizzo di tipi di dato non disponibili nella libreria C ANSIstandard, garantendo maggiore rigore nel trattamento delle lunghezze deivalori.Per la lettura del numero fornito da media è consigliabile dunque effettuareun’operazione di type-casting (conversione di tipo), convertendo esplicita-mente il dato letto al tipo alt_16, ovvero un intero con segno a 16 bit.Per effettuare quest’operazione è sufficiente includere nel preprocessore le

42

CAPITOLO 5. UTILIZZO DELLE FUNZIONALITÀ DI BASE DELSISTEMA

seguenti direttive (sostituendo l’indirizzo associato al blocco con quello as-segnato dal tool Qsys):

#include " alt_types . h"#define media ( volat i le int ∗) [ INDIRIZZO_BASE_MEDIA]

e, all’interno del programma, prelevare il valore assegnandolo ad esempio aduna variabile valore_di_media, effettuando la conversione di tipo:

valore_di_media = ( alt_16 ) ∗media ;

Naturalmente bisognerà effettuare la stessa operazione sia per il canale sini-stro che per il canale destro.

5.3.2 Lettura del dato in ingresso al CODEC audio

Il blocco che in precedenza si è chiamato media dà anche la possibilità dileggere i campioni di un segnale audio in ingresso al CODEC.Ciò può essere utile ad esempio per visualizzare in un grafico l’andamento diun segnale audio.Il procedimento per la lettura è totalmente analogo a quello del paragrafoprecedente, avendo cura di includere nel preprocessore le stesse direttiveriportate nel paragrafo 5.3.1 e con l’accorgimento di modificare l’indirizzobase del blocco incrementandolo di un’unità, ad esempio in questo modo:

campione = ( alt_16 ) ∗(media + 1) ;

5.4 Invio al plotter delle istruzioni per lo sposta-mento

Per far sì che la scheda Altera R© DE1 comunichi con il plotter, si è scelto diutilizzare la porta RS-232 a bordo di entrambi i dispositivi; per lo scambio didati, lo standard RS-232 prevede che venga utilizzato un protocollo di tiposeriale, permettendo l’invio e la ricezione di caratteri tra i due dispositivi chelo implementano.Nel progetto non ci si è però dovuti preoccupare della serializzazione dei da-ti, in quanto il compito viene svolto automaticamente da un’interfaccia chesi è inserita nel sistema realizzato con il tool Qsys, di cui si è accennato nelCapitolo 1.1 sull’architettura e che è descritta più in dettaglio in [1].

Per l’invio al plotter dei dati di tipo testuale è sufficiente quindi im-postare come canale standard per l’output stdout l’interfaccia RS-232 (inEclipseTMè possibile farlo all’interno del BSP Editor) e, includendo la libre-ria C standard stdio.h, utilizzare ad esempio le funzioni printf o fprintf.

43

CAPITOLO 5. UTILIZZO DELLE FUNZIONALITÀ DI BASE DELSISTEMA

Per poter dare delle istruzioni al plotter, è necessario seguire il protocollodi stampa da esso utilizzato, l’HPGL.Quest’ultimo prevede che vengano inviati due caratteri (due lettere maiu-scole) che identificano il tipo di comando da eseguire, seguiti da eventualiparametri numerici opzionali separati da virgole ed infine un punto e virgolaper indicare la fine del comando.

Per il progetto era necessario poter spostare il carrello del plotter di unacerta distanza relativamente alla sua posizione iniziale: a questo scopo si èdeciso di utilizzare il comando PR (Plot Relative).Questo comando prevede l’utilizzo di due parametri numerici che indicano lecoordinate relative alla posizione di partenza del carrello in cui quest’ultimodovrà spostarsi. La prima coordinata è relativa alla direzione parallela allato lungo del plotter, la seconda è relativa alla direzione parallela al latocorto di esso.

Le coordinate sono espresse in GDU (Graphic Display Unit), dove 1 GDUequivale ad uno spostamento pari a 0.025mm lungo una direzione. [5]

Se si vuole quindi, ad esempio, spostare il carrello dal punto di coordinate(50, 50) (espresse in GDU) al punto (75, 25) sul piano del plotter, si puòscrivere (dopo aver impostato l’interfaccia RS-232 come stdout) all’internodella funzione main del programma in C da caricare sulla scheda la seguenteistruzione:

p r i n t f ( "PR25,−25; " ) ;

Oppure, se si vogliono utilizzare delle variabili in cui verrà memorizzatal’entità dello spostamento lungo le due direzioni (come si vedrà nel Capitolo7), si può procedere scrivendo:

int x = 25 ;int y = −25;p r i n t f ( "PR%d,%d ; " , x , y ) ;

44

Capitolo 6

La lettura dell’angolo

La logica implementata nel progetto permette di ottenere due valori chevariano con l’inclinazione dell’asta del pendolo sui due piani paralleli agliassi di rotazione.Questi valori non sono degli angoli, ma rappresentano l’ampiezza dell’ondaquadra in entrata alla scheda Altera R© DE1 dopo che è stata attenuata daidue potenziometri, governati dal movimento dell’asta.

Si è quindi voluto andare a mappare questi valori all’effettiva inclinazionedell’asta, per trovare una curva che possa approssimare il comportamento deipotenziometri.

La mappatura è legata all’ampiezza dell’onda quadra che viene data iningresso ai potenziometri: si sono qui utilizzati i valori di default del gene-ratore di onda quadra che si è creato, ovvero un’onda a 1 kHz, di ampiezza10, 000.

Preso un sistema di riferimento come in Figura 6.1, i due piani paralleliagli assi di rotazione dell’asta risultano essere i piani xz e yz:

Figura 6.1: Scelta del sistema di riferimento rispetto alla posizione del plotter

45

CAPITOLO 6. LA LETTURA DELL’ANGOLO

Gli angoli che si sono andati a mappare sono quindi quelli rappresentatinella Figura 6.2:

Figura 6.2: Angolo misurato

Per effettuare la misura si è utilizzato un goniometro per gli angoli diinclinazione dell’asta sui piani xz e yz ed un programma in C che restituiscea schermo i valori dell’ampiezza dell’onda quadra forniti dal blocco di logicache si occupa di eseguire la media di alcuni campioni dell’onda quadra iningresso al CODEC audio.La misura, seppur grossolana, ha permesso di ottenere una curva che appros-sima sufficientemente bene il comportamento dei potenziometri.

Il modulo hardware che comprende i potenziometri non permette all’astadi inclinarsi meno di 60◦ o più di 120◦ su nessuno dei due piani xz e yz.Per ottenere la curva ampiezza-angolo desiderata si è deciso quindi di andarea compiere la misura per 5 angoli significativi per ogni asse di rotazione: 60◦

(la minima inclinazione dell’asta possibile), 120◦ (la massima inclinazionedell’asta possibile), 90◦ (che corrisponde alla posizione verticale dell’asta) edue angoli intermedi, 75◦ e 105◦.

Per ogni angolo sono stati prelevati 1, 000 valori di media e si è calcolatoper ognuno la media aritmetica (che costituisce lo stimatore della media delladistribuzione dei risultati) e la relativa incertezza, costituita dallo scarto tiposperimentale della media.

Preso come riferimento quello rappresentato in Figura 6.1 e indicati ipotenziometri come raffigurato nella Figura 6.3, i potenziometri rilevanol’inclinazione nella maniera seguente:

• il potenziometro 1 rileva l’inclinazione della proiezione dell’asta sulpiano xz;

• il potenziometro 2 rileva l’inclinazione della proiezione dell’asta sulpiano yz.

46

CAPITOLO 6. LA LETTURA DELL’ANGOLO

Figura 6.3: Scelta del nome dei potenziometri

Inoltre ogni potenziometro è associato ad uno dei due canali audio suiquali viaggiano i segnali di onda quadra:

• il potenziometro 1 è associato al canale audio sinistro;

• il potenziometro 2 è associato al canale audio destro.

Detto questo, la tabella con i valori calcolati delle medie aritmetiche delleampiezze dei canali sinistro (potenziometro 1) e destro (potenziometro 2),con le relative incertezze per i vari angoli è qui riportata:

Ampiezze canale sx Ampiezze canale dx60◦ 4± 0.01 601± 0.20

75◦ 1431± 0.78 2099± 1.1

90◦ 3080± 1.1 3800± 1.9

105◦ 4784± 2.5 5762± 2.7

120◦ 7202± 2.6 7418± 3.1

Questi valori sono poi stati riportati in un grafico e, come si vede nellaFigura 6.4, si nota che l’andamento della curva è pressoché lineare.Essendoci una differenza significativa nel comportamento dei due potenzio-metri è quindi necessario trattarli separatamente.

Potenziometro 1: canale sinistro

Con il software MATLAB R© si è cercata la migliore approssimazione linearenel senso dei minimi quadrati per i dati ottenuti dalla misura effettuata sulpotenziometro 1.

47

CAPITOLO 6. LA LETTURA DELL’ANGOLO

60 75 90 105 1200

1000

2000

3000

4000

5000

6000

7000

8000

Angolo (gradi)

Am

pie

zza

rile

va

ta

Figura 6.4: Mappa ampiezza-angolo dei canali sinistro (in blu) e destro (inrosso)

Come si può vedere dalla Figura 6.5 (dove i pallini neri rappresentano i datie la retta blu l’approssimazione ai minimi quadrati), essa è globalmente unabuona approssimazione dei dati ma, intorno all’inclinazione di 90◦, criticaper l’equilibrio del pendolo, si discosta di circa due centinaia di unità daldato misurato (la retta approssimante vale 3, 300 nel punto corrispondentead un’inclinazione di 90◦ mentre lo stimatore della media dei valori misuraticalcolato per il canale sinistro è, come riportato nella tabella precedente, paria 3, 080).Si è scelto dunque di utilizzare un’approssimazione alternativa, ottenuta re-golando i parametri per via sperimentale, osservando il comportamento delsistema.Per il progetto si è quindi utilizzata la retta rsx(ϕsx) di equazione

rsx(ϕsx) = 102.5ϕsx − 6148 (6.0.1)

che approssima meglio il comportamento del potenziometro nei pressi deivalori di ϕsx intorno ai 90◦ (si ha infatti che rsx(ϕsx = 90◦) = 3077).

In Figura 6.6 è rappresentato il confronto tra la retta approssimantetrovata con MATLAB R© (in blu) e la rsx(ϕsx) utilizzata (in rosso).

Dato il valore mediasx di ampiezza del canale sinistro ottenuto dalla logi-ca implementata, utilizzando questa approssimazione, sarà possibile ottenere

48

CAPITOLO 6. LA LETTURA DELL’ANGOLO

60 75 90 105 120−1000

0

1000

2000

3000

4000

5000

6000

7000

8000

Angolo (gradi)

Am

pie

zza

Figura 6.5: Approssimazione ai minimi quadrati dei dati misurati (canalesinistro)

una stima del valore dell’angolo ϕsx seguendo l’equazione:

ϕsx ≈mediasx + 6148

102.5(6.0.2)

Potenziometro 2: canale destro

Lo studio del comportamento del secondo potenziometro è stato analogo aquello del primo: prima di tutto si è considerato l’approssimazione dei datiai minimi quadrati (in blu nella Figura 6.7).Anche se per questo potenziometro la retta è più vicina al valore misuratonei pressi dell’inclinazione ϕdx = 90◦ rispetto al primo caso (il valore dellaretta approssimante è di 3, 936 mentre il risultato della misura è pari a 3, 800),essa si discosta comunque di poco più di un centinaio di unità di ampiezza:si quindi trovata un’approssimazione migliore, che sia molto vicina al valoremisurato per ϕdx ≈ 90◦.L’equazione della retta approssimante utilizzata è la seguente:

rdx(ϕdx) = 106.7ϕdx − 5800 (6.0.3)

che, per ϕdx vicino ai 90◦ approssima meglio il comportamento reale delsecondo potenziometro. Si ha infatti che rdx(ϕdx = 90◦) = 3803.

49

CAPITOLO 6. LA LETTURA DELL’ANGOLO

60 75 90 105 120−1000

0

1000

2000

3000

4000

5000

6000

7000

8000

Angolo (gradi)

Am

pie

zza

dati misurati

approssimazione ai minimi quadrati

approssimazione utilizzata

Figura 6.6: Approssimazioni lineari dei dati del canale sinistro (approssima-zione ai minimi quadrati in blu, approssimazione utilizzata nel progetto inrosso)

Il confronto tra le due approssimazioni è raffigurato nella Figura 6.8. Da-to quindi il valore mediadx dell’ampiezza del canale destro fornito dall’apposi-to blocco di logica realizzato, è possibile ottenere una stima dell’inclinazioneϕdx dell’asta su un piano parallelo al lato corto del plotter:

ϕdx ≈mediadx + 5800

106.7(6.0.4)

Le Equazioni 6.0.2 e 6.0.4 potranno dunque essere utilizzate nella realiz-zazione di un programma per il controllo dell’equilibrio del pendolo.

50

CAPITOLO 6. LA LETTURA DELL’ANGOLO

60 75 90 105 1200

1000

2000

3000

4000

5000

6000

7000

8000

Angolo (gradi)

Am

pie

zza

Figura 6.7: Approssimazione ai minimi quadrati dei dati misurati (canaledestro)

60 75 90 105 1200

1000

2000

3000

4000

5000

6000

7000

8000

Angolo (gradi)

Am

pie

zza

dati misurati

approssimazione ai minimi quadrati

approssimazione utilizzata

Figura 6.8: Approssimazioni lineari dei dati del canale destro (approssima-zione ai minimi quadrati in blu, approssimazione utilizzata nel progetto inrosso)

51

Capitolo 7

Semplice approccio per ilcontrollo del pendolo inverso

Dopo aver completato la realizzazione dell’architettura del sistema, si è de-ciso di volerne testare le funzionalità: si è quindi implementato un sempliceprogramma in C per fare sì che, dando una sola istruzione, il carrello si po-sizionasse in maniera tale da porre il pendolo in posizione verticale.Non essendo riusciti a sviluppare un vero e proprio sistema di controllo chemantenesse costantemente in equilibrio il pendolo, questo approccio si ba-sa sul fatto che ci sia un operatore che inclini il pendolo in una direzionequalsiasi e lo mantenga in quella posizione (Figura 7.1 a sinistra). Si è fattopoi in modo che il carrello del plotter, ad intervalli di tempo regolari perpermettere di compiere lo spostamento richiesto, si posizioni al di sotto dellaproiezione sul piano del plotter della sfera del pendolo (Figura 7.1 a destra).

Figura 7.1: Funzionamento del programma per il controllo: a sinistra l’ope-ratore mantiene il pendolo fermo ad un’inclinazione; a destra il carrello si èspostato portando il pendolo in posizione verticale

52

CAPITOLO 7. SEMPLICE APPROCCIO PER IL CONTROLLO DELPENDOLO INVERSO

7.1 Idea di base

Figura 7.2: Scelta del sistema di riferimento rispetto al plotter

Il funzionamento è molto semplice; prima di tutto si considerano separa-tamente le proiezioni del pendolo sui due piani paralleli agli assi di rotazione(che, preso come riferimento quello rappresentato in Figura 7.2, sono i pianixz e yz), come raffigurato nella Figura 7.3.

Figura 7.3: Proiezioni del pendolo sui due piani di rotazione

Se si chiamano ϕsx e ϕdx gli angoli che la proiezione dell’asta sui piani xze yz forma con l’asse orizzontale, lo spostamento che il carrello del plotterdovrà compiere per portare il pendolo nella posizione di equilibrio sarà datodalla composizione dello spostamento ∆x lungo l’asse x e dello spostamento∆y lungo l’asse y.Dato che l’asta del pendolo è lunga l, gli spostamenti da compiere nelle duedirezioni varranno (in valore assoluto) l moltiplicata per il coseno degli angoliϕsx e ϕdx.

53

CAPITOLO 7. SEMPLICE APPROCCIO PER IL CONTROLLO DELPENDOLO INVERSO

Si noti che, per come sono stati presi gli angoli e per come è stato scelto ilriferimento:

• ∆x, se ϕsx è compreso tra 60◦ e 90◦, avrà segno positivo; se invece ϕsxè compreso tra 90◦ e 120◦, avrà segno negativo;

• ∆y, se ϕdx è compreso tra 60◦ e 90◦, avrà segno negativo; se inveceϕdx è compreso tra 90◦ e 120◦, avrà segno positivo.

Per riportare il pendolo nella posizione verticale, dati gli angoli ϕsx e ϕdx,si dovrà quindi compiere uno spostamento ∆x lungo l’asse x ed uno sposta-mento ∆y lungo l’asse y pari a:{

∆x = l cosϕsx

∆y = −l cosϕdx(7.1.1)

7.2 Implementazione della soluzione

Per implementare il procedimento descritto nel paragrafo 7.1 è necessarioconoscere il valore degli angoli ϕsx e ϕdx. Si sono quindi sfruttate le Equa-zioni 6.0.2 e 6.0.4 descritte nel Capitolo 6 per ottenere, dati i valori mediasxe mediadx di ampiezza dell’onda quadra forniti dal blocco di logica che siè chiamato media per il canale sinistro e per il canale destro, i valori degliangoli ϕsx e ϕdx che l’asta forma con l’asse orizzontale sui due piani xz e yz:

ϕsx =mediasx + 6148

102.5

ϕdx =mediadx + 5800

106.7

Si sono inoltre sfruttate le funzionalità descritte nei Paragrafi 5.1 perl’impostazione della frequenza dell’onda quadra, 5.2 per l’impostazione del-l’ampiezza dell’onda quadra e 5.3.1 per la lettura dell’ampiezza dell’ondaquadra in entrata sui due canali.

Il codice sorgente

Prima di tutto, il preprocessore contiene le informazioni per includere le li-brerie alt_types.h (per poter sfruttare tipi di dato più rigorosi di quelliprevisti normalmente da C), stdio.h (per le funzionalità di input/output,utilizzata in particolare per poter inviare comandi al plotter) e math.h (perpoter utilizzare funzioni trigonometriche). Si definiscono anche i puntatoriai blocchi di logica che generano l’onda quadra (onda_quadra) e che resti-tuiscono il valore di ampiezza dell’onda quadra in entrata al CODEC audio(media):

54

CAPITOLO 7. SEMPLICE APPROCCIO PER IL CONTROLLO DELPENDOLO INVERSO

2 #include " alt_types . h"3 #include <s td i o . h>4 #include <math . h>5 #define media_r ( volat i le int ∗) [ IND ._BASE_MEDIADX]6 #define media_l ( volat i le int ∗) [ IND ._BASE_MEDIASX]7 #define quadra_r ( volat i le int ∗) [ IND ._BASE__ONDAQ.DX]8 #define quadra_l ( volat i le int ∗) [ IND ._BASE_ONDAQ.SX]

Vengono poi implementate le funzioni impostafrequenza e impostaampiezzacosì come sono state descritte ai Paragrafi 5.1 e 5.2. Di seguito è stata poiimplementata la funzione main, in cui inizialmente vengono definite alcunevariabili:

38 int l = 10000 ;39 f loat angolo_dx , arad_dx ;40 f loat angolo_sx , arad_sx ;41 int x , y ;42 int mr = 0 ;43 int ml = 0 ;44 int i = 0 ;

Alla variabile l è stato assegnato un valore intero pari a 10, 000: questo nu-mero rappresenta la lunghezza dell’asta scritta utilizzando l’unità di misuraGDU adottata dal plotter. Se a quest’ultimo viene dato un comando percompiere uno spostamento di 1 unità in una direzione, esso compierà unospostamento pari a 0.025mm.L’asta utilizzata nel progetto misura 25 cm: portando questo valore nell’unitàutilizzata dal plotter si ottiene:

25 cm0.025mm

= 10, 000 (7.2.1)

Alle variabili angolo_dx, angolo_sx, arad_dx, arad_sx verranno assegnatii valori degli angoli ϕsx e ϕdx rispettivamente in gradi e radianti.x e y sono i valori di spostamento relativo alla posizione del carrello che que-st’ultimo deve compiere per portare il pendolo in posizione verticale (corri-spondono quindi ai ∆x e a ∆y descritti in precedenza).mr e ml sono le variabili in cui vengono registrati i valori dell’ampiezza dell’on-da quadra in un determinato istante (corrispondono a mediadx e a mediasx).L’ultima variabile definita è i, parametro ausiliario che serve a temporizza-re il programma: il comando di spostamento del carrello viene inviato soloquando i, incrementata all’interno di un ciclo while, raggiunge un certo va-lore.

55

CAPITOLO 7. SEMPLICE APPROCCIO PER IL CONTROLLO DELPENDOLO INVERSO

Il corpo del programma è il seguente:

46 while (1 ) {47 i++;48 i f ( i ==800000)49 {50 mr = ( alt_16 ) ∗media_r ;51 ml = ( alt_16 ) ∗media_l ;52 angolo_dx = ( ( f loat ) (5800+mr) ) /106 . 7 ;53 angolo_sx = ( ( f loat ) (6148+ml ) ) /102 . 5 ;5455 arad_dx = (M_PI/180)∗angolo_dx ;56 arad_sx = (M_PI/180)∗angolo_sx ;5758 x = cos ( arad_sx ) ∗ l ;59 y = −cos ( arad_dx ) ∗ l ;60 p r i n t f ( "PR%d,%d ; " , x , y ) ;6162 i =0;63 }64 }

Il ciclo while ed il controllo sul valore di i servono, come detto, a ca-denzare lo svolgimento delle istruzioni del programma. Vengono poi letti ivalori dell’ampiezza dell’onda quadra in ingresso e salvati nelle variabili mr(per il canale destro) e ml (per il canale sinistro).Alle righe 52 e 53 si ricavano gli angoli ϕdx e ϕsx, calcolati come descrittodalle Equazioni 6.0.2 e 6.0.4.Gli angoli vengono poi convertiti in radianti (righe 55 e 56), sfruttando lacostante M_PI (pi greca) definita nella libreria math.h: la conversione è ne-cessaria perché la funzione cos, utilizzata nel calcolo dello spostamento dacompiere, richiede come parametro un angolo espresso in radianti.Vengono poi calcolati x (∆x) e y (∆y) applicando le Equazioni 7.1.1 e infinesi invia al plotter il comando PR con parametri x e y per far compiere alcarrello del plotter uno spostamento relativo di componenti ∆x e ∆y.Si noti che per l’invio del comando al plotter si utilizza la funzione printf:sarà necessario impostare (in EclipseTM, all’interno del BSP Editor) comestandard output (stdout) non l’interfaccia di default JTAG UART, bensìl’interfaccia RS232.

Il codice sorgente completo si può trovare all’Appendice B.1.

56

Parte III

Test sul funzionamento dellalogica realizzata

57

Capitolo 8

Test sul funzionamento delblocco onda_quadra

In questo capitolo si andrà a valutare il funzionamento del generatore di ondaquadra che si è realizzato: prima si verificherà il corretto comportamentodella logica realizzata, poi si andrà ad osservare l’onda quadra analogica inuscita dal convertitore D/A.

Dato che i blocchi che generano la quadra per i canali destro e sinistrosono assolutamente identici, si effettueranno le simulazioni per uno solo deidue canali, ad esempio il sinistro.

8.1 Test sul corretto comportamento del moduloonda_quadra

Per testare il corretto funzionamento del modulo si è utilizzato SignalTapII Logic Analyzer [24], un tool accessibile da Quartus che permette di esa-minare il comportamento di segnali all’interno dell’FPGA: questi vengonocampionati, memorizzati e poi visualizzati senza interrompere o rallentare ilnormale corso del sistema e senza richiedere l’utilizzo di analizzatori logiciesterni.

Figura 8.1: Analisi dei segnali contatore (secondo segnale) e ampiezza(terzo segnale), con riferimento al segnale LRCK (primo segnale)

58

CAPITOLO 8. TEST SUL FUNZIONAMENTO DEL BLOCCOONDA_QUADRA

Utilizzando i valori di default per l’ampiezza (10, 000) e la frequenza(1 kHz) dell’onda quadra generata, si è deciso di effettuare un’analisi del com-portamento dei segnali contatore e ampiezza, utilizzando inoltre il segnaleLRCK di frequenza 48 kHz come riferimento.

Dall’analisi rappresentata nella Figura 8.1 si può notare che contatoreviene incrementato di un’unità ad ogni periodo del segnale LRCK, ovvero48, 000 volte al secondo, cioè alla stessa frequenza di lavoro del convertitoreD/A.Dato che si vuole ottenere un’onda quadra ad una frequenza di 1 kHz, sareb-be necessario fornire al convertitore 48 kHz

1 kHz = 48 campioni per ogni periododel segnale, ovvero ampiezza dovrebbe assumere un valore positivo per 24campioni e il valore opposto, negativo, per ulteriori 24.Nella figura vede infatti che, alla fine del periodo di LRCK in cui il contatoreè arrivato a 0017h (ovvero 17 scritto in base 16: la h dopo il numero sta perhexadecimal) che equivale a 23 scritto in base 10, il valore di ampiezza passada D8F0h a 2710h.Essendo i numeri espressi in notazione complementata a 2, 2710h corrispon-de a 10, 000 in base 10, mentre D8F0h, che è il suo complemento, corrispondea −10, 000.Si può osservare quindi che vengono inviati correttamente, per ogni periododell’onda quadra, 24 campioni ad un’ampiezza pari a 10, 000 e 24 campionial valore opposto, ovvero −10, 000.

8.2 Visualizzazione dell’onda quadra analogica ge-nerata

Avendo verificato che la logica del generatore funzioni correttamente, si è de-ciso di utilizzare un oscilloscopio analogico (un Hitachi V-212), per verificarela bontà dell’onda quadra analogica in uscita dal decoder D/A.

Figura 8.2: Onda quadra analogica osservata con un’oscilloscopio

Nella Figura 8.2 è rappresentato il segnale dell’onda quadra che si è anda-ti ad osservare. L’oscilloscopio è stato regolato per fare in modo di ottenere

59

CAPITOLO 8. TEST SUL FUNZIONAMENTO DEL BLOCCOONDA_QUADRA

sull’asse orizzontale del tempo 0.2ms per divisione e sull’asse verticale delleampiezze circa 50mV per divisione. È stata però utilizzata una sonda confattore attenuante 1:10, quindi in ampiezza, per una corretta lettura, il va-lore visualizzato va ancora moltiplicato per un fattore 10.

Nella figura si possono vedere gli effetti sulle transizioni del filtro passa-banda presente in uscita al convertitore D/A: i fronti di salita e di discesaseguono un andamento esponenziale dovuto al filtro passa basso, nei tratticostanti c’è una lieve discesa del segnale dovuta al filtro passa alto e primadel cambio di fronte ci sono delle piccole oscillazioni.Questi effetti sono accettabili per la frequenza utilizzata: scendendo troppoalle basse frequenze o, viceversa, impostando una frequenza oltre la decina dikHz, questi effetti diventano più importanti, rendendo di fatto inutilizzabileil segnale per gli scopi del progetto.

Si può inoltre notare che la frequenza ottenuta è pari a quella desidera-ta. Si vede infatti che un periodo del segnale copre 5 divisioni orizzontalidello schermo. Ciò significa, per come è stato impostato l’oscilloscopio, chel’effettivo periodo del segnale vale 5 · 0.2ms = 1ms. Facendone il reciprocosi ottiene la frequenza dell’onda quadra, che risulta essere 1 kHz, come desi-derato.

60

Capitolo 9

Test sul funzionamento delblocco media

In questo capitolo si vuole andare a caratterizzare il comportamento delblocco di logica «media», prima testandone il corretto funzionamento, poiosservando i risultati che fornisce quando utilizzato nel progetto.

9.1 Test sul corretto funzionamento del modulo media

Anche in questo caso si è deciso di utilizzare il tool SignalTap II Logic Ana-lyzer per analizzare il comportamento dei segnali coinvolti all’interno dellalogica realizzata.

Figura 9.1: Analisi dei segnali audio_abs (secondo segnale), e somma (terzosegnale), contatore (quarto segnale) e somma_stored (quinto segnale) conriferimento al segnale LRCK (primo segnale)

Si è andati ad osservare i segnali audio_abs, somma, contatore e somma_stored,tutti riferiti al segnale LRCK che ha frequenza 48 kHz.Sul bus audio_abs è presente, per ogni periodo del segnale LRCK, il valoreassoluto del campione prelevato dal convertitore A/D: questi valori vengonosommati alla frequenza di 48 kHz alla variabile somma che viene azzerata

61

CAPITOLO 9. TEST SUL FUNZIONAMENTO DEL BLOCCO MEDIA

dopo un numero di campioni pari a 3 periodi dell’onda quadra analogica inentrata.Quando somma viene azzerata, il suo valore finale viene registrato in somma_stored.

Nella Figura 9.1 si può vedere che la logica funziona correttamente: inparticolare si noti che, quando contatore (il quarto segnale nella figura)arriva a 143 e quindi (dato che parte da 0) dopo aver contato i 144 campionipresenti in tre periodi dell’onda quadra ad 1 kHz, al periodo successivo diLRCK questo viene azzerato insieme a somma.somma_stored invece prende il valore di somma (nella figura è pari a 1, 204, 660)a cui è stato ulteriormente sommato il valore dell’ultimo campione arrivato(9623), quindi, in questo caso, 1, 204, 660 + 9623 = 1, 214, 283.

9.2 Utilizzo del blocco media per visualizzare l’ondaquadra in entrata

Si vuole ora andare a sfruttare la possibilità di leggere i campioni provenien-ti dal convertitore A/D utilizzando il blocco media per poter visualizzare,andando a tracciare un grafico dei dati raccolti, l’onda quadra generata inprecedenza.

Si è andati quindi a collegare le due porte Headphones di uscita e LineIn di ingresso presenti sulla scheda DE1 con un cavo stereo jack maschio-maschio da 3.5mm e si è scritto un semplice programma (il cui codice sorgentecompleto si può trovare all’Appendice B.2) che permette di richiedere i datial blocco media, salvarli nella memoria SRAM e infine di stamparli a scher-mo.

All’interno del programma sono state definite una procedura scrivi_sram(righe 6-9) ed una funzione leggi_sram (righe 11-14) che, dopo aver inseritol’indirizzo a cui è mappato il controllore per la SRAM nel preprocessore (ri-ga 4), si occupano rispettivamente di salvare un dato in una certa posizionedella memoria e leggerne uno in una posizione specificata:

6 #include " alt_types . h"7 #include <s td i o . h>8 #define media_l ( volat i le alt_16 ∗) [ IND ._BASE_MEDIADX]9 #define sram_addr ( volat i le alt_16 ∗) [ IND ._BASE_SRAM]1011 void scr iv i_sram ( int pos , alt_16 dato ) {12 alt_16 ∗sram = ( alt_16 ∗) sram_addr ;13 sram [ pos ] = dato ;14 }15

62

CAPITOLO 9. TEST SUL FUNZIONAMENTO DEL BLOCCO MEDIA

16 alt_16 leggi_sram ( int pos ) {17 alt_16 ∗sram = ( alt_16 ∗) sram_addr ;18 return sram [ pos ] ;19 }

Si noti come nelle definizioni dei puntatori media_l e sram_addr si siaindicato il tipo alt_16 per accertarsi che i dati (con segno e a 16 bit) ven-gano trattati correttamente del programma.

All’interno della funzione main, dopo aver definito le variabili ausiliarie ie j (riga 17) che regolano i cicli che si utilizzano nel programma, si è sceltodi far eseguire al sistema un ciclo for in cui venissero letti i dati provenientidal blocco media dedicato al canale sinistro e poi scritti in una posizione pariall’indice i (incrementato nel ciclo) attraverso la procedura scrivi_sram.

17 int i , j ;1819 for ( i = 0 ; i < 1000 ; ++i )20 {21 scr iv i_sram ( i , ∗ ( media_l + 1) ) ;22 }

Infine è stato implementato un secondo ciclo for che stampasse a schermoi dati letti dalla SRAM utilizzando la funzione leggi_sram:

24 for ( j = 0 ; j < 1000 ; ++j )25 {26 p r i n t f ( "%d\n" , leggi_sram ( j ) ) ;27 }

La scelta di utilizzare un ciclo in cui si prelevassero i dati e li si scrivesserosu una memoria per poi leggerli in un secondo momento è dovuta al fattoche la funzione printf è molto lenta in confronto al resto delle istruzioni.Se si fosse cercato di utilizzare un unico ciclo in cui venisse sia prelevato ildato che stampato a schermo si sarebbe corso il rischio di perdere un grannumero di campioni, ottenendo un risultato privo di significato.

Così come si è implementato il programma ci si è potuti invece assicurareche non venisse perso nemmeno un campione di quelli forniti dal converti-tore: nella stampa a schermo dei dati ci si può accorgere infatti che ogninumero viene ripetuto per circa 2 o 3 volte, indicando il fatto che i campionivengono prelevati più di una volta ciascuno.

Si è infine tracciato il grafico del risultato, visibile nella Figura 9.2.

63

CAPITOLO 9. TEST SUL FUNZIONAMENTO DEL BLOCCO MEDIA

400 450 500 550 600 650

−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

x 104

campioni

am

pie

zza

Figura 9.2: Grafico dell’onda quadra campionata dal convertitore A/D

9.3 Andamento della media al variare della posizio-ne del joystick

In questo paragrafo si vuole andare ad osservare come il blocco media ri-sponde ai movimenti di rotazione dell’asta del pendolo.Per farlo, prima di tutto si è scritto un programma in C (il cui codice sor-gente completo si può trovare all’Appendice B.3) che restituisca a schermo ildato di media fornito dal modulo media, in questo caso per entrambi i canalisinistro e destro.Il preprocessore è analogo a quelli visti fino ad ora, mentre il corpo del pro-gramma è costituito da un ciclo while infinito che permette di stampare adintervalli regolari i dati della media relativi ai canali sinistro e destro:

while (1 ) {i++;i f ( i == 1000) {p r i n t f ( "%d,%d\n" , (∗media_l ) , (∗media_r ) ) ;i = 0 ;

}

Dopo aver fatto eseguire il programma, si sono fatti compiere all’astadei movimenti circolari (facendo scorrere l’asta lungo i bordi del supportodel joystick, utilizzato come guida), si sono raccolti i dati e si è deciso di

64

CAPITOLO 9. TEST SUL FUNZIONAMENTO DEL BLOCCO MEDIA

rappresentare i valori relativi al canale destro sull’asse verticale, in funzionedei valori relativi al canale sinistro, riportati sull’asse orizzontale.

0 1000 2000 3000 4000 5000 6000 7000 80000

1000

2000

3000

4000

5000

6000

7000

8000

Canale sinistro

Ca

na

le d

estr

o

Figura 9.3: Valori di media catturati mentre l’asta compie un movimentocircolare. Sull’asse verticale ci sono i dati relativi al canale destro, sull’asseorizzontale quelli relativi al canale sinistro

Come si può vedere nella Figura 9.3, si è ottenuta così una rappresenta-zione del movimento che si fatto compiere all’asta: naturalmente il risultatonon è perfetto, ma l’asimmetria del grafico non è dovuta al cattivo funziona-mento della logica, bensì alle differenze nel comportamento dei due poten-ziometri utilizzati. Per poter rendere effettivamente utilizzabili i dati fornitidal blocco media è necessario quindi effettuare prima una calibrazione, comesi è fatto ad esempio nel Capitolo 6, quando si sono mappati i dati acquisitiagli effettivi angoli di inclinazione dell’asta.Si noti infine che vi sono delle «imprecisioni» che si presentano sempre neglistessi punti: esse sono dovute alle imperfezioni presenti sul bordo del sup-porto del joystick che si è utilizzato come guida per far compiere all’asta ilmovimento circolare.

65

Parte IV

Tutorial

66

Capitolo 10

Tutorial sull’implementazionedella parte software del sistema

Il tutorial presente in questo capitolo è da intendersi come la seconda par-te di un tutorial più ampio, che parte dall’implementazione della logica inQuartus e arriva al sistema funzionante che si è progettato in questa tesi. Laprima parte si può trovare in [1], e tratta tutti i dettagli della creazione delprogetto in Quartus e Qsys, fino ad arrivare al caricamento del file .sof sullascheda DE1.

In questa seconda parte si descriveranno invece tutti i passaggi successiviper poter scrivere, compilare ed infine far eseguire il software utilizzato.

Apertura di Nios II Software Build Tools for EclipseTM

Dopo aver caricato il bitstream sulla scheda DE1 attraverso il tool Pro-grammer, si apra l’ambiente di sviluppo Nios II Software Build Tools forEclipseTMattraverso il menù «Tools» di Quartus:

Tools > Nios I I Software Build Tools f o r Ec l i p s e

Si aprirà una finestra in cui è richiesto di selezionare un workspace nelquale sarà incluso il progetto che si andrà a creare.È preferibile che si selezioni la stessa cartella che contiene il progetto realiz-zato in Quartus, avendo cura che non vi siano spazi nel percorso desiderato.Si clicchi OK per procedere all’avvio dell’applicazione.

Creazione di un nuovo progetto

Si proceda ora alla creazione di un nuovo progetto:

F i l e > New > Nios I I App l i ca t ion and BSP from Template

67

CAPITOLO 10. TUTORIAL SULL’IMPLEMENTAZIONE DELLAPARTE SOFTWARE DEL SISTEMA

La finestra che compare permette di specificare tutte le informazioni neces-sarie al corretto funzionamento del progetto che si andrà a creare.

Prima di tutto è necessario specificare il percorso del file SOPC (conestensione .sopcinfo) che contiene le informazioni sull’architettura del siste-ma realizzato precedentemente in Qsys, in particolare quali siano le perife-riche di input/output e l’ID del sistema. Generalmente questo file si trovanella cartella base del progetto realizzato in Quartus.

Si specifichi il nome dell’istanza dato al processore Nios II (nel caso diquesto progetto risulta essere «nios»).

Si dia poi un nome significativo al progetto, senza inserire nessuno spazio.

Si selezioni poi, tra i vari template utilizzabili, Blank Project. Prima dicliccare su Next, si dovrebbe avere una situazione simile a quella rappresen-tata in Figura 10.1.

Figura 10.1: Creazione del progetto in Eclipse: impostazioni

Si prosegua facendo click su Next, poi Finish.

68

CAPITOLO 10. TUTORIAL SULL’IMPLEMENTAZIONE DELLAPARTE SOFTWARE DEL SISTEMA

La schermata principale

Al termine del processo di creazione del progetto, EclipseTMgenererà au-tomaticamente tutti i file necessari per poter caricare un’applicazione fun-zionante sulla scheda, eseguibile dal processore Nios II che si è implementato.

Si dovrebbe avere a questo punto una schermata simile a quella dellaFigura 10.2:

Figura 10.2: Schermata principale

La parte centrale, più ampia e a sfondo scuro è il «File Viewer», in cuiviene visualizzato il contenuto dei file aperti; al di sotto c’è una finestra (la«Terminal Window») con vari tab, tra cui «Console», utilizzata per l’inpute/o l’output durante l’esecuzione di un programma, a patto che i canalistandard stdin e stdout siano impostati per l’utilizzo dell’interfaccia JTAGUART.Sulla sinistra si trova invece il Project Explorer, in cui si possono vedere ifile che l’ambiente di sviluppo EclipseTMha generato in fase di creazione delprogetto.Proprio nel Project Explorer si dovrebbero avere due cartelle: la prima, cheporta il nome del progetto, è il cosiddetto «Application Project», che contieneil codice sorgente e i file header del software da sviluppare; la seconda, cheporta il nome del progetto seguito da _bsp, costituisce il Board SupportPackage (BSP) per il particolare sistema che si sta utilizzando, che contienei driver dei componenti implementati, svariate librerie C, le HAL, il fileheader system.h (contenente tutte le informazioni sul sistema) ed altri filenecessari al corretto funzionamento dell’applicazione.

69

CAPITOLO 10. TUTORIAL SULL’IMPLEMENTAZIONE DELLAPARTE SOFTWARE DEL SISTEMA

Creazione di un nuovo file sorgente

Si proceda ora alla creazione del file sorgente in cui si scriverà il codice delprogramma in C da eseguire sul processore.

Nel Project Explorer si selezioni l’Application Project, poi si clicchi, nellabarra degli strumenti, sull’icona corrispondente alla creazione di un nuovofile sorgente C/C++, come rappresentato nella Figura 10.3.

Figura 10.3: Pulsante per la creazione di un nuovo file sorgente C/C++

Si aprirà una schermata in cui si dovrà indicare:

• la cartella dove risiederà il file: si controlli che sia specificata la cartelladel proprio Application Project;

• il nome del file, che non deve contenere spazi e alla fine del qualebisogna specificare l’estensione .c

• il template utilizzato per il file: è possibile lasciare quello predefinito.

Dopo aver compilato tutti i campi, si dovrebbe ottenere una schermatacome quella di Figura 10.4.

Figura 10.4: Creazione di un nuovo file sorgente C/C++

Si clicchi quindi su Finish.

Al termine dell’operazione, il file verrà creato ed automaticamente apertonel File Viewer.Si proceda ora alla scrittura del programma desiderato.

70

CAPITOLO 10. TUTORIAL SULL’IMPLEMENTAZIONE DELLAPARTE SOFTWARE DEL SISTEMA

Per questo tutorial si utilizzerà il codice sorgente utilizzato per il controllodel pendolo inverso descritto al Capitolo 7 e che si può trovare all’AppendiceB.1.È necessario che il programma scritto contenga al suo interno la funzionemain per poter essere eseguito dal processore.

Terminata la stesura del programma, si salvi il file cliccando sul pulsantedi Figura 10.5 o utilizzando la scorciatoia da tastiera Ctrl + s.

Figura 10.5: Pulsante per il salvataggio del file sorgente C

Impostazione delle interfacce per l’input e l’output

Nel progetto della tesi è necessario poter inviare dei comandi testuali al plot-ter utilizzando la porta RS-232 a bordo della scheda DE1.

Per farlo, è necessario impostare il canale standard per l’output stdoutin maniera che venga associato all’interfaccia RS-232 predisposta nel sistemarealizzato in Qsys.

Si selezioni quindi nel Project Explorer il progetto BSP (Figura 10.6)

Figura 10.6: Progetto BSP

e poi si apra il BSP Editor:

Nios I I > BSP Editor ( oppure Ctr l + 9)

Si selezionino le interfacce desiderate per stderr, stdin e stdout.Per questo tutorial si selezionerà «rs232» come interfaccia associata a stdout,come in Figura 10.7.

Si clicchi poi su Generate e, al termine dell’operazione di generazione delnuovo BSP, su Exit.

71

CAPITOLO 10. TUTORIAL SULL’IMPLEMENTAZIONE DELLAPARTE SOFTWARE DEL SISTEMA

Figura 10.7: Canali standard e interfacce

Compilazione del progetto e caricamento su scheda

A questo punto è possibile procedere alla compilazione del progetto. Perfarlo, si clicchi con il tasto destro sull’Application Project e si scelga «BuildProject», come da Figura 10.8.

Figura 10.8: Compilazione del progetto

Se a questo punto non risulta che ci siano errori e/o avvisi nel tab «Pro-blems» della Terminal Window, è possibile procedere al caricamento delsoftware sulla scheda. Dato che questo verrà eseguito automaticamente altermine dell’operazione di upload, se si vuole eseguire il programma che inviacomandi al plotter è consigliabile prima controllare di aver collegato corret-tamente la scheda DE1 al plotter tramite un cavo RS-232.

Per evitare conflitti nella comunicazione tra la scheda ed il computer,è bene a questo punto assicurarsi che il tool Programmer con il quale inprecedenza si è caricato il file .sof non sia in esecuzione.Si clicchi quindi con il tasto destro sull’Application Project e si scelga RunAs > Nios II Hardware come da Figura 10.9.

72

CAPITOLO 10. TUTORIAL SULL’IMPLEMENTAZIONE DELLAPARTE SOFTWARE DEL SISTEMA

Figura 10.9: Caricamento su scheda ed esecuzione del programma

EclipseTMsi occuperà di caricare sulla scheda il file eseguibile genera-to in fase di compilazione; subito dopo il caricamento, il software partiràautomaticamente.

Risoluzione di eventuali problemi in fase di caricamento

Può capitare che, al momento del caricamento del file eseguibile sulla scheda,compaia la finestra Run Configurations: nel tab Target Connection si provia cliccare su «Refresh Connections», poi su Run.

Se si dovessero avere ulteriori problemi, si provi a riaccedere alla finestraRun Configurations:

Run > Run Con f i gura t i ons

nel tab Target Connection si provi a mettere un segno di spunta su Igno-re mismatched system ID e/o su Ignore mismatched system timestamp, poipremere Run.

73

Parte V

Parte Finale

74

Conclusioni

Questo lavoro e tutto il percorso svolto in preparazione ad esso ci ha per-messo di apprendere interessanti nozioni e tecniche nell’ambito delle logicheprogrammabili che non erano previste nel nostro piano di studi.

Ci si era posti l’obiettivo di realizzare un’architettura che potesse essereutilizzata per il controllo di un pendolo inverso, e riteniamo che sia statoraggiunto.

Il semplice sistema di controllo che abbiamo realizzato funziona, con lelimitazioni ad esso associate, discretamente: il movimento del carrello delplotter è piuttosto preciso, in particolare se le inclinazioni dell’asta non sonomolto ampie.Purtroppo non siamo riusciti a creare un vero e proprio sistema di control-lo che mantenesse il pendolo inverso in posizione eretta senza l’aiuto di unoperatore come speravamo, ma abbiamo sviluppato un’architettura versatilee modulare che potrà essere un buon punto di partenza per chiunque volessecontinuare il nostro lavoro.

La versatilità della logica realizzata la rende facilmente riutilizzabile an-che per altri scopi e progetti: potrà eventualmente essere migliorata con pocosforzo, ad esempio modificando il modulo onda_quadra facendo sì che que-sto generi altri tipi di segnale, sfruttandolo quindi nell’ambito della sintesimusicale.

Ciò che non ci ha permesso di realizzare facilmente un sistema di con-trollo che funzioni autonomamente sono state principalmente le limitazioniriscontrate nell’utilizzo del plotter.Esso infatti compie degli spostamenti a «velocità costante», o quanto più cisi avvicina, e non è possibile controllare l’accelerazione del carrello.Abbiamo tentato di far compiere a quest’ultimo piccoli spostamenti a velo-cità via via crescente per cercare di ottenere un controllo di questo tipo, maabbiamo ottenuto risultati insoddisfacenti in quanto il movimento ottenutoè risultato decisamente irregolare, a scatti e per niente fluido.Inoltre, un altro aspetto che bisognerebbe tenere conto nel progetto di unsistema di controllo è che non è possibile interrompere l’esecuzione di un

75

CONCLUSIONI

comando, per compensare ad esempio un movimento troppo ampio che si èdato in precedenza. Per questo motivo bisogna considerare che non è pos-sibile sovraccaricare il plotter di istruzioni perché questo le organizzerebbesemplicemente attraverso una lista d’attesa per eseguirle una consecutiva-mente all’altra.

Negli eventuali sviluppi futuri si potrebbe quindi tentare di progettare unsistema di controllo che tenga conto di tutte le limitazioni date dall’utilizzodel plotter, oppure apportare qualche modifica a quest’ultimo per fare inmodo di controllare direttamente i suoi motori passo-passo.

Per realizzare un buon sistema di controllo si dovrebbe poi cercare dimantenere il pendolo nella zona centrale del piano del plotter: così facendonon si rischierebbe di dare dei comandi che potrebbero portare il carrelloin condizioni di fine corsa. Se ciò accadesse, oltre all’evidente impossibilitàdi controllare correttamente il pendolo, si provocherebbe la segnalazione daparte del plotter di un messaggio di errore, con una conseguente interruzionedel movimento del carrello.

76

Appendice A

Listati in Verilog

A.1 Modulo onda_quadra

1 module onda_quadra2 (3 //INPUTS4 input c lock , r e s e t ,5 //Avalon ST6 input ready ,7 //Avalon MM8 input [ 1 : 0 ] address ,9 input ch i p s e l e c t , wr ite ,10 input [ 3 1 : 0 ] wr itedata ,11 //OUTPUTS12 //Avalon ST13 output reg va l i d = 1 ,14 output wire [ 1 5 : 0 ] audio15 ) ;1617 // r e g i s t r i i n t e r n i18 reg [ 1 5 : 0 ] ampiezza = 16 ’ d10000 ;19 reg [ 1 5 : 0 ] contato re = 16 ’ d0 ;20 reg [ 3 1 : 0 ] campioni = 32 ’ d24 ;21 reg f l a g = 1 ;2223 assign audio = ampiezza ;2425 always @(posedge c l o ck or posedge r e s e t )26 begin27 i f ( r e s e t ) begin28 va l i d <= 1 ;

77

APPENDICE A. LISTATI IN VERILOG

29 contato re <= 0 ;30 ampiezza <= 16 ’ d10000 ;31 campioni <= 32 ’ d24 ;32 f l a g <= 1 ;33 end3435 else begin3637 i f ( c h i p s e l e c t && wr i t e ) begin38 i f ( address == 2 ’ h0 ) begin39 campioni [ 3 1 : 0 ] <= 24000/( wr i tedata [ 3 1 : 0 ] ) ;40 end41 i f ( address == 2 ’ h1 ) begin42 ampiezza [ 1 5 : 0 ] <= wri tedata [ 1 5 : 0 ] ;43 end44 end4546 i f ( ready && f l a g ) begin47 contato re <= contato re + 1 ’ d1 ;48 f l a g <= 0 ;49 end5051 i f ( ! ready && ! f l a g ) begin52 f l a g <= 1 ;53 end5455 i f ( contato re == campioni ) begin56 ampiezza <= −ampiezza ;57 contato re <= 0 ;58 end59 end60 end6162 endmodule

78

APPENDICE A. LISTATI IN VERILOG

A.2 Modulo media

1 module media2 (3 //INPUTS4 input c lock , r e s e t ,5 //Avalon ST6 input va l id ,7 input signed [ 1 5 : 0 ] audio ,8 //Avalon MM9 input [ 1 : 0 ] address ,10 input ch i p s e l e c t , read , write ,11 input [ 1 5 : 0 ] wr itedata ,12 //OUTPUTS13 //Avalon ST14 output reg ready = 1 ,15 //Avalon MM16 output reg [ 1 5 : 0 ] readdata17 ) ;1819 // r e g i s t r i e wire i n t e r n i20 reg signed [ 1 5 : 0 ] audio_reg ;21 wire [ 1 5 : 0 ] audio_abs ;22 reg [ 3 1 : 0 ] somma , somma_stored ;23 reg [ 1 5 : 0 ] contato re = 0 ;24 reg [ 3 1 : 0 ] campioni = 144 ;2526 assign audio_abs [ 1 5 : 0 ] = audio_reg [ 1 5 ] ? (~( audio_reg

[ 1 5 : 0 ] ) + 1 ’ b1 ) : ( audio_reg [ 1 5 : 0 ] ) ;2728 always @(posedge c l o ck or posedge r e s e t )29 begin30 i f ( r e s e t ) begin31 somma <= 32 ’ d0 ;32 audio_reg <= 0 ;33 somma_stored <= 32 ’ d0 ;34 contato re <= 13 ’ d0 ;35 campioni <= 144 ;36 end37 else begin38 i f ( c h i p s e l e c t && ( wr i t e == 1 ’ b1 ) ) begin39 i f ( address == 2 ’ h2 ) // f requenza40 campioni <= 144000/( wr i tedata [ 1 5 : 0 ] ) ; // 3∗(48000/

79

APPENDICE A. LISTATI IN VERILOG

wr i t eda ta )41 end4243 // l e t t u r a cana le44 i f ( ready && va l i d ) begin45 audio_reg <= audio ;46 ready <= 0 ;47 end4849 //somma50 else i f ( ( ! ready ) && ( contato re < campioni ) && ( !

va l i d ) ) begin51 somma <= somma + audio_abs ;52 contato re <= contato re+1’b1 ;53 ready <= 1 ;54 end5556 else i f ( contato re == campioni ) begin57 somma_stored <= somma ;58 somma <= 32 ’ d0 ;59 contato re <= 13 ’ d0 ;60 end61 end62 end6364 // r e g i s t r i d i output65 always @(posedge c l o ck or posedge r e s e t )66 begin67 i f ( r e s e t ) readdata <= 32 ’ d0 ;68 else i f ( c h i p s e l e c t && ( read ) )69 begin70 i f ( address == 2 ’ h0 ) //media71 readdata <= somma_stored/ campioni ;72 else i f ( address == 2 ’ h1 ) // dato73 readdata <= audio_reg ;74 else i f ( address == 2 ’ h3 ) // campioni75 readdata <= campioni ;76 else77 readdata <= 15 ’ d0 ;78 end79 end80 endmodule

80

Appendice B

Listati in C

B.1 Semplice controllo del pendolo inverso

1 #include " alt_types . h"2 #include <s td i o . h>3 #include <math . h>4 #define media_r ( volat i le int ∗) [ IND ._BASE_MEDIADX]5 #define media_l ( volat i le int ∗) [ IND ._BASE_MEDIASX]6 #define quadra_r ( volat i le int ∗) [ IND ._BASE__ONDAQ.DX]7 #define quadra_l ( volat i le int ∗) [ IND ._BASE_ONDAQ.SX]89 void imposta f requenza ( int f d e s ) {

10 int f ;11 f loat c ;12 i f (48000%(2∗ f d e s ) != 0) {13 c = 48000 .0/(2∗ f d e s ) ;14 f = ( int ) ( round (48000 .0/ c ) ) ;15 }16 else {17 f = fde s ;18 }19 ∗( quadra_r ) = abs ( f ) ;20 ∗( quadra_l ) = abs ( f ) ;21 ∗(media_r + 2) = abs ( f ) ;22 ∗(media_l + 2) = abs ( f ) ;23 }2425 void impostaampiezza ( int ades ) {26 ∗( quadra_r+1) = abs ( ades ) ;27 ∗( quadra_l+1) = abs ( ades ) ;28 }

81

APPENDICE B. LISTATI IN C

2930 int main ( ) {31 int l = 10000 ;32 f loat angolo_dx , arad_dx ;33 f loat angolo_sx , arad_sx ;34 int x , y ;35 int mr = 0 ;36 int ml = 0 ;37 int i = 0 ;3839 while (1 ) {40 i++;41 i f ( i ==800000)42 {43 mr = ( alt_16 ) ∗media_r ;44 ml = ( alt_16 ) ∗media_l ;45 angolo_dx = ( ( f loat ) (5800+mr) ) /106 . 7 ;46 angolo_sx = ( ( f loat ) (6148+ml ) ) /102 . 5 ;47 arad_dx = (M_PI/180)∗angolo_dx ;48 arad_sx = (M_PI/180)∗angolo_sx ;49 x = cos ( arad_sx ) ∗ l ;50 y = −cos ( arad_dx ) ∗ l ;51 p r i n t f ( "PR%d,%d ; " , x , y ) ;52 i =0;53 }54 }55 }

82

APPENDICE B. LISTATI IN C

B.2 Salvataggio dei dati del segnale campionato dal-l’ADC su SRAM e stampa a schermo

1 #include " alt_types . h"2 #include <s td i o . h>3 #define media_l ( volat i le alt_16 ∗) [ IND ._BASE_MEDIADX]4 #define sram_addr ( volat i le alt_16 ∗) [ IND ._BASE_SRAM]56 void scr iv i_sram ( int pos , alt_16 dato ) {7 alt_16 ∗sram = ( alt_16 ∗) sram_addr ;8 sram [ pos ] = dato ;9 }1011 alt_16 leggi_sram ( int pos ) {12 alt_16 ∗sram = ( alt_16 ∗) sram_addr ;13 return sram [ pos ] ;14 }1516 int main ( ) {17 int i , j ;1819 for ( i = 0 ; i < 1000 ; ++i )20 {21 scr iv i_sram ( i , ∗ ( media_l + 1) ) ;22 }2324 for ( j = 0 ; j < 1000 ; ++j )25 {26 p r i n t f ( "%d\n" , leggi_sram ( j ) ) ;27 }2829 return 0 ;30 }

83

APPENDICE B. LISTATI IN C

B.3 Stampa a schermo dei dati di media

1 #include <s td i o . h>2 #define media_r ( volat i le int ∗) 0x010010303 #define media_l ( volat i le int ∗) 0x0100102045 void imposta f requenza ( int f d e s ) {6 int f ;7 f loat c ;8 i f (48000%(2∗ f d e s ) != 0) {9 c = 48000 .0/(2∗ f d e s ) ;10 f = ( int ) ( round (48000 .0/ c ) ) ;11 }12 else {13 f = fde s ;14 }15 ∗( quadra_r ) = abs ( f ) ;16 ∗( quadra_l ) = abs ( f ) ;17 }1819 void impostaampiezza ( int ades ) {20 ∗( quadra_r+1) = abs ( ades ) ;21 ∗( quadra_l+1) = abs ( ades ) ;22 }2324 int main ( ) {25 int i = 0 ;2627 imposta frequenza (400) ;28 impostaampiezza (10000) ;2930 while (1 ) {31 i++;32 i f ( i == 1000) {33 p r i n t f ( "%d,%d\n" , (∗media_l ) , (∗media_r ) ) ;34 i = 0 ;35 }36 }37 }

84

Bibliografia

[1] C. Cremon, “Progetto di un sistema per il controllo di un pendolo inver-so attraverso attuatori elettromeccanici,” Ottobre 2014. Tesi di laureatriennale, Università degli Studi di Trieste.

[2] Altera R©, “Cyclone ii fpga starter development board - reference ma-nual,” Ottobre 2006. http://www.altera.com/literature/manual/mnl_cii_starter_board_rm.pdf (URL consultato il 5 ottobre 2014).

[3] Altera R©, “De1 development and education board - user manual,”2006. https://www.terasic.com.tw/attachment/archive/83/DE1_UserManual_v1018.pdf (URL consultato il 5 ottobre 2014).

[4] Altera R©, “Cyclone ii device handbook,” 2008. http://www.altera.com/literature/hb/cyc2/cyc2_cii5v1.pdf (URL consultato il 5ottobre 2014).

[5] Graphtec Corporation, 503-10 Shinano-cho, Totsuka-ku, Yokohama244, Japan, Pen Plotter MP4000 series - Command set and ReferenceManual, 10th ed., Febbraio 1991.

[6] W. Microelectronics, “Wm8731/wm8731l - portable internet audio co-dec with headphone driver and programmable sample rates,” Otto-bre 2012. http://www.wolfsonmicro.com/documents/uploads/data_sheets/en/WM8731.pdf (URL consultato il 5 ottobre 2014).

[7] Altera R©, “Introduction to the altera nios ii soft processor,” Mag-gio 2013. ftp://ftp.altera.com/up/pub/Altera_Material/13.0/Tutorials/Nios2_introduction.pdf (URL consultato il 5 ottobre2014).

[8] Altera R©, “Quartus ii handbook version 13.0,” Maggio 2013.http://www.altera.com/literature/hb/qts/archives/quartusii_handbook_archive_130.pdf (URL consultato il 5 ottobre 2014).

[9] Altera R©, “Introduction to the altera qsys system integration tool,” Mag-gio 2013. ftp://ftp.altera.com/up/pub/Altera_Material/13.0/

85

BIBLIOGRAFIA

Tutorials/Introduction_to_the_Altera_Qsys_Tool.pdf (URL con-sultato il 5 ottobre 2014).

[10] Altera R©, “Clock signals for altera de-series boards,” Maggio2011. ftp://ftp.altera.com/up/pub/Altera_Material/11.0/University_Program_IP_Cores/Altera_UP_Clocks.pdf (URLconsultato il 5 ottobre 2014).

[11] Altera R©, “Audio core for altera de-series boards,” Maggio2013. ftp://ftp.altera.com/up/pub/Altera_Material/13.0/University_Program_IP_Cores/Audio_Video/Audio.pdf (URLconsultato il 5 ottobre 2014).

[12] S. B. Jean-Marc Irazabal, “I2c manual,” Marzo 2003. http://www.nxp.com/documents/application_note/AN10216.pdf (URL consultato il 5ottobre 2014).

[13] Altera R©, “Audio/video configuration core for de-series boards,” Mag-gio 2011. ftp://ftp.altera.com/up/pub/Altera_Material/11.0/University_Program_IP_Cores/Audio_Video/Audio_and_Video_Config.pdf (URL consultato il 5 ottobre 2014).

[14] Altera R©, “Embedded peripheral ip user guide,” Luglio 2014.http://www.altera.com/literature/ug/ug_embedded_ip.pdf (URLconsultato il 5 ottobre 2014).

[15] Altera R©, “Avalon interface specifications,” Giugno 2014. http://www.altera.com/literature/manual/mnl_avalon_spec.pdf (URLconsultato il 5 ottobre 2014).

[16] S. Sutherland, “Verilog R© hdl - quick reference guide,” 2001.http://www.sutherland-hdl.com/online_verilog_ref_guide/verilog_2001_ref_guide.pdf (URL consultato il 5 ottobre 2014).

[17] D. J. Smith, HDL Chip Design - A Practical Guide for Designing, Syn-thesizing and Simulating ASICs and FPGAs using VHDL or Verilog.Doone Publications, 2000.

[18] Altera R©, “Creating qsys components,” Giugno 2014. http://www.altera.com/literature/hb/qts/qsys_components.pdf (URLconsultato il 5 ottobre 2014).

[19] Y. Y. K. R. Yang and Z. Li, “Stabilization of a 2-dof spherical pendulumon x-y table,” Proc. IEEE Conf. Control Appl., pp. 724–729, 2000.

[20] Altera R©, “Overview of the hardware abstraction layer,” Mag-gio 2011. http://www.altera.com/literature/hb/nios2/n2sw_nii52003.pdf (URL consultato il 5 ottobre 2014).

86

BIBLIOGRAFIA

[21] Altera R©, “Getting started with the graphical user interface,” Gen-naio 2014. http://www.altera.com/literature/hb/nios2/n2sw_nii52017.pdf (URL consultato il 5 ottobre 2014).

[22] Altera R©, “Nios ii software build tools,” Gennaio 2014. http://www.altera.com/literature/hb/nios2/n2sw_nii52015.pdf (URLconsultato il 5 ottobre 2014).

[23] I. Rogue Wave Software, “Stream input/output,” 1997. http://h30097.www3.hp.com/cplus/iostream.pdf (URL consultato il 5 ottobre 2014).

[24] Altera R©, “Design debugging using the signaltap ii logic analy-zer,” Giugno 2014. http://www.altera.com/literature/hb/qts/qts_qii53009.pdf (URL consultato il 5 ottobre 2014).

87