Quattordicesima parte del tutorial di Marco Gottardo sui PIC. Stesura di Marco Visentini.. Come trattare i segnali analogici.

 

Come realizzare sulla piattaforma Micro-GT mini un Vu Meter Stereo da 8+8 led. Approfondimento e applicazione dei segnali analogici.

Let's Go PIC !!!

Cap. 14

Micro-GT mini shield Vu-Meter stereo.

Autore Marco Visentini con supervisione del prof.  Gottardo

Descrizione

Il circuito qui presentato trasforma la Micro-Gt mini in un Vu-meter stereo a 8+8 Led oppure mono a 16 Led in maniera dipendente dal software che viene sviluppato. Dato che il progetto risulta poter essere una valida tesina scolastica, è stato implementato il solo firmware relativo al funzionamento stereo 8+8 LED, lasciando come esercizio ai lettori lo sviluppo della versione mono a 16 LED. In via sperimentale la tesina è già stata proposta e sviluppata da Marco Visentini con ottimi risultati tecnico/didattici/teorici.

Consiglio a tutti i colleghi insegnanti nelle scuole superiori di proporre questo valido esercizio ai proprio allievi.
prof.M.Gottardo as ad.noctis
A seguire la realizzazione di Marco Visentini a cui hanno seguito test e collaudi approfonditi documentati anche con i video in youtube accessibili tramite i link sottoindicati.
Personalmente ho autorizzato Visentini a firmare questo quattordicesimo capitolo di "Let's GO PIC !!!, al fine di dimostrare la fiducia riposta in questo ottimo tecnico mio ex allievo ai corsi di programmazione dei microcontrollori tenuti presso il centro culturale ZIP di padova.

 Parti del sistema

Il sistema si compone di una parte logica programmabile costituita da una piattaforma Micro-GT mini, che come sappiamo monta per default il microcontrollore 16F876A, ma potrebbe alloggiare anche alcune versioni compatibili a 28 pin della serie 18F.
Necessariamente si deve elaborare il segnale musicale prelevato dalla fonte audio eseguendo il taglio della semionda negativa, in modo da non mettere in crisi i convertitori AD del PIC che ne potrebbero risultare addirittura danneggiati. Si preferisce anche eseguire la compressione logaritmica del segnale in maniera hardware semplificando di conseguenza il firmware.Tale elaborazione è svolta dall'interfaccia che chiameremo Micro-GT mini shield Vu-meter, con numero progressivo 2, rispetto alla serie di shields che il team G-Tronic intende sviluppare per la Micro-GT mini. Lo shield numero 1 verrà presentato da Gottardo nel tutoria successivo a questo, ovvero il numero 15.
Ultima ma non meno importante è la sezione delle barre LED, che possono comunque venire implementate sullo stesso supporto hardware dato che ogni Micro-GT mini contiene una barra a 8 Led agganciabili tramite connessione Flat. In questo tutorial useremo, data la grande disponibilità di PCB, due Micro-GT mini, di cui uno solo monta il microcontrollore, mentre il secondo funge da supporto della barra Led del secondo canale .
Da queste pagine è comunque possibile scaricare i file FidoCad per realizzare in casa ogni elemento del sistema, e per chi lo volesse realizzare in maniera professionale sono scaricabili schemi, Board, e gerber sviluppati in Eagle. Ovviamente, in questo caso, risulterà più semplice chiedere a noi una fornitura via mail che proponiamo a prezzo di costo.

Studio del guadagno dell'amplificatore logaritmico con retroazione negativa,

configurazione non invertente

Analisi dello schema.

Nello schema sotto riportato  il guadagno della retroazione negativa in configurazione non invertente vale… 

Vo=(1+(Rf/Ri))*Vi se Vi arriva a 200 mV(la musica,200mV=0,2V)

Vomax=5V

Prima Condizione: Vo=5V Vi=0,2V Ri=10k

5V=(1+(Rf/Ri))*Vi ==> 25-1=(Rf/Ri) ==> 24=(Rf/Ri) ==> Rf=240k e Ri=10k

Seconda Condizione:Vo=2V Vi=0,2V Ri=10k

2V=(1+(Rf/Ri))*Vi ==> 9=(Rf/Ri) ==> Rf=90k

 

Terza Condizione: Vo? Vi=0,2V Rf=50k Ri=10k

Vo=(1+(Rf/Ri))*Vi ==> Vo=[(10+50)/10]*0,2V ==> V0=1,2V

 

Quarta Condizione: Vo=0,5V Vi=0,2V Ri=10k 

0,5V=(1+(Rf/Ri))*Vi ==> 1,5=(Rf/Ri) ==> Rf=0,00015 Ohm 

 

 

 

Schema elettrico del Mini Shield da applicare alla MICRO_GT mini per ottenere il VU-METER

 SCHEMA ELETTRICO DEL MINI SHIELD DA APPLICARE ALLA MICRO-GT MINI PER OTTENERE IL VU-METER

Download relativo allo schema elettrico ed al layout con Eagle professional

 

Elenco Componenti:
Sezione Interfaccia shield Vu-Meter

Sezione logica (minimale)

Sezione logica (completa)

Come collegare L’hardware
Nella foto seguente vediamo dove collegare i pin 1 e 2 di SV1, all’interno del cerchio rosa che indica il canale analogico AN0 e AN1.
I canali AN0 e AN1 sono infine segnati in rosa nel pinout del pic della Micro-GT mini

 

 

 

Se vogliamo vedere l’effetto Vu-meter sui Led onboard (un solo canale) colleghiamo il cavetto flat in dotazione tra i due connettori cerchiati in rosso, tenendo presente che se vogliamo vedere la barra allungarsi da destra verso sinistra dobbiamo twistare il cavo.

 

 

 

 

Nella successiva immagine invece abbiamo indicato la posizione del PORT C (in arancione) e del PORB (in rosso).
Come possiamo notare due pin sono impegnati dalla porta seriale, dato che per questa applicazione non ci interessa la funzione di comunicazione, possiamo estrarre il MAX232 e prelevare il segnale direttamente dai pin 11 e 12 di questo integrato mancante.

 

 

 

 

Per gli utenti interessati alla sola realizzazione come Vu-Meter, è possibile procurarsi il solo circuito stampato e montare solo gli elementi strettamente necessari come in figura.
Questo porta alla minimizzazione dei costi.

 

 

 

Come si vede nella foto anziché lo zoccolo abbiamo montato al posto dei pin 11 e 12 un stripline a 2 connessioni.
Ricordiamoci che le uscite del PIC possono pilotare i LED direttamente dato che sopportano anche 25mA ma bisogna ricordarsi della resistenza di limitazione della corrente.
Un valore valido può essere di 330 ohm per ogni anodo.
I catodi poi si richiudono tutti verso una massa o della scheda Micro-GT o del mini shield dato che queste sono in comune.

 

Ecco l’aspetto del frontalino con 10 Led montati, basterà limitare a 8 per fila.
Si tratta di un porta LED standard che il prof Gottardo usa nelle sue realizzazioni.

 

 

 

Programmazione in C16 della Micro-GT mini con il PIC16F876A.

Il programma in C è suddiviso in tre moduli due di tipo header e uno sorgente .c che contiene il main.
- il file "settaggiADC.c" contiene le impostazioni dei registri PORTx.  E’ qui che si abilitano i due ingressi come analogici, questo file viene incluso nel programma principale(VU-METER.c).
- il file ADC.h" è il modulo standard, usato dal prof. Gottardo nei precedenti tutorial, per la lettura per i segnali analogici. Viene incluso nel programma principale(VU-METER.c).

- nel modulo "VU-METER.c" vi è la funzione di prelevare i due segnali dai 2 ingressi analogici generati dal mini shield Vu-Meter, atraverso i quali vengono generati i picchi luminosi nelle barre led.

 

 

Contenuto del file "VU-METER.c"

 /******************************************************

 *       VU-METER STEREO A 8+8 LED          *

 *    DA INSERIRE NELLA MICRO-GT MINI     *

 *           Eseguito da Marco Visentini             *

 ******************************************************/

#include           <pic.h>

#include           "delay.h"

//#include         "delay.c"

#include           "ADC.h"  

#define             smin     10

#define             smax    1023

#include           "settaggiADC.h"

//Routine principale...  

void main(){           

            settaggiADC();

            unsigned int      valore1;

            unsigned int      incr;

            unsigned int  valore2;

            unsigned int      incr1;

            //TRISB=0x00;     //PORTB tutte uscite

            //TRISA=0xFF;     //PORTA tutti ingressi per gli A/D 

            /*

                        ADCON1

                        1 - ADFM Risultato giustificato a destra (0 SX)

                        0 - non usato

                        0 - non usato

                        0 - non usato

                        0 - PCFG3 Tutti ingressi analogici

                        0 - PCGG2 Vref

                        0 - PCFG1 -Vdd

                        0 - PCFG0 -Vss

            */ 

            /*

                        ADCON0

                        0 - ADCS1 Frequenza oscillatore

                        1 - ADCS0 Fosc/8 (1/4Mhz=0.23uS .25*8=2uS minimo 1.6uS)

                        0 - CHS2

                        0 - CHS1 Seleziona l'ingresso dell'ADC

                        0 - CHS0

                        0 - ADGO Mettere a 1 per inizio conversione 0 -Fine conversione.

                        0 - non usato

                        0 - ADON ON/OFF ADC (1 ON) Quando ON consuma!!!

            */ 

            ADCON1 = 0b10000000;           

                        incr=(smax-smin)/9;                              

                        incr1=(smax-smin)/9; 

            while(1){                       

                        valore1=leggi_ad(0);                       

                        if((valore1>=smin)&&(valore1<=smin+incr)){

                                   PORTB=0b00000000;

                        }                       

                        if((valore1>=smin+incr)&&(valore1<=smin+2*incr)){

                                   PORTB=0b00000001;

                        }                       

                        if((valore1>=smin+2*incr)&&(valore1<=smin+3*incr)){

                                   PORTB=0b00000011;

                        }                       

                        if((valore1>=smin+3*incr)&&(valore1<=smin+4*incr)){

                                   PORTB=0b00000111;

                        }                       

                        if((valore1>=smin+4*incr)&&(valore1<=smin+5*incr)){

                                   PORTB=0b00001111;

                        }                       

                        if((valore1>=smin+5*incr)&&(valore1<=smin+6*incr)){

                                   PORTB=0b00011111;

                        }                                              

                        if((valore1>=smin+6*incr)&&(valore1<=smin+7*incr)){

                                   PORTB=0b00111111;

                        }                                                                                             

                        if((valore1>=smin+7*incr)&&(valore1<=smax+8*incr)){

                                   PORTB=0b01111111;                                  

                        }                                   if((valore1>=smin+8*incr)&&(valore1<=smax)){

                                   PORTB=0b11111111;                                  

                        }                                              

                        valore2=leggi_ad(1);                       

                        if((valore2>=smin)&&(valore2<=smin+incr1)){

                                   PORTC=0b00000000;

                        }                       

                        if((valore2>=smin+incr1)&&(valore2<=smin+2*incr1)){

                                   PORTC=0b00000001;

                        }                       

                        if((valore2>=smin+2*incr1)&&(valore2<=smin+3*incr1)){

                                   PORTC=0b00000011;

                        }                       

                        if((valore2>=smin+3*incr1)&&(valore2<=smin+4*incr1)){

                                   PORTC=0b00000111;

                        }                       

                        if((valore2>=smin+4*incr1)&&(valore2<=smin+5*incr1)){

                                   PORTC=0b00001111;

                        }                       

                        if((valore2>=smin+5*incr1)&&(valore2<=smin+6*incr1)){

                                   PORTC=0b00011111;

                        }                                              

                        if((valore2>=smin+6*incr1)&&(valore2<=smin+7*incr1)){

                                   PORTC=0b00111111;

                        }                                                                                             

                        if((valore2>=smin+7*incr1)&&(valore2<=smax+8*incr1)){

                                   PORTC=0b01111111;                                  

                        }

                                   if((valore2>=smin+8*incr1)&&(valore2<=smax)){

                                   PORTC=0b11111111;                                  

                        }

            }                         

}

 

 

Contenuto del file "settaggiADC.h"

void settaggiADC(){

__CONFIG (HS & WDTDIS & PWRTDIS & BORDIS & LVPDIS & DUNPROT & WRTEN & DEBUGDIS & UNPROTECT);
//ADCON1=0b00000111; //DISABILITA GLI INGRESSI ANALOGICI: 00000111 (CIOE' 7) DISABILITA TUTTI GLI INGRESSI
//CMCON=0b00000111; //DISABILITA I COMPARATORI ANALOGICI
TRISA=0XFF;
TRISB=0;
TRISC=0;
TRISD=0; //Attenzione questo registro non esiste nel 16F876 darebbe errore di compilazione
TRISE=0;
PORTA=0;
PORTB=0;
PORTC=0;
PORTD=0;
PORTE=0;
}


Contenuto del file "ADC.h"

/*************************************************************
*                                            G-Tronic Robotics                                               *
*           MODULO PER LA LETTURA DEI CANALI ANALOGICI              *
*                            Piattaforma Micro-GT Versatile IDE                                     *

*                                 processore :16F876A/877A                                            *
*                                    chiamare la fz leggi_ad(n);                                             *
*                            done n: numero del canale in ingresso                                    *
*                                                                                                                        *
*                                                                                                                        *
**************************************************************/

int leggi_ad(char canale)
{
int valore;

ADCON0 = (canale << 3) + 0xC1; // abilita il convertitore ADC, RC osc.

DelayUs(10); //Ritardo per dare modo all'A/D di stabilizzarsi

ADGO = 1; //Fa partire la conversione

while(ADGO)
continue; //Attende che la conversione sia completa

valore=ADRESL; //Parte bassa del risultato
valore= valore + (ADRESH<<8); //Parte alta del risultato

return(valore);
}

 

 

Download progetto completo Vu-Meter-Stereo(MpLab)

 

Fase di simulazione.
Prima di montare e collegare tra loro le 3 schede ho verificato il funzionamento logico del FIRMWARE (file.HEX) attraverso il "REAL PIC SIMULATOR" utilizzando come "segnale di picco" quello generato da due potenziometri, uno per il canale destro e l'altro per il canale sinistro, cioè il primo collegato ad AN0 e l'altro collegato con AN1.
Le 2 barre da 8 LED, una va collegata al PORT B invece l'altra al PORTC.
Una volta regolate le seguenti impostazioni,è stata eseguita la simulazione:se sposto verso destra la leva del potenziometro collegato ad AN0, si illuminano i led del PORTB, spostando la leva tutta a destra si illuminano tutti i led della relativa "barra led", se invece sposto il cursore del potenziometro tutto a sinistra si ha lo spegnimento di tutta la barra led. Lo stesso vale per il potenziometro collegato ad AN1 con la barra led collegata al PORTC.

 

 

 

 

Nel video sottostante viene illustrata la simulazione del firmware attraverso l'utilizzo del real pic simulator commentandola vocalmente.

 

Video1

 

 

Realizzazione rapida di un prototipo
Lo sviluppo di un prototipo in maniera rapida può' realizzarsi mediante l'acquisto di 1 micro-gt mini, di 2 barre porta led(che contengano 8 led) e il pcb del mini shield realizzabile come prototipo utilizzando il file realizzato in FidoCad scaricabile su questo articolo,oppure mediante l'acquisto di un pcb professionale vu-meter a 2 canali realizzato dal dott. GOTTARDO.
Per coloro che non sanno come procurarsi queste schede mi possono contattare.
Nel video qui sotto si nota l'utilizzo di 2 pcb micro-gt mini, sulla prima dove alloggia il microcontrollore 16F876A serve per generare il segnale per le 2 barre led, in cui la prima barra led si trova sul PCB stesso, per la seconda barra led invece è stato utilizzato un secondo PCB micro-gt mini.

Video2 

 

Licenza Creative Commons
This opera is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Italy License.