PIERIN COME MICRO GENERATORE DI SEGNALI 1

Documenti analoghi
Raccolta Test di Laboratorio di Sistemi a Microcontrollore

ESERCIZI - SERIE N. 4

Capitolo IX. Convertitori di dati

GENERATORE DI BASE TEMPI

Nicola Amoroso. Corso introduttivo sui microcontrollori PIC PWM.

REALIZZAZIONE DI UN FILTRO PASSA BASSO CON IL MICRO-CONTROLLORE PIC16F876 SERGIO DI DOMIZIO LABORATORIO DI ELETTRONICA

Corso di Informatica Applicata. Lezione 7. Università degli studi di Cassino

ENCODER DTMF CON PIC 16F1705

1. CONVERSIONE ANALOGICO DIGITALE: SCHEMA, FUNZIONALITÀ E CARATTERISTICA DELL ADC

Corso di ELETTRONICA INDUSTRIALE INVERTITORI MONOFASE A TENSIONE IMPRESSA

; Registro abilitazione interrupt TR_A EQU 85H ; Tris A TR_B EQU 86H ; Tris B

G&G ESEMPIO1 PROGRAMMAZIONE Progetto FACILEPLC Pag. 1 di 6

Lezione 6 L'hardware dedicato.

Page 1. Elettronica delle telecomunicazioni. f i. f r. f o. f u f u = (N/M) f u ETLCE - B5 08/03/ DDC 1

ESERCIZI SUI SISTEMI DI NUMERAZIONE

Esercitazione Talentis. Marco Branciforte

M320 ESAME DI STATO DI ISTITUTO TECNICO INDUSTRIALE

INGEGNERIA E TECNOLOGIE DEI SISTEMI DI CONTROLLO Processori per sistemi di controllo

Architettura del calcolatore (Seconda parte)

GESTIONE DEI TEMPI CON IL TIMER1 DEL PIC16F876

Familiarizzazione con arduino

Architettura del PIC 18F452

I microcontrollori PIC parte III

Esercitazione 6: Convertitori A/D Delta e Sigma-Delta

Terza esercitazione - Circuito che emula una catena di acquisizione del segnale. Vout. Sistema di conversione (10kHz; 0 +5V)

Classe V specializzazione elettronica. Elettrotecnica ed elettronica

Prof. Capuzzimati Mario - ITIS Magistri Cumacini - Como MICROCONTROLLORE

PUNTATORE LASER AUTOMATICO CON COMANDO VIA ETHERNET

Architetture dei sistemi elettronici 14. Il microcontrollore

Lab. T.P.S.E.E. - ITT Cerulli

DECODER DTMF CON UN SOLO PIC

Nicola Amoroso. Corso introduttivo sui microcontrollori A. S La programmazione dei PIC TIMERS.

INTRODUZIONE alla PROGRAMMAZIONE di MICROCONTROLLORI

SISTEMI DI ACQUISIZIONE

ELETTRONICA APPLICATA E MISURE

MST_K12. Regolatore di velocita per motori in CC. Realizzazione e Applicazione

Maturità Elettronica e Telecomunicazioni TEMA DI ELETTRONICA

Applicazioni dei microcontrollori PIC

Corso di programmazione Arduino DI MALVEZZI DAVIDE

Lezione 8. Figura 1. Configurazione del registro INTCON

Esercitazione 4 : CONVERTITORE D/A CON RETE A SCALA

I PIC Partendo da Zero By link_89

PIC E DISPLAY A 7 SEGMENTI CON

Discharge. Timer 555. Threshold. Trigger

Lezione 1 Caratteristiche principali del PIC16C84 L'hardware

FONDAMENTI DI INFORMATICA

Esperienza 9 (continua) Esperienza 10. Marco Vignati Laboratorio di Sistemi e Segnali

RELAZIONE DI TELECOMUNICAZIONI ITIS Vobarno Titolo: Fourier: analisi di spettro

Lezione 2. Figura 1. Schema del circuito necessario per le prove

MODULAZIONE AD IMPULSI

6. GENERATORI DI SEGNALI DIGITALI

oscilloscopio Generatore di funzioni

Generatore di funzioni GW Instek SFG Laboratorio Canali

Controllo di una soglia analogica

Generatore di funzioni. Modalità operative Circuito di uscita Uso del generatore di funzioni

Esame di INFORMATICA ARCHITETTURA DI VON NEUMANN. Lezione 4 ARCHITETTURA DI VON NEUMANN

SDR - Quando la R diventa una T Seconda parte

Pilotare un motore passo-passo, in questo caso il modello della Sanyo le cui caratteristiche principali sono quelle di figura1.

LSS ADC DAC. Piero Vicini A.A

Componenti e connessioni. Capitolo 3

Componenti principali. Programma cablato. Architettura di Von Neumann. Programma cablato. Cos e un programma? Componenti e connessioni

Davide Gennaretti, Matteo Nicolini

Introduzione alla scheda Arduino/Genuino

ISTITUTO ISTRUZIONE SUPERIORE "L. EINAUDI" ALBA ANNO SCOLASTICO 2015/2016

Le modulazioni impulsive

Alimentatore master. Introduzione

Il convertitore bidirezionale a commutazione forzata trova ampio impiego anche in versione trifase.

Architettura dei Microcontrollori Microchip PIC18F

Rappresentazione digitale del suono

Componenti principali

Esame di INFORMATICA Lezione 4

Invertitori trifase a tensione impressa

Il Theremin con il microcontrollore

Il precedente programma è scritto in linguaggio Assembly per Z80. Il programma indicato sopra deve essere tradotto in codice Assembly per PIC

Transcript:

Fabio Bicciato (c1b8) PIERIN COME MICRO GENERATORE DI SEGNALI 13 September 2013 Introduzione In questo secondo articolo della serie "Pierin come Micro strumentino" proviamo a realizzare un semplice generatore di segnali. Andremo ad implementare un generatore di onde sinusoidali, triangolari ed a dente di sega. In questo articolo si farà uso di uno dei PWM interni al PIC come convertitore DAC e della tecnica DDS, implementata nel firmware, per generare le diverse forme d'onda. Vedremo come sia semplice implementare altre forme d'onda. Anche in questo caso si è cercato di utilizzare solo la schedina Pierin PIC18 collegata ad un PC. In realtà si è reso necessario aggiungere un filtro Passa-Basso per la realizzazione del convertitore DAC. Da PC è possibile selezionare la forma d'onda da generare e la frequenza del segnale stesso. Frequenza che può variare da 1 Hz a 20 khz con risoluzione di 0,1 Hz. Non è possibile variare l'ampiezza in tensione del segnale generato. La scelta di non impiegare un DAC esterno, unita alla "scarsa" efficienza del filtro realizzato e alla bassa frequenza di campionamento, rendono tuttavia già a partire da 10 khz di frequenza i segnali generati non molto "buoni". Ecco alcune immagini di esempio dei segnali generati. PIERIN COME MICRO GENERATORE DI SEGNALI 1

Sinusoide 1kHz Triangolo 1kHz PIERIN COME MICRO GENERATORE DI SEGNALI 2

Sega 1kHz DDS: Direct Digital Synthesis Il sistema utilizza la tecnica DDS per generare le varie frequenze in uscita. L'impiego della DDS consente una variazione delle frequenze del segnale molto rapida, con ottima precisione ed è realizzabile con poche righe di codice. Una ottima presentazione della tecnica DDS la si può trovare in Questo ottimo articolo di brabus. Riepilogo molto brevemente la tecnica stessa al fine solo di comprendere le parti di firmware scritte nel seguito. Un sistema DDS può essere schematizzato come segue: PIERIN COME MICRO GENERATORE DI SEGNALI 3

Accumulatore di fase L'accumulatore di fase è un registro a N bit che viene incrementato, di un valore M, ad ogni ciclo di clock Fclk. Il valore in uscita all'accumulatore rappresenta il valore della fase del segnale che si desidera generare, tale valore dovrà essere convertito nel corrispondente valore di ampiezza. Il valore di incremento M in ingresso all'accumulatore determina quindi lo step della fase e di conseguenza la frequenza del segnale di uscita. Semplicemente variando M è possibile ottenere valori di frequenza in uscita diversi. La risoluzione di frequenza ottenibile in questo modo è dipendende dal numero di bit dell'accumulatore e dalla frequenza di incremento dello stesso (Fclk). Supponendo infatti di incrementare di un valore pari a 1 l'accumulatore ad ogni ciclo di clock, per un accumulatore di N bit, otterremo tutti i possibili valori di fase dopo: ovvero con una risoluzione in frequenza pari a: (1) da cui possiamo scrivere (2) E' facile dalla (2) determinare il valore di M da utilizzarsi per ottenere una qualsiasi frequenza Fout: Nel progetto è stato realizzato un accumulatore da 26 bit ed è stata utilizzata una frequenza di clock pari a circa 88235,2942 Hz, per una risoluzione massima PIERIN COME MICRO GENERATORE DI SEGNALI 4

pari a 0,00131480834186077118 Hz. Il software PC consentirà però di selezionare frequenze a step di 0,1 Hz. Convertitore Fase/Ampiezza (ROM Table) Il secondo fondamentale componente di un sistema DDS è il convertitore Fase/ Ampiezza. Questo componente riceve in input il valore di uscita all'accumulatore e lo converte nel corrispondente valore di ampiezza del segnale. E' stato realizzato come tabella contenente tutti i valori di un periodo completo del segnale da generare (ad esempio una sinusoide) memorizzata nella memoria programma del PIC. Avere tutti i valori di un periodo del segnale pre-calcolati in memoria consente un rapido accesso agli stessi (lookup table) e nessun calcolo matematico particolare. Il convertitore Fase/Ampiezza potrebbe non ricevere in input tutti gli N bit dell'accumulatore ma solo una loro parte. Ad esempio con l'accumulatore del nostro progetto, a 26 bit (N=26), il numero di entrate della tabella sarebbe eccessivo per un PIC, in questi casi si utilizzano solo alcuni bit dell'accumulatore stesso (i più significativi). L'uscita del convertitore Fase/Ampiezza, ancora digitale e di B bit, determina la risoluzione verticale del segnale. Nel progetto è stata utilizzata una tabella di 1024 elementi (i 10 bit più significativi dell'accumulatore) con uscita ad 8 bit (1 byte) impegnando quindi 1kB di memoria per ogni forma d'onda da generare. DAC e LPF L'uscita digitale del convertitore Fase/Ampiezza viene convertita in analogico da un DAC. Nel progetto è stato utilizzato uno dei PWM interni al PIC, in combinazione con un filtro passa-basso (LPF), per limitare al minimo l'impiego di componenti aggiuntivi e consentire di verificare subito i risultati ottenuti da firmware. La scelta effettuata non è sicuramente la migliore, anche se la realizzazione di un DAC con PWM è un'ottima soluzione per segnali a bassa frequenza che consente di contenere i costi sia in componenti sia in spazio sullo stampato. Per ottenere risultati migliori si potrebbe ad esempio inviare l'uscita del convertitore Fase/Ampiezza direttamente in uscita su una porta del PIC e realizzare un DAC con una rete R2R o impiegare un DAC esterno o ancora utilizzare un microcontrollore che integri al proprio interno un DAC. La conversione da digitale ad analogico mediante PWM si ottiene modificando il valore del Duty Cycle del segnale ad onda quadra del PWM. Come descritto in questo documento, il valore della componente continua in uscita da un segnale PWM a frequenza costante è direttamente proporzionale al valore del Duty Cycle del segnale PIERIN COME MICRO GENERATORE DI SEGNALI 5

stesso. Un opportuno filtro in cascata consente di ridurre l'interferenza sul segnale dato dalla frequenza del PWM ed ottenere solo la componente continua proporzionale al valore del Duty Cycle impostato. Nel progetto ho utilizzato il seguente filtro: Software lato PC Il software PC necessario alla selezione della forma d'onda desiderata e alla frequenza è stato integrato nel software del Logic Analyzer presentato in questo articolo, al quale rimando per l'installazione. La nuova versione è scaricabile in allegato al presente documento. PC.jpg Come visibile dall'immagine l'interfaccia grafica è estremamente semplice. PIERIN COME MICRO GENERATORE DI SEGNALI 6

Firmware PIC Anche il firmware del PIC è stato integrato nel firmware del Logic Analyzer consentendo quindi di avere contemporaneamente nel PIC entrambi gli strumentini. DAC Per la realizzazione del DAC è stato utilizzato il modulo CCP7, uscita RB7 del Pierin, configurato come PWM utilizzando il Timer6 come temporizzatore. La frequenza del PWM scelta è la più alta possibile, per consentire al filtro LPF di meglio rimuoverla, ma tale per cui la risoluzione del Duty Cycle non scenda sotto gli 8 bit. Si è quindi utilizzato una frequenza pari a 176470,5882 Hz. La parte di codice che inizializza il PWM è la seguente: PR6 = 67; // PWM7 = 5.66666us --> 176470,5882Hz T6CON = 0x04; // Timer6 ON; 1/1 Prescaler CCPTMRS1 = 0x84; // PWM4 <- TIMER2; PWM5 <- TIMER4; PWM7 <- TIMER6; CCPR7L = 0x20; // DT PWM7 --> 50% CCP7CON = 0x0f; // PWM Mode; DT PWM7 Fase/Ampiezza Le tabelle per la conversione Fase/Ampiezza delle diverse forme d'onda sono state pre-calcolate con Excel, quindi salvate nella memoria programma del PIC in 3 array di char da 1024 elementi ciascuno: sinearray[], sawtootharray[] e trianglearray[]. Per consentire una maggiore velocità di accesso ai valori stessi si è però preferito copiare la tabella della forma d'onda da utilizzare, sempre una per volta in funzione della richiesta del PC, in RAM. void preparegenbuffer(char type) { int p=0; waveflag=0; switch (type) { case GEN_TYPE_SINE: waveflag=1; for (p=0; p<buffer_size; p++) { setbufferchar(p, sinearray[p]); break; case GEN_TYPE_TRIANGLE: PIERIN COME MICRO GENERATORE DI SEGNALI 7

waveflag=4; for (p=0; p<buffer_size; p++) { setbufferchar(p, trianglearray[p]); break; case GEN_TYPE_SAWTOOTH: waveflag=2; for (p=0; p<buffer_size; p++) { setbufferchar(p, sawtootharray[p]); break; default: for (p=0; p<buffer_size; p++) { setbufferchar(p, 128); break; E' possibile generare un qualsiasi altro segnale periodico semplicemente introducendo la nuova tabella e prevedendone la copia in RAM ad opportuna richiesta del PC. Ricordo che la tabella deve essere di 1024 elementi, in questi 1024 elementi deve essere codificato un ciclo completo del segnale e che i valori della tabella variano da 0 a 255 con il valore 128 corrispondente al valore centrale (equivalente ai 0V) in uscita al DAC. Accumulatore di fase Il valore utilizzato per l'incremento dell'accumulatore di fase viene calcolato ogni qual volta il PC invia la richiesta di cambio frequenza. Queste le istruzioni, molto semplici, per il calcolo: /** CONSTANTS ******************************************************/ #define GEN_SAMPLE_RATE (float)88235.2942 #define GEN_TMR0_VALUE 145 // Accumulatore a 26bit #define GEN_MAX_VALUE #define GEN_FREQ_MULT 0x04000000 (float) GEN_MAX_VALUE/GEN_SAMPLE_R PIERIN COME MICRO GENERATORE DI SEGNALI 8

freq = *((float*)&receiveddatabuffer[2]); addvalue = GEN_FREQ_MULT*freq; Il "cuore" del sistema è realizzato all'interno della routine di interrupt per overflow del Timer0. Per avere una precisa frequenza di clock ho infatti utilizzato il Timer0 impostato in modo da generare overflow, con conseguente interrupt, ad una frequenza di 88235.2942 Hz circa. Questa frequenza è stata scelta in modo da poter essere la più alta possibile ma non superiore alla metà della frequenza del PWM: questo per consentire al PWM di presentare in uscita almeno 2 cicli con l'ultimo Duty Cycle impostato. Questa la routine di interrupt: _asm void YourHighPriorityISRCode() { // 6+10 = 16 Chiamata+Salvataggio // 10+2 = 12 Ripristino+Ritorno WREG, WREGsave STATUS, STATUSsave FSR0H, FSRHsave FSR0L, FSRLsave BSR, BSRsave btfsc INTCON, 2, 0 BRA interrupt_tmr0 BRA interrupt_exit interrupt_tmr0: btfss INTCON, 5, 0 BRA interrupt_exit movlw GEN_TMR0_VALUE movwf TMR0L, 0 movlb accumulatore bcf STATUS, 0, 0 movf addvalue, 0, 1 addwfc accumulatore, 1, 1 movf addvalue+1, 0, 1 PIERIN COME MICRO GENERATORE DI SEGNALI 9

addwfc accumulatore+1, 1, 1 movf addvalue+2, 0, 1 addwfc accumulatore+2, 1, 1 movf addvalue+3, 0, 1 addwfc accumulatore+3, 1, 1 accumulatoresend: movlw 0x03 andwf accumulatore+3, 1, 1 movf accumulatore+2, 0, 1 movwf FSR0L, 0 rlncf accumulatore+3, 0, 1 iorlw 0x01 movwf FSR0H, 0 bcf ccp7contemp, 5, 1 bcf ccp7contemp, 4, 1 bcf STATUS, 0, 0 rrcf INDF0, 0, 0 btfsc STATUS, 0, 0 bsf ccp7contemp, 4, 1 bcf STATUS, 0, 0 rrcf WREG, 0, 0 btfsc STATUS, 0, 0 bsf ccp7contemp, 5, 1 movlb 0xf ccp7contemp, CCP7CON movwf CCPR7L, 1 interrupt_exit: BSRsave, BSR WREGsave, WREG STATUSsave, STATUS FSRHsave, FSR0H FSRLsave, FSR0L bcf INTCON, 2, 0 _endasm retfie 0 PIERIN COME MICRO GENERATORE DI SEGNALI 10

Realizzata in assembler per consentire la maggiore velocità di esecuzione possibile, la routine prima di tutto si preoccupa di salvare i registri che andrà a modificare, quindi reimposta il timer0, incrementa l'accumulatore, recupera il dato dalla tabella di conversione Fase/Ampliezza ed imposta il Duty Cycle del PWM. L'accumulatore è composto da 4 byte avendo scelto di implementare un accumulatore da 26 bit. Ho scelto un accumulatore a 26 bit per poter avere una risoluzione di almeno 0,1Hz e richiedere il minor numero di elaborazioni necessarie al fine di estrarre i 10bit più significativi necessari all'indirizzamento della tabella. 26 bit corrispondono infatti a 3 byte + 2 bit: i 10 bit si ottengono quindi utilizzando direttamente i 2 byte più significativi dei 4 che compongono l'accumulatore. Download Questi i link per il download di tutte le parti necessarie: Programma PC Sorgenti del Firmware HEX del Firmware Ricordo che il firmware può essere trasferito al Pierin mediate il Bootloader. Per l'installazione e l'esecuzione del programma su PC si veda questo articolo. Estratto da "http://www.electroyou.it/mediawiki/ index.php?title=userspages:c1b8:pierin-come-micro-generatore-di-segnali" PIERIN COME MICRO GENERATORE DI SEGNALI 11