Irrigare le piante via Internet

Il Web Server Botanico.

In questo articolo viene descritto il “web server botanico”,  un sistema di controllo a distanza  realizzato per irrigare le piante domestiche, giardini e orti via internet. Il web server botanico sfrutta la connessione internet e un qualsiasi browser di navigazione come I.E., Mozilla ecc.., per controllare da remoto mediante un computer, uno smart phone, tablet e apparati similari, le condizioni climatiche ambientali delle piante (temperatura ambiente e umidità del terreno) e conseguentemente può operare azioni per irrigarle o meno a seconda della umidità del terriccio e della temperatura ambiente agendo sull’accensione o spegnimento di una o più elettrovalvole o di una qualsiasi centralina di irrigazione ad esso collegata.

Il cuore del sistema web-server è il modulo di rete WIZ811MJ composto dal chip W5100 al cui interno è contenuto un hardware TCP/IP cablato, incluso PHY, un connettore RJ45 filtrato con trasformatore e logica varia. Nel Web Server Botanico il controller PIC 18F26K20 della Microchip svolge le funzioni di comunicazione con il modulo WIZ811MJ mediante la periferica SPI.

Le principali caratteristiche ricavate dal datasheet del modulo WIZ811MJ sono:

  • TCP/IP, MAC protocol layer: W5100
  • Physical layer: Included in W5100
  • Connector: MAG-JACK (RJ45 with Transformer)
  • Supports 10/100 Base TX
  • Supports half/full duplex operation
  • Supports auto-negotiation and auto cross-over detection
  • IEEE 802.3/802.3u Compliance
  • Operates 3.3V with 5V I/O signal tolerance
  • Supports network status indicator LEDs
  • Hardware Internet protocols: TCP, IP Ver.4, UDP, ICMP, ARP, PPPoE, IGMP
  • Includes Hardware Ethernet protocols: DLC, MAC
  • Supports 4 independent connections simultaneously
  • Supports MCU bus Interface and SPI Interface
  • Supports Direct/Indirect mode bus access
  • Supports Socket API for easy application programming

In fig. 1 è riportato il modulo WIZ811MJ, mentre in figura 2 lo schema a blocchi con il dettaglio dell’interno del chip W5100.

 modulo_WIZ811MJ

Fig. 1 – Il modulo WIZ811MJ

Fig_2 - SchBlocchiWIZ811MJFig. 2 – Schema a blocchi del modulo WIZ811MJ con il W5100

Come si osserva dallo schema a blocchi di fig. 2, il W5100 ha un modulo TCP/IP cablato con incluso il controller Ethernet PHY (physical layer); ciò consente la realizzazione di una più semplice applicazione basata su protocollo TCP/IP. Dal layer PHY del W5100, mediante trasformatore e connettore RJ45, il  WIZ811MJ si connette al mondo esterno via ethernet. Un’interfaccia MCU consente il collegamento del modulo ad un microcontrollore esterno, nel nostro caso al PIC 18F26K20, mediante bus di comunicazione SPI.

Alla sinistra della fig.3 è riportato il processo di connessione SERVER-CLIENT in cui il modulo WIZ811MJ è configurato per il funzionamento in modalità server.

fig_3_connessione Fig. 3 – Connessione del WIZ811MJ in modalità server con il client.

Il server basato sul modulo WIZ811MJ utilizza il protocollo HTTP (Hypertext Transfer Protocol) per interagire con il client (browser di navigazione internet) attraverso il protocollo TCP/IP mediante lo scambio di informazioni sotto forma di testo HTML (Hypertext Markup Language).

Il server opera rimanendo in attesa di richieste HTTP di tipo GET o POST provenienti dal client (browser) sulla porta 80 standard HTTP.

Inviata la richiesta dal client il server risponde inviando al client un header del tipo “HTTP/1.0 200 OK and Content-Type: text/html” seguito dal messaggio HTML (body); successivamente al trasferimento del messaggio il server disconnetterà automaticamente la connessione stabilita con il client.

Di seguito un esempio di richiesta inviata dal client (in questo caso il browser Mozilla) e la relativa risposta del server:

Richiesta del Client:

GET / HTTP/1.1
Host: 192.168.2.101
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20
100401 Firefox/3.6.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive

 

Risposta del Server HTTP:

HTTP/1.0 200 OK
Content-Type: text/html
<html>
<body>
<span style=”color:#0000A0″>
<h1>Web Server Botanico</h1>
<h3> Controllo Temperatura ambiente e Umidità del terreno</h3>
<p><form method=”POST“>
<strong>Temp: <input type=”text” size=2 value=”26″> <sup>O</sup>C
<strong>Umid: <input type=”text” size=2 value=”70″>
<p><input type=”radio” name=”radio” value=”0″ >Water OFF
<br><input type=”radio” name=”radio” value=”1″ checked>Water ON
</strong><p>
<input type=”submit”>
</form></span>
</body>
</html>

 

Ottenuta la risposta dal server il client traslerà il testo HTML ricevuto sullo schermo del browser in cui apparirà oltre all’intestazione dell’applicazione anche il valore della temperatura ambiente e di umidità del terreno della pianta sotto misurazione. Appariranno inoltre due pulsanti: “Water OFF”, checked di default, e “Water ON” non checked, che consentono di selezionare dal browser (richiesta POST al server) l’accensione  o spegnimento della eventuale centralina di irrigazione comandata dal PIC 18F26K20 attraverso una delle linee I/O della PORTB disponibili. In fig. 4  il diagramma di flusso dell’applicazione SERVER (WIZ811MJ )/CLIENT  (browser).

fig_4_serv-client Figura 4 – Applicazione Server-Client

 

DESCRIZIONE DELLO SCHEMA ELETTRICO.

Ora dallo schema elettrico vediamo come è composto il Web Server Botanico.

Il controller PIC 18F26K20 U1 mediante l’interfaccia di comunicazione SPI gestisce la configurazione e le attività di rete del modulo WIZ811MJ U4 e nel contempo, mediante l’integrato U2 MAX3232 della Maxim, un traslatore di livelli TTL/RS232, e il connettore RS232 CN4, colloquia con un PC per le attività di debug del firmware. Il PIC mediante due canali analogici del modulo ADC a 10 bit acquisisce e converte in formato numerico il valore di temperatura in °C mediante il sensore integrato U3 LM35, e il tasso % di umidità assoluta mediante il sensore costituito dal circuito T1, R5, R6 e il connettore CN1 a cui sono collegati i conduttori della sonda costituita da due barrette metalliche infisse nel terreno da controllare. I dati di temperatura ambiente e umidità rilevati saranno inviati via web dal modulo server WIZ811MJ ad un qualsiasi dispositivo client che mediante browser ha richiesto la connessione al server. Il client in base ai dati ricevuti potrà selezionare l’azione da far effettuare al server di accensione o  spegnimento di una centralina di irrigazione utilizzando una delle sei linee I/O disponibili al connettore CN5 e da questo connesse ad una eventuale scheda relè esterna.

La sezione di alimentazione alimentata da una sorgente esterna a 12Vcc,  è costituita dal regolatore di tensione a 5V U5 7805 la cui uscita stabilizzata viene inviata al regolatore di tensione a 3,3V LM1086 U6 che alimenta la restante circuiteria tranne il sensore LM35 U3 alimentato a +5V; il generatore di corrente costante U7 LM317 alimenta una batteria in tampone da 9V che si inserisce per sopperire ad eventuali microinterruzioni dell’energia elettrica di rete.

SE_webServ Schema elettrico del web server botanico

 

 DESCRIZIONE DEL SOFTWARE

Configurazione del server HTTP W5100.

Per configurare e controllare il server occorre leggere e scrivere nei registri di controllo del socket 0 (il socket, o canale di comunicazione, dei quattro disponibili utilizzato in questo progetto) del Wiznet W5100 e nel buffer di memoria relativo di dimensione 2KB per RX e TX dello stesso W5100. Nella tabella 1 ricavata dal datasheet del W5100 sono indicati i registri del socket 0 e i relativi indirizzi.

 tab_1_regW5100 Tabella 1 – Registri del W5100

L’impostazione di questi registri e la lettura/scrittura nei buffer RX e TX del W5100 viene effettuata mediante comunicazione seriale SPI (Serial Peripheral Interface) fra il PIC 18F26K20 in modalità Master e il chip slave W5100 (figura 5).

 fig_5_SPI_MasterSlave Figura 5 – Collegamento SPI Master-Slave

 

Impostazioni del modulo SPI del PIC 18F26K20

In questo progetto mediante il registro di controllo SSPCON1 e il registro di stato SSPSTAT il modulo SPI del PIC 18F26K20  viene impostato in modalità MASTER Mode 0, modalità supportata dal W5100. Nella tabella 2 sono indicati i pin e i registri del modulo SPI.

 tab_2_regSPI Tabella 2 – Pin e Registri SPI del 18F26K20

Nella tabella 3 sono riportate le modalità di configurazione dei registri SSPCON1 e SSPSTAT.

tab_3_regSSPCON1Tabella 3 – Registri SSPCON1 e SSPSTAT

 Per prima cosa mediante i registri TRISC e TRISA configureremo la direzione delle porte I/O del PIC: RC5=SDO e RC3=SCK come uscite e  RC4=SDI come ingresso,  mentre RA5=SS sarà il pin di controllo di uscita SPI master per l’abilitazione/disabilitazione del chip slave W5100.

Dopo l’inizializzazione delle porte, mediante il registro SSPCON1, attiviamo il modulo SPI del PIC in MASTER Mode settando a 1 il bit SSPEN e impostiamo la frequenza del clock SPI master configurando i bit SPM<3:0>=0001  per Fosc/16.

La modalità di ricezione/trasmissione dati SPI, o SPI bus Mode, è impostata in Mode 0 dai bit CKP (Clock Polarity) del registro SSPCON1 e CKE (Clock Select) del registro SSPSTAT (tabella 4 ).  Il 18F26K20 può gestire 4 SPI bus Mode, in questo progetto è stato selezionato il Mode 0 gestibile anche  dalla periferica SPI del W5100.

tab_4_MasterModeTabella 4 – Impostazioni Master Mode

 

L’ultimo bit SMP del registro SSPSTAT viene utilizzato per controllare il modo in cui campionare i dati di input.
Con il bit a “0” logico significa campionare i dati in arrivo a metà del tempo di uscita dei dati, mentre con il
bit impostato a “1” i dati in arrivo saranno campionati alla fine del tempo di uscita dei dati. In questo progetto  SMP viene settato a “0”.

La trasmissione e ricezione dei dati viene effettuata dal registro SSBUF, ciò significa che piazzando i dati in questo registro inizierà la trasmissione dei dati. Dopo 8 cicli di clock, il dato di 8 bit presente in questo registro sarà shiftato fuori dal pin SDO verso il chip slave abilitato ma nello stesso tempo riceverà il dato a 8 bit dal chip slave attraverso il pin SDI. E’ possibile monitorare il ricevitore controllando in polling lo stato del bit BF (Buffer Full) del registro SSPSTAT.

Prima di iniziare la trasmissione dati verso il chip slave occorre assicurarsi di aver attivato il pin Chip Select (SS=0) verso lo slave e disattivarlo dopo la fine della trasmissione del dato.

 

Inizializzazione del W5100

Per inizializzare il W5100 dobbiamo inserire i dati di rete scrivendo nei registri comuni MR (Mode Register), SUBR (Subnet mask Register), SAR (Source Hardware Register), SIPR (Source IP Register), RMSR (Receive Memory Size Register) e TMSR (Transmit Memory Size Register).

Nella tabella 5 è riportata la mappa di memoria in cui sono indicati i banchi di memoria dei registri e dei buffer RX e TX del W5100.

tab_5_MappMemW5100Tabella 5 – Mappa della memoria del W5100

Dato che tutti gli indirizzi dei registri del W5100 sono a 16 bits, mentre la comunicazione SPI del PIC 18F26K20 usa 8 bits, per realizzare le operazioni di scrittura e lettura dobbiamo passare prima gli otto bit più significativi MSB, poi i bits meno significativi LSB per ognuno degli indirizzi dei registri del W5100.

Il W5100 utilizza due differenti codici di comando: per la scrittura 0xF0 e per lettura 0x0F.

La funzione che realizza l’operazione di scrittura è la SPI_Write() mentre per la lettura è la SPI_Read().

Il registro SAR è noto come MAC address (Media Access Control). Questo registro rappresenta l’unico identificativo hardware nella rete. Il MAC address è assegnato e gestito dall’Institute of Electrical and Electronics Engineers (IEEE) per  ogni NIC (Network Interface Card) dove i primi 3 bytes dei 6 sono usati per identificare l’organizzazione che ha inviato l’identificatore e sono noti come OUI (Organizationally Unique Identifier). Di seguito una lista di OUI di Atmel, Microchip e Wiznet:

 

00-04-25 (hex)      Atmel Corporation
000425 (base 16) Atmel Corporation
Multimedia & Communications Group
2200 Gateway Centre, Suite 201
Morrisville NC 27560
UNITED STATES

 

 00-04-A3 (hex)      Microchip Technology, Inc.
0004A3 (base 16) Microchip Technology, Inc.
2355 W. Chandler Blvd.
Chandler AZ 85224
UNITED STATES

 

00-08-DC (hex)     Wiznet
0008DC (base 16) Wiznet
5F Simmtech bldg., 228-3,
Nonyhun, Kangnam
Seoul 135-830
KOREA, REPUBLIC OF

 

Ora il problema è di assegnare un MAC address al W5100 in quanto non ha un proprio identificativo MAC, a meno di registrare l’OUI al IEEE, ma ciò per scopi hobbistici sarebbe molto costoso.

La soluzione è quella di utilizzare il MAC address della NIC (scheda di rete) del proprio PC modificando l’ultimo byte dei 6 componenti il MAC sperando che sia l’unico MAC address della rete utilizzata. Si individua il MAC address del PC andando nella finestra di comando e al promt scrivere il comando “ipconfig /all”; apparirà l’informazione del MAC nel formato di 6 byte in notazione esadecimale, dopodiché si cambierà l’ultimo byte.

Il Wiznet W5100 supporta fino a quattro canali (socket) simultaneamente, ogni canale ha propri registri per il controllo delle operazioni ed ha a disposizione un buffer fino a 8KB di memoria sia per RX che per TX.

In questo progetto la dimensione di memoria RX e TX viene impostata a 2KB mediante scrittura del codice 0x55 nei registri RMSR e TMSR:

/*Imposto a 2KB la dimensione di memoria del buffer RX e TX del W5100.*/

SPI_Write(RMSR,0x55);
SPI_Write(TMSR,0x55);

 Tutta la procedura di inizializzazione è implementata nella funzione W5100_Init() caratterizzata dalla scrittura nei registri di controllo mediante la funzione SPI_Write () per l’impostazione dei parametri di rete.

L’assegnazione del protocollo TCP/IP e l’apertura della porta 80 è realizzata mediante la funzione socket():

………………..
// Imposto il Socket 0 in modalità ethernet
SPI_Write(S0_MR,eth_protocol);
 //Assegno la porta TCP 80
SPI_Write(S0_PORT,((tcp_port & 0xFF00) >> 8 ));
SPI_Write(S0_PORT + 1,(tcp_port & 0x00FF));
// Ora apro il Socket 0
SPI_Write(S0_CR,CR_OPEN);
……………………..

 

Dopo l’apertura del canale il registro di stato (S0_SR) sarà nello stato SOCK_INIT. Successivamente il server si porterà nello stato di ascolto mediante l’invio del comando  CR_LISTEN attuato con la funzione listen() e il registro di stato sarà SOCK_LISTEN. Da questo momento il server W5100 è pronto per ricevere una richiesta dal client (browser).

Stabilita la connessione con il server, il client invierà la richiesta standard HTTP al server; il registro di stato sarà SOCK_ESTABLISHED. Successivamente si esaminerà la dimensione dei dati ricevuti nel buffer RX del socket 0 mediante la funzione recv_size():

 unsigned int recv_size(void) {
 //Questa funzione ritorna il valore della dimensione dei dati ricevuti nella memoria RX.
return ((SPI_Read(S0_RX_RSR) & 0x00FF) << 8 ) + SPI_Read(S0_RX_RSR + 1);
 }

 

L’esistenza di dati nel buffer RX del W5100 consente la lettura dei dati e il relativo inserimento nella memoria RAM (buf) del PIC  mediante la funzione recv().

Dopo aver letto tutti i dati viene aggiornato il puntatore della memoria RX del W5100 per predisporre il banco di memoria per una successiva ricezione di dati, dopodichè viene dato il comando CR_RECV per completare il processo di ricezione. Il server esaminerà i dati ricevuti e predisporrà la relativa risposta HTML al client con i dati di temperatura ambiente e umidità assoluta del terreno e la selezione del comando di accensione o spegnimento della centralina di irrigazione. Infatti dopo aver copiato il testo HTML nella memoria RAM del PIC (buf) i dati vengono inviati al client mediante la funzione send() che invierà i dati nella memoria TX del W5100 verificandone preventivamente lo spazio disponibile nel registro TX. Come per il puntatore RX, anche il puntatore TX sarà aggiornato per predisporre una successiva scrittura nel banco TX. Il successivo comando CR_SEND completerà il processo di scrittura.

Dopo l’invio della risposta al client, il server mediante la funzione disconnect() chiuderà la connessione verso il client.

Durante il loop infinito nella “main” il server aprirà il socket rimanendo in ascolto per una eventuale nuova richiesta del client.

Per l’acquisizione dei valori di temperatura e umidità il software prevede l’utilizzo della subroutine High_Int_TMR0, che mediante l’interrupt di overflow  del Timer0 del PIC, ogni 10ms legge e converte i valori di temperatura e umidità generati dai sensori. Di seguito viene riportata la descrizione dell’impostazione del modulo ADC e del Timer0 del PIC.

Vediamo ora come sono stati impostati i due importanti moduli ADC e Tmr0 utilizzati all’interno della subroutine High_Int_TMR0.

 Impostazione del modulo Timer0 del PIC 18F26K20

Come detto precedentemente, con questo progetto si vogliono rilevare ad intervalli regolari con periodicità prestabilita i valori di temperatura ambiente e umidità assoluta del terreno ove sono localizzate piante, fioriere, giardini ecc…, e conseguentemente decidere l’attivazione da remoto di una centralina di irrigazione.

Questi intervalli di misurazione vengono attivati mediante interrupt prodotto ogni 10mS dall’overflow di conteggio del modulo Timer0 di cui è dotato il PIC. Il Timer0 viene impostato con clock esterno (quarzo da 20MHz), registro di conteggio a 8 bit e prescaler a 256. Per le impostazione del modulo Timer0 viene utilizzata la libreria “timers.h” del PIC e l’inizializzazione del Timer0 viene effettuata dalla funzione Timer0_init():

//Inizializzazione del Timer0
void Timer0_init(void) {
 /*Inizializzo il timer0
**
**Contatore del Timer0 a 8 bit
**Clock interno
**Prescaler a 256
**Incremento del Timer0 sul fronte di discesa del clock.
*/
OpenTimer0(T0_8BIT&
            T0_SOURCE_INT&
            T0_PS_1_256&
            T0_EDGE_FALL);
   }

 

Di seguito la procedura di calcolo per la definizione del valore da impostare nel registro di conteggio TMR0 per ottenere un interrupt precisamente ogni 10mS.

Il periodo del clock utilizzato è pari a 0.05us ovvero:

TOSC = 1/FOSC = 1/(20*106)=0,05uS

Dato che il tempo di esecuzione di un’istruzione è pari a quattro cicli di clock, il clock che và ad incrementare il Timer0 e pari a 0.2us, ovvero:

TTIMER0=TOSC*4=0,05*4=0,2us

Il clock  finale ritardato dal prescaler sarà:

TPRESCALER = TTIMER0*256=0,2us *256=51,2us

da cui ricaviamo il numero di conteggi che dovrebbe fare il Timer0 per creare l’overflow dopo 10mS:

TOVERFLOW= TPRESCALER * N CONTEGGI=10mS  da cui

N CONTEGGI= TOVERFLOW/TPRESCALER = 10*10-3/51,2 *10-6= 195

Ma il Timer0 inizia gli incrementi partendo da 0 per cui per fargli fare 195 passi anziché 256 fino all’overflow, si deve precaricare la differenza fra i conteggi totali e quelli necessari.

Quindi il valore da caricare nei registri TMR0H e TMR0L sarà:

TIMER0=(28+1)195=62   corrispondente in hex a 0x003E.

Considerando i cicli delle ulteriori istruzioni nella subroutine si è ritenuto di impostare il codice di precarica a 0x003D.

//Carico il valore 003D nei registri TMR0H e TMR0L per ottenere un overflow del Timer0 dopo 10mS.

TMR0H=0;

TMR0L=0x3D;

 

Impostazione del modulo ADC del PIC 18F26K20.

Per un corretto impiego del modulo ADC è necessario considerare l’impostazione del prescaler del clock e del moltiplicatore del TAD in base al valore del clock esterno utilizzato dal PIC (in questo caso è FOSC=20MHz) quindi occorre fare delle considerazioni.

Il convertitore ADC è a 10 bit, per convertire un livello di tensione del segnale analogico d’ingresso in forma numerica operando la conversione ad approssimazioni successive, impiega un tempo TADx10bit essendo TAD il clock del modulo ADC pari a 1/FOSC con prescaler=1; il clock in realtà sarà TADx12 considerando un tempo pari a 2 clock necessari per la scarica del condensatore CHOLD interno al modulo per ogni canale ADC (fig.6). Per le impostazioni dei registri dell’ADC il software prevede l’utilizzo della libreria del PIC “adc.h” e l’inizializzazione dell’ADC viene effettuata dalla funzione ADC_init():

//Inizializzazione dell’ADC
void ADC_init(void) {
 
/* Apertura del modulo ADC:
**
** Fosc / 16, Fosc=20MHz -> FADC=1,25MHz (1/FADC deve essere
** maggiore del TAD min =0,7uS, vedi datasheet del PIC).
**Giustificazione a destra, tempo di acquisizione 20TAD.
**interrupt ADC disattivato,
**tensione di riferimento: VREF+ esterno (pin RA3) e VSS.
*/
OpenADC(ADC_FOSC_16&
ADC_RIGHT_JUST&
ADC_20_TAD,
ADC_CH0&
ADC_INT_OFF&
ADC_REF_VREFPLUS_VSS,
ADC_2ANA );
 }

fig_6_ConvAD-TACQ=0Figura 6- Conversione A/D con TACQ=0

 TADC è il tempo totale di acquisizione e conversione di un campione analogico in misurazione all’ingresso di un canale ADC; si calcola con l’equazione

TADC= TACQ+TCNV                dove

TACQ =Acquisition Time

è il tempo minimo necessario all’ADC per l’acquisizione dell’informazione analogica. L’equazione di calcolo è riportata nel paragrafo 19.3 del datasheet del PIC. Considerando il caso peggiore di funzionamento del modulo ADC, Temperatura di lavoro di 50° e impedenza della sorgente esterna 10Kohm, il TACQ risulta essere di 7,45 uS.

(Per il buon funzionamento dell’ADC è necessario che l’impedenza della sorgente applicata all’ingresso non superi 10 kohm, come prescritto dal datasheet).

fig_7_TimeADCFigura 7 – Requisiti temporali dell’ADC

TCNV = Conversion Time

è il tempo impiegato per la conversione di tutti i 10 bit dell’ADC (escluso il TACQ).

TAD è il periodo del clock dell’ADC pari a 1/(FOSC/valore del prescaler).

Nella fig. 7 ricavata dal datasheet del 18F26K20, il TACQ min. vale 1,4uS per un’impedenza della sorgente di 50 ohm, mentre il TCNV max vale 12TAD, quindi con FOSC=20MHz, impostando ad es. il prescaler a 4 e, dalla libreria ADC del PIC, selezionando ADC_12_TAD, si ha

TAD=1/(FOSC:4)=0,2uS                     TACQ = TAD x12=0,2uS x 12 = 2,4 uS

Come si osserverà, si avrebbe così un periodo TAD dell’ADC che consente un TACQ che già coprirebbe il tempo di acquisizione minimo del datasheet TACQ=1,4uS, ma questo TAD già non rispetta il requisito del datasheet che prevede un TAD minimo di 0,7uS (fig. 8), inoltre, considerando il caso peggiore di TACQ prima calcolato di 7,45 uS, per stare sicuri dobbiamo innanzitutto aumentare il valore del prescaler a 16 con la funzione ADC_FOSC_16 e poi il valore massimo del moltiplicatore di TAD a 20 con la funzione ADC_20_TAD; quindi si avrà:

TAD=(1/(FOSC:16))=0,8uS da cui  TACQ=TADx20=0,8uSx20=16 uS

Pertanto il TACQ sarà più del doppio del TACQ peggiore con ampio margine di sicurezza.

Il tempo totale di conversione dei 10 bit dell’ADC sarà quindi:

TCNV = 0,8uS x 12 = 9,6 uS

E il tempo totale di acquisizione e conversione sarà:

 TADC=TACQ+TCNV = 16uS + 9,6uS = 25,6 uS

quindi il segnale analogico presente in ingresso al canale ADC verrà acquisito e convertito ogni 25,6 uS; il TADC è definito periodo di campionamento da cui la frequenza di campionamento fc=1/TADC=39KHz. In questo progetto il modulo ADC deve campionare segnali analogici di bassissima frequenza generati dalle eventuali variazioni dei livelli di tensione provenienti dai sensori di temperatura e umidità, quindi non ha importanza se la frequenza di campionamento fc di 39KHz risulta piuttosto bassa. Infatti ricordiamo che un corretto campionamento di segnali analogici veloci prevede una fc doppia rispetto alla frequenza del segnale sotto misura. Si può ottenere una più alta frequenza di clock dell’ADC agendo sul TACQ minimizzandolo riducendo quanto più possibile l’impedenza della sorgente esterna applicata all’ingresso del canale ADC.

fig_8_Conv AD-TACQ=4 TAD Figura 8 – Conversione A/D con TACQ=4 TAD

Nella fig. 8 dal datasheet un esempio di un ciclo di conversione A/D con tempo di acquisizione TACQ impostato per una durata di 4 clock TAD.