Hobbytron: scheda di conversione adc per porta parallela e pic

8AdcCh
Scheda di conversione Adc a 8 bit, 8 canali, per porta parallela e Pic
Figura 1
8AdcCh con 8 trimmer che simulano gli 8 ingressi analogici
Figura 2
Schema elettrico
Figura 3
Questo progetto fa uso della porta parallela Spp, se non la conoscete o avete qualche difficolta' fate riferimento al tutorial sulla Spp.
Per impratichirvi ulteriormente date un occhiata al progetto Sppboard.
Cerchero' in poche parole di spiegare il progetto, in realta' non troppo complesso, il cui schema elettrico e' raffigurato in Figura 3.
Lo schema e' stato disegnato a moduli, per comodita' e per semplicita', in realta' tutto e' stato collegato e realizzato su una basetta mille fori.
Il convertitore adc0808 e' un convertitore analogico digitale a 8 canali uP compatibile. Si presenta sottoforma di un chip a 28 pin, di questi 28 pin 3, a b e c, sono riservati all'indirizzamento interno. Con 3 bit si riescono a decodificare 8 canali diversi, ecco che questi pin andranno collegati a 3 linee della porta parallela Spp per la decodifica. Le linee scelte sono a : /autofeed (pin14 e bit c1 del Control register), b : initialize (pin 16 e bit c2 del Control register) e c : /select in (pin 17 e bit c3 del Control register).
Attraverso il data bus in uscita dal convertitore ci collegheremo alla parallela, tramite un multiplexer quadruplo da 2 a 1 linea, ai pin di ingresso della porta parallela.
Il multiplexer ha il compito di consentire una lettura di 1 byte avendo a disposizione solo 4 bit in input verso la parallela.
Tramite il segnale /strobe (pin 1 e bit c0 del Control register) andiamo a selezionare dapprima il nibble piu' basso e poi il nibble piu' alto.
Le linee di input scelte sulla parallela sono : /error (pin 15 e bit s3 dello Status register), select (pin 13 e bit s4 dello Status register), pe (pin 12 e bit s5 dello Stetus register) e busy (pin 11 e bit s7 dello Status register).
Per quanto riguarda le operazioni di inizio conversione, fine conversione e output enable ho collegato il d0 (pin 2 e bit d0 del Data register) allo Start e Ale dell'adc0808, il d1 (pin 3 e bit d1 del Data register) all'Output enable e /ack (pin 10 i bit s6 dello Status register) all'End of conversion negato dell'adc0808.
Quest'ultima connessione serve per gestire la fine conversione mandando un eventuale interrupt sulla porta parallela del pc.
Il segnale di clock viene generato da un ne555 configurato come multivibratore astabile ad una frequenza di circa 588 Khz, valore all'interno delle specifiche di clock del convertitore. Tramite ponticellatura e' possibile introdurre un clock esterno (utile per applicazioni sincrone con schede a uControllori)
Tutti i segnali logici di pilotaggio e di uscita del progetto, oltre ad essere stati connessi opportunamente ad un connettore cannon db25 maschio, sono stati anche riportati su un connettore a pettine per permettere l'utilizzo della scheda in oggetto con un uControllore. (Ad esempio un Pic).
Per quanto riguarda la parte analogica del progetto e' stato utilizzato un regolatore 7805 per generare la tensione di alimentazione di 5 volt per gli integrati, a partire dai 9 volt di alimentazione della scheda.
Non ho alimentato direttamente a 5V perche' il convertitore vuole una Vref di 5V per cui era indispensabile avere una Vcc piu' alta dalla quale ottenere questa Vref.
La Vref e' stata quindi ottenuta da un Lm336 5.0V e trimmer multigiri, disaccoppiato tramite un inseguitore di tensione realizzato con operazionale lm358.
Gli 8 canali analogici in ingresso vengono connessi tramite una morsettiera. E' importante che i segnali da convertire vengano portati alla morsettiera attraverso dei cavi schermati.
Datasheets degli integrati utilizzati per questo progetto

Adc0808 | Convertitore Adc a 8 canali |
74157 | Mux quadruplo da 2 a 1 linea |
7404 | 6 inverter |
ne555 | Timer |
lm336 5.0 | Voltage reference |
lm358 | Op amp |
7805 | Regolatore |

Ho realizzato alcuni programmi in ambiente dos, con compilatore Turbo C Borland che presento qui di seguito. Per ognuno trovate il tipo di schermata, il sorgente e l'eseguibile.

Ver 2.0 | Ver 2.7 | Ver 3.0
8ch2_0.c | 8ch2_7.c | 8ch3_0.c
8ch2_0.exe | 8ch2_7.exe | 8ch3_0.exe

Questi 3 programmi includono una libreria, la spp.h.
La ver 2.0 prevede la possibilita' di selezionare il canale attraverso i tasti funzione f1..f8 e di andare in stand by mode attraverso f9. Si esce con esc.
Il canale selezionato viene evidenziato con la scritta adc sotto alla misura.
Per ogni canale si aprono finestre in senso orizzontale.
La ver 2.7 e' uguale alle 2.0 a parte che per il canale selezionato che viene evidenziato con una freccetta a fianco del canale.
Per ogni canale si aprono finestre in senso verticale.
La ver 3.0 e' uguale alle 2.7 ma in piu' ha la possibilita' di salvare la misura su un logfile (su cui viene scritta la tensione misurata, ora e data), premendo f10 ogniqualvolta si ha la necessita' di loggare la misura di un canale.
Basta che quel canale sia stato preventivamente selezionato.
Chiedo scusa se i sorgenti non sono ben commentati e mezzi in inglese.

Gestione Adc attraverso internet.
Per questa scheda ho realizzato un applicazione cgi che permette di convertire gli 8 canali analogici in maniera remota, con la scheda adc collegata alla porta parallela del server e ricevendo il risultato della conversione sul browser di un pc client.
E' abbastanza interessante avere un sistema del genere, in questo modo io posso leggere lo stato di sensori, trasduttori, ecc. ecc. via internet, in qualunque posto del mondo io mi trovi.
Di seguito lo schema a blocchi del sistema descritto, gia' visto peraltro nella sezione cgi.
Per la scelta del canale da convertire ho utilizzato il seguente form di cui allego anche il sorgente html.
Ch0
Ch1
Ch2
Ch3
Ch4
Ch5
Ch6
Ch7
<form action="/cgi-bin/adcweb4.exe" method="GET"> //qui va inserito il cgi da invocare e il metodo Ch0 <input type="radio" value="0" name="Ch"> Ch1 <input type="radio" value="1" name="Ch"> Ch2 <input type="radio" value="2" name="Ch"> Ch3 <input type="radio" value="3" name="Ch"> Ch4 <input type="radio" value="4" name="Ch"> Ch5 <input type="radio" value="5" name="Ch"> Ch6 <input type="radio" value="6" name="Ch"> Ch7 <input type="radio" value="7" name="Ch"> <input type="submit" value="Converti" name="R1"><input type="submit" value="Logfile" name="R2"> </form>
Con i radio button si sceglie il canale da convertire, con il tasto Converti si esegue la conversione e si riceve sul browser una pagina di questo tipo.
siccome ogni misura effettuata viene salvata su logfile, con data e ora, c'e' la possibilita' di visualizzare questo logfile scegliendo il canale e premendo Logfile. L'output che si ottiene e' una pagina di questo tipo. A questo proposito c'e' da dire che viene anche generato, per ogni canale, un secondo logfile, analogo al primo, solo che al posto di data e ora viene salvato il numero di secondi trascorsi dal 01/01/1970 a quell'istante. Ricavato il punto zero questo tipo di logfile puo' essere utile per darlo in pasto ad un foglio elettronico, tipo excel, e realizzare dei grafici.
Di seguito riporto i moduli sorgente del cgi in oggetto, il progetto e' stato realizzato in ambiente lccwin-32.

Header | Modulo | Descrizione
binary.h | binary.c | gestione di operazioni in formato binario
spp.h | spp.c | gestione di operazioni sui registri della lpt
adc.h | adc.c | gestione del convertitore su scheda 8adcch
| provaboard.c | programma di esempio e test per la scheda 8AdcCh

Per concludere riporto di seguito un grafico ottenuto con excel che sulle ordinate riporta il valore di tensione letto (in millivolt) ed in ascissa l'orario di ciascuna lettura.
Questa tabella e' stata ottenuta salvando una pagina di excel come html ed sportando l'immagine. Si potranno ovviamente realizzare tanti altri formati di grafico nonche' inserire delle etichette con i valori della tensione convertita su ogni colonna dell'istogramma.
Stampa la pagina