Settima parte del tutorial di Marco Gottardo sui PIC. Come i PIC gestiscono i segnali analogici. La piattaforma di riferimento è la Micro-GT PIC versatile IDE, ma gli esercizi posso essere sviluppati anche su breadboard sul PIC 16F877A o .

Let's GO PIC!!!

cap.7

i canali analogici.


Eccoci finalmente giunti al passaggio obbligato dello studio dei segnali analogici che costituirà anche un salto di qualità del programmatore.  Vedremo alcuni esempi di interfacciamento dei più comuni sensori e ragioneremo insieme sull'hardware necessario e la configurazione necessaria per la corretta lettura del valore in campo. Come al solito l'articolo verrà esposto con una descrizione semplice e didattica alla portata di tutti ma non trascuriamo di aver ben compreso le edizioni precedenti del tutorial. Non mi resta che augurare buona lettura di questo settimo capitolo di Let's GO PIC !!!.  

Convertitori A/D integrati nel PIC 876A e 877A.


Il processore di riferimento 16F877A possiede ben 8 canali analogici indicati in viola nell'immagine sottostante.

Per default i convertitori analogici digitali sono abilitati come anche la funzione cattura e confronta abbinata ai medesimi pin.



Nel proccessore 16F876A il numero dei canali e' ridotto a 5 come rappresentato nell'immagine sottostante.

Per entrambi i processori le masse sono indicate in nero, le alimentazioni in rosso e l'ingresso del segnale di reset in marrone.

I due processori sono entrambi alloggiabili nel textool della Micro-GT Versatile I.D.E. mentre nella Micro-GT mini presentata a partire dal capitolo 10 sara' alloggiabile solo il pic 16F876A e i compatibili 18FXXX a 28 pin.

Teniemo ben presente che citare dei registri inesistenti nel sorgente "C" comporta un errore di compilazione, come spesso accade in un sogente per 877A compilato per 876A in merito alla definizione del PORTD e del PORTE.

L'architettura e' grosso modo comune quindi se si usano solo risorse comuni le compilazione deve andare a buon fine, se questo non avenisse cliccare sulla sezione "Configure" -> " Select Device" dove imposteremo 16F877A. Vedi immagine.

Fatta questa manovra la compilazione deve andare a buon fine. Il problema protrebbe presentarsi perche' la routine standard che fornisco in questo articolo e' applicabile a più tipi di processore e potrebbe portarsi dietro delle impostazioni di un vostro precedente uso. A tal proposito "settaggiADC.h", il commento spiega chiaramente quando escludere queste righe dalla compilazione.

I registri di configurazione dei canali analogici si chiamano ADCON1 e ADCON2 entrambi a 8 bit, e vanno settati bit per bit a seconda dell'applicazione.

I registri si si trovano per entrambi i microcontrollori agli stessi indirizzi interni.

Per creare la comparazione per effetto barbraph che vogliamo in questo articolo sono sufficienti i comandi sottostanti.

Tabella riassuntiva dei registri al BANK 0

1eh risultato del_byte  alto del convertitore analogico digitale        
1fh ADCON0  ADCS1 ADCS0 CHS2 CHS1 CHS2 GO/DONE  -  ADON

0000_00-0

 

 

Tabella riassuntiva dei registri al BANK 1.

 

9Eh ADRESL A/D result register parte bassa          
9Fh ADCON1  ADFM   - - - PCFG3 PCFG2 PCFG1 PCFG0 0---,0000  

 

Il data book del 16F877A spiega come impostare questo PIC a pag. 111.

/*
        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 assorbe potenza
    */

.

Collegamenti all'hardware della Micro-GT versatile I.D.E.

.Nella prossima immagine vediamo la posizione dei connettori della scheda da collegare tramite cavo Flat. La tensione a 5 Volt e la massa risultano gia' internamente connesse ai trimmer multigiro.

Sul lato textool lo schema elettrico, che mostra dove effettuare le conessioni e' il seguente, dove si nota la presenza dei due jumper JPA e JPB che consentono il collegamento dei canali analogici AN6 e AN7 quando sullo zoccolo e' inserito il 16F877A. Tali jumper sono un errore hardware quando invece sia inserito il microcontroller 16F876A.

In questo firmware e' collegato solo il primo trimmer multigiro al primo canale analogico, ovvero il pin 2 del 877A e al medesimo del 876A.

Collegare via cavo flat il connettore stripline maschio SV15 al connettore SV16.

Per quanto riguarda l'impostazione dei collegamenti nel nuovo modello "Micro-GT mini" presentato qui in anteprima, sara' necessario collegare esternamente tramite cavo flat i pin indicati in figura ai cursori dei 5 canali analogici acquisibili.

Architettura interna.
L'architettura interna del PIC 16F876A e' visibile nel diagramma a blocchi:
 
posto la pagina n 111 del data book ufficiale di MicroChip in cui sono spiegate le funzionalita' dei singoli bit dei registri interessati.
 
 
.
.
Analisi del firmware.

Scarica il progetto MpLab ADC soglia_rampa -> ADCsoglia(1).zip

Scompattate il file zip nella cartella "picproject" che avete creato sulla cartella documenti (come suggerito fin dal primo episodio del nostro corso online). Cliccate sul file progetto, ovvero quello con l'icona rossa e estensione .mcp (MicroChip project).

Se la vostra istallazione di MpLab e' corretta automaticamente verra' aperto tutto il progetto.

Nel box del progetto dovete vedere questi files:

Il mio stile di programmazione impone una sudduvisione modulare (su file distinti) delle principali funzioni e intestazioni "header" in modo da rendere più agevoli le eventuali azioni di debug.

Nel precedente progetto vediamo 3 files standard  delay.c, delay.h, always.h, che per agevolare la portatilita' suggerisco tenere la medesima cartella del progetto. I rimanenti file sono a cura del programmatore.

Vediamo cosa contengono:

Vediamo il contenuto dei file nel dettaglio

Contenuto del file "ADCsoglia.c"

/**********************************************
 *         G-Tronic Robotic                                  *
 *       Let's GO PIC!!! cap.7                             *
 * Piattaforma: Micro-GT PIC versatile IDE *
 *         16F877A - 16F876A                            *
 * CONFRONTO DI UN CANALE ANALOGICO       *
 *     tramite un potenziometro                      *
 *                                                                        *
 *       Corso ZIP febbraio 2011                     *
 *                                                                        *
 *********************************************/

#include    <pic.h>
#include    "delay.h"
//#include    "delay.c"
#include    "ADC.h"


#define     smin    150
#define        smax    1023
#include    "settaggiADC.h"


//Routine principale...


void main(){
   
    settaggiADC();
   
    unsigned int    valore1;
    unsigned int    incr;


    //TRISB=0x00;     //PORTB tutte uscite
    //TRISA=0xFF;     //PORTA tutti ingressi per gli A/D

   
    ADCON1 = 0b10000000;
   
        incr=(smax-smin)/8;

    while(1){
       
        valore1=leggi_ad(0);
       
        if((valore1>=smin)&&(valore1<=smin+incr)){
            PORTB=0b00000001;
        }
       
        if((valore1>=smin+incr)&&(valore1<=smin+2*incr)){
            PORTB=0b00000011;
        }
       
        if((valore1>=smin+2*incr)&&(valore1<=smin+3*incr)){
            PORTB=0b00000111;
        }
       
        if((valore1>=smin+3*incr)&&(valore1<=smin+4*incr)){
            PORTB=0b00001111;
        }
       
        if((valore1>=smin+4*incr)&&(valore1<=smin+5*incr)){
            PORTB=0b00011111;
        }
       
        if((valore1>=smin+5*incr)&&(valore1<=smin+6*incr)){
            PORTB=0b00111111;
        }
               
        if((valore1>=smin+6*incr)&&(valore1<=smin+7*incr)){
            PORTB=0b01111111;
        }
                               
        if((valore1>=smin+7*incr)&&(valore1<=smax)){
            PORTB=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 Robotic                                              *
* MODULO PER LA LETTURA DEI CANALI ANALOGICI    *
*    Piattaforma    Micro-GT Versatile IDE                               *

*    processore :16F877A                                                         * 
*    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);   
}

Fase di simulazione.

La simulazione del software e' stata eseguita con RealPIC simulator, come per i precedenti capitoli. Nelle prossime immagini vediamo come settare il simulatore.

 

Nella colonna dei comandi grafici, posti nella colonna di sinistra, selezioniamo il diodo rosso, e seguiamo i tabs che si attivano in modo da impostare il LedBar per il PORT B. Dopo avere impostato il primo led come RB0, clicchiamo sullo stesso e seguiamo le indicazioni "next follow down" che in automatico numera i rimanenti fino a RB7.

La manoppla graduata posta sotto il LED (colonan dei comandi grafici) attiva invece la barra analogica "Analog 0" che scorrendo da sinistra a destra fornira' alla variabile analogica il valore tra 0 e 1023.

Il firmware, caricato nel simulatore eseguira' le comparazioni software ed accendera' i led in modalita' Bargraph.

Video tutorial.

Nei video che seguono, postati su youtube potete vedere le lezioni tenute in orario serale (o forse e' meglio dire notturno) al centro culturale ZIP (zona indistriale di Padova). Mi scuso se in alcuni di questi filmati posso avere l'aspetto e l'espressione un po' stanca ma queste lezioni si tengono in orario molto tardo e dopo lunghe giornate lavorative. Inoltre sono girate con il metodo "buona la prima !!!" e senza premeditare che in quella serata si saebbe girato un video tutorial.

Nel video vediamo un'importante spiegazione del concetto di banda morta.




Ecco un video in cui spiego il collegamento dell'hardware relativo al 16F876A per il pilotaggio di un servomotore tramite segnale analogico.



ecco il firmware (file.hex sviluppato relativo a questo esercizio) -> mini1servo.zip

Nel prossimo video tutorial vediamo la spiegazione di alcuni passaggi software ben commentati da Marco e Fabio relativamente alla funzione leggi_AD( ) contenuto nel file ADC.h

  


Seconda parte con simulazione su RealPic Simulator

  


Impostazione della sensibilita' della barra analogica (variabili di controllo)

 


Ecco una prima variabile del programma di acquisizione dei segnali analogici.




 

Vediamo altri esempi di programmazione in HiTec/C16 relativo al controllo dei servomotori. (lezione zip febbraio 2011)




seconda prova con analogici per il controllo dei servomotori con Micro-GT




 

Come al solito ricordo a tutti gli interessati che dispongo a magazzino dei circuiti stampati sia della Micro-GT versatile IDE che della nuova versione ridotta Micro-GT mini. Chi avesse interesse ad avere qualche esemplare mi contatti via mail all'indirizzo ad.noctis@gmail.com

Spero di aver dato a tutti un nuovo strumento con cui divertirsi.

Buona visione e buona sperimentazione a tutti.

Marco Gottardo as ad.noctis

 

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