cap.7
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 !!!.
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.
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 [email protected]
Spero di aver dato a tutti un nuovo strumento con cui divertirsi.
Buona visione e buona sperimentazione a tutti.
Marco Gottardo as ad.noctis
This opera is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Italy License.