Un frequenzimetro da 1Hz a 100MHz, munito di un display LCD ed una interfaccia RS232

ArticleCategory: [Choose a category, do not translate this]

Hardware

AuthorImage:[Here we need a little image from you]

[Photo of the Author]

TranslationInfo:[Author + translation history. mailto: or http://homepage]

original in en Guido Socher

en to it Toni Tiveron

AboutTheAuthor:[A small biography about the author]

Guido adora Linux non solo perché sia divertente scoprire le grandi possibilitą di questo sistema, ma anche per le persone che sono coinvolte nel suo sviluppo.

Abstract:[Here you write a little summary]

Questo articolo fa parte della serie inerente il Microcontrollore AT90S4433. Vi suggerisco di leggere gli articoli precedenti sul Microcontrollore della Atmel:
  1. Come installare ed utilizzare l'ambiente di sviluppo e come costruire il programmatore:
    Marzo 2002, Programmare il microcontrollore AVR con GCC
  2. Come crearsi i propri circuiti stampati:
    Maggio 2002, Un pannello di controllo LCD per il Vostro server Linux
Questa volta ci occuperemo di un frequenzimetro che č in grado di misurare da 1Hz a 100MHz. Potete anche utilizzarlo come semplice conta eventi, per esempio sapere quante persone hanno attraversato la strada (o quello che la vostra fantasia suggerisce, purché si tratta di un impulso di tipo digitale). Il contatore ha un display LCD ed una porta seriale RS232 per poter leggere e gestire i risultati all'interno di Linux.

ArticleIllustration:[This is the title picture for your article]

[Illustrazione]

ArticleBody:[The article body]

Introduzione

La frequenza generata da un segnale, sinusoidale od a onda quadra, č il numero di oscillazioni che essa compie al secondo. Di conseguenza per determinare la frequenza di un segnale continuo, si devono semplicemente contare il numero di oscillazioni che si hanno in un secondo. In questo modo possiamo ottenere la misura della principale armonica di un segnale oscillante. Per misurare le frequenza non stabili di un segnale, come per esempio il suono, si dovrą ricorrere ad una analizzatore di spettro. In quest'ultimo caso perņ si tratterebbe di un hardware ben diverso. Quello che andremo ora a sviluppare č un oscillatore per segnali stabili. Partiremo quindi dal presupposto che questo segnale non muterą la propria frequenza durante un determinato lasso di tempo che definiremo come intervallo di campionamento.

Il nostro frequenzimetro lavora in due distinte fasi:
  1. Rimuove ogni residuo di corrente continua dal segnale e poi lo converte in un segnale ad onda quadra per mezzo di un comparatore di tensione.
  2. Conta il numero di impulsi per unitą di tempo e poi lo divide per l' intervallo.

Quello che vi serve

Per costruire il frequenzimetro avrete bisogno dei seguenti componenti

1 x Microcontrollore Atmel At90S4433
1 x zoccolo 28pin 7,25 mm
2 x zoccoli 16pin
1 x zoccolo 1pin
1 x zoccolo 14pin
Nessuno zoccolo per il MAX903 e per lo 74F74. Saldateli direttamente sul circuito stampato!
1 x MAX232
1 x quarzo da 4,194304MHz
1 x LED (verde)
1 x BC557 (transistore PNP)
4 x condensatori (elettrolitici) da 1uF
2 x condensatori ceramici da 27pF
4 x condensatori ceramici a goccia da 10nF
3 x condensatori ceramici a goccia da 100nF
1 x condensatore ceramico a goccia da 200nF
1 x condensatore ceramico a goccia da 0,47uF
2 x resistenze 470 Ohm
1 x resistenza 470K
2 x resistenze 100 Ohm
3 x resistenze 1k
5 x resistenze 10k
3 x resistenze 47K
1 x resistenza 220 Ohm
3 x resistenze 4K7
1 x resistenza 3k3
1 x resistenza 2k2
1 x resistenza 47 Ohm
1 x Trimmer da 4K7 (il pił piccolo possibile), Se volete potete sostituire il trimmer con un paio di resistenze. Questo trimmer serve a regolare il contrasto del display. Io ho utilizzato due resistenze da 100 Ohm in parallelo ed una da 1k, ottenendo un buon contrasto.
1 x diodo zener da 4.3V
2 x piccoli pulsanti
1 x condensatore (elettrolitico) da 470uF
1 x condensatore (elettrolitico) da 4,7uF
1 x diodo 1N4001
1 x Integrato in tecnologia TTL 74HC02
1 x Integrato in tecnologia TTL 74F74
1 x Integrato in tecnologia TTL 74HC390
1 x LM393 regolatore di tensione
1 x MAX903 operazionale a comparatore elettrico, in formato 8pin, plastico, tipo DIP. Se il Vs. rivenditore di fiducia non lo avesse potete ordinarlo on-line presso www.maxim-ic.com.
1 x regolatore di tensione fisso 7805
1 x Display LCD compatibile con il modello HD44780, a 20 caratteri e due righe. Esso puņ essere sia con che senza retroilluminazione ((16 pin o 14 pin)

Tutti i display CD che ho provato che hanno o 14 o 16 pin al connettore risultano essere compatibili con il modello HD44780. Potete anche utilizzare un display a 3 o 4 righe, ma in tal caso dovrete modificare in parte il software.

Oltre al succitato avrete bisogno di alcuni cavi, connettori (BCD, alimentazione, seriale) e di un trasformatore a 9Volt o una qualsiasi altra forma di alimentazione da 150mA. Spesso potete trovare alimentatori molto economici, che si usano per apparati elettronici di largo consumo, che si innestano direttamente alla presa.

Lo schema elettrico e la basetta

Ho utilizzato eagle per Linux per disegnare lo schema elettrico e lo stampato. Tuttavia il programma presenta alcuni problemi minori, in quanto non riesce a comprendere che tutte le alimentazioni degli integrati sono a 5Volt. Otterrete degli errori se cercherete di eseguire il test di validazione elettrico. Il design risulta comunque corretto.
Lo schema elettrico (click per una immagine pił grande):
[Schema elettrico]

Lo stampato (click su di esso per una immagine pił grande):
[Stampato]


Lo stampato č specificatamente studiato per uso hobbistico. Solo il disegno in blu verrą utilizzato per eseguire l'incisione dello stampato. Le linee rosso sono costituite da semplice filo. Č di gran lunga pił facile, e richiede anche meno precisione, fare una basetta monofaccia che una multistrato. Vi consiglio di studiare il percorso pił breve possibile per i fili. Purtroppo con Eagle questo non mi č stato possibile.
Il disegno dello stampato su fondo bianco per facilitarne le operazioni di stampa: Il circuito su fondo bianco (Nota: non dovrete utilizzare questo file per generare il circuito stampato.)

I file in formato eagle sono inclusi nel pacchetto software (linuxfreqcount-0.4) che potreste scaricare alla fine di questo articolo.

Il funzionamento

Il microcontrollore AT90S4433 al suo interno possiede due contatori. Uno ha una ampiezza di 16 bit e l'altro di 8 bit. Utilizzeremo il contatore ad 8 per la generazione del segnale di time base basandoci sul clock generato dal quarzo. A tal fine ricorreremo ad una quarzo da 4194304Hz e lo passeremo al contatore ad 8 bit per mezzo del divisore interno con un rapporto di 1 a 256 (potete verificarne le specifiche nel datasheet presente alla fine di questo articolo). Il contatore in questione č gestito in modo da ottenere in interrupt all'owerflow. In parole povere avremmo un time base di 64Hz: 4194304Hz / (256 * 256). Per mezzo di un loop riusciremmo ad ottenere frequenze di campionamento da 1Hz o da 64Hz.

Ora abbiamo una funzione che puņ essere richiamata ad intervalli o di 1Hz o di 64Hz in funzione di come il nostro contatore software stia lavorando. Tutto quello che ora ci resta da fare č semplicemente leggere il responso del contatore a 16bit per mezzo di questa funzione e farne vedere il risultato. Il contatore a 16 bit otterrą il segnale digitale da misurare al pin PD5 del microcontrollore.

Il microcontrollore effettua un campionamento del segnale in ingresso sulla base del proprio clock interno. Se ci basiamo sui teoremi di campionamento, avremo che non potremmo misurare frequenze superiori alla metą della frequenza di risonanza del quarzo. In pratica saremo perņ in grado di misurare frequenze sino a 1,5MHz.

Per poter misurare frequenza superiori a questo limite, avremmo bisogno di un divisore. Questa funzione viene svolta dalla coppia di circuiti costituiti dal 74F74 e 74HC390. Il 74F74 č utilizzato come divisore asincrono a base 4 (1/4) ed il 74HC390 viene utilizzato come divisore a base 25 (1/25). Il motivo dell'utilizzo di due divisori č dato dal fatto che il 74HC390 non č in grado di gestire frequenze superiori ai 25MHz.

Il nostro circuito avrą quindi due ingressi: uno per mezzo del divisore a 100 ed uno diretto. A seconda della scala di frequenza che andremo a misurare, sceglieremo l'ingresso appropriato, ma ricordate, _MAI_ utilizzare entrambi gli ingressi assieme.

Se lo utilizzerete solo per frequenze fino ad 1.5MHz (per esempio per verificare la risposta di un amplificatore audio), potrete omettere la sezione costituita dagli integrati MAX903, 74F74 e 74HC930. Ricorrete comunque allo stesso software ed alla stessa basetta.

La funzione svolta dai due operazionali in tensione (il MAX903, per la sezione ad alta velocitą, e l'LM939) č quella di amplificare il segnale ed ottenere alla loro uscita una onda quadra, al posto di una sinusoidale.

Va usata particolare cura nella progettazione del layout della basetta per evitare oscillazioni indesiderate degli operazionali. Č altresģ bene che notiate il MAX903 č realmente un comparatore ad altissima velocitą . Se per esempio, avete un segnale a 100KHz modulato con un rumore ad 1MHz, allora otterrete un conteggio addizionato del segnale ad 1MHz, nel momento in cui il segnale ad 1MHz passa per il livello 0.
La resistenza da 220K in prossimitą del MAX903 evita che eventuali rumori possano influenzare il segnale generando un feedback positivo. Č tuttavia raccomandabile che non utilizziate segnali che contengano del rumore sul nostro frequenzimetro.

Il microcontrollore puņ esser gestito per mezzo della porta seriale RS232 e con due pulsanti (clear e cambia tipo di conteggio).

I due segnali di ingresso sono combinati per mezzo di una porta logica OR (74HC02). La porta OR, in caso di assenza di segnale nell'ingresso 1/100, escluderą il livello logico 1 generato dall'integrato 74HC390. Tuttavia l'integrato 74HC930 viene 'ripulito' (per mezzo del pin 2) allorquando si prema il pulsante di clear o si cambi la modalitą di conteggio.

Il software

Il software per il microcontrollore gestisce due contatori in modalitą interrupt. Come ciņ sia fatto č descritto a sufficienza nel datasheet dell'AT90S4433. Quello che dovrete fare č configurare una serie di registri. Questa operazione č importante ma non complessa. Non ne spiegherņ le ragioni qui nuovamente. La maggior parte della logica del frequenzimetro č implementata nel file linuxfreqcount.c. I restanti file sono "librerie" per il pannello LCD, le porte seriali,... Quando state scrivendo software per il microcontrollore dovrete prestare attenzione a non utilizzare pił di 128Byte di RAM. Tuttavia č raccomandabile evitare di eseguire troppe funzioni nidificate con troppi parametri. Indici e variabili globali sono largamente preferibili.

Allorquando i registi sono correttamente configurati la funzione SIGNAL(SIG_OVERFLOW0) verrą richiamata con intervalli di 64Hz. A quel punto andremo a leggere il contatore a 16bit e ne gestiremo un flag (hfalg) per processare in un secondo momento il risultato, per mezzo della funzione handlecounterresult(). Se utilizzassimo la frequenza di 1Hz potremmo rendere direttamente visibile il risultato del contatore, ma ricorrendo ai 64Hz (1/64 di secondo), dovremmo obbligatoriamente moltiplicare il risultato per 64. La matematica che si puņ gestire con questo microcontrollore č assai limitata (non abbiamo dei fantastici numeri interi a 32bit come su una cpu Pentium). Fortunatamente moltiplicare per 64 equivale ad effettuare uno shift (operazione binaria di spostamento di un set di bit per incrementarne il valore) di 6bit. Andremmo poi a memorizzare il risultato dell'operazione in una variabile di 3x 8bit (counterval[3]).

Ora abbiamo a disposizione il corretto valore rappresentato a 24bit. Per poterlo rendere visibile lo dovremmo convertire in ASCII decimale. La funzione printf potrebbe facilmente svolgere questa operazione, ma tale funzione non č presente nel microcontrollore, e includerla consumerebbe ben pił delle risorse di memoria di cui questo microcontrollore dispone. Per eseguire la conversione dovremmo dividere il numero a 24bit per 10 con relativi riporti. I riporti saranno numeri decimali. La nostra CPU perņ non puņ eseguire calcoli a 24bit, ma possiamo trattare il dato in frazioni di 8bit (function divby10()). Aggiungendo ad ogni risultato il valore ASCII del numero zero ci fornirą la rappresentazione finale del nostro numero (function longtoascii()).

Questa stringa ASCII puņ esser inviata sulla linea seriale RS232 ed anche al display LCD.

Creazione del circuito stampato

Il pacchetto software contiene un file postscript (linuxfcount.ps) per poter facilmente stampare il circuito. Secondo il mio punto di vista trovo che i punti di saldatura siano troppo piccoli. Vi consiglio quindi di renderli pił ampi per mezzo delle vernice prima che incidiate la basetta stessa. Il procedimento per creare la propria basetta in ambiente amatoriale č descritto nell'articolo: Maggio 2002, Un pannello di controllo LCD per il Vostro server Linux. Alcuni lettori mi hanno comunicato la loro difficoltą nel reperire lo spray Kontakt Pausklar-21. In tal caso potete ricorre all'uso di petrolio per illumiazione. Avrete perņ bisogno di pulire la basetta con del sapone prima di inciderla con l'acido.

Quale contenitore costruire per il nostro frequenzimetro?

[Il contenitore finito senza il coperchio] [La struttura in legno] Uno dei pił grossi problemi per l'elettronica amatoriale č spesso il contenitore per i circuiti che ci costruiamo. Le scatole componibili in alluminio hanno, di norma, un costo elevato. Io ho trovato un metodo economico che puņ garantire un aspetto professionale: ricorro all'uso del legno per la struttura angolare e per i pannelli, eventualmente dipingendolo con dei colori scuri per darne un aspetto pił esoso. Se lo tinteggiate ricordatevi di utilizzare tintura solubile per interni. Per il pannello frontale, quello laterale e quello superiore, ricorro ad un foglio metallico tagliato a misura. Potete notare nella foto a destra la struttura principale in legno. Nella foto a sinistra potete notare il risultato complessivo (solo il coperchio superiore č stato rimosso).

Assemblaggio del circuito

[circuito] Quando andrete a saldare tutti i componenti sulla basetta prestate particolare attenzione alla sezione ad alta frequenza (il MAX903 ed il 74F74, con i relativi condensatori e resistenze). Normalmente io raccomando di ricorrere all'utilizzo di zoccoli per gli integrati, ma in questo particolare caso č meglio non utilizzarli per evitare di creare effetti parastatici e capacitativi non desiderati. Per i condensatori di disaccoppiamento tra l'alimentazione e la massa, dovrete ricorrere a dei piccoli condensatori ceramici. Il valore di questi condensatori dovrebbe essere compreso tra 10nF e 100nF.

Questo č il pił complesso circuito che abbiamo fino ad oggi studiato e realizzato per LinuxFocus. Vi raccomando di procedere a piccoli passi e controllare che tutti i vari componenti siano effettivamente funzionanti:
  1. Iniziate saldando i componenti necessari all'alimentazione (7805, ...) sulla basetta e verificate il funzionamento.
  2. Saldate tutti i rimanenti componenti, ma inserite nello zoccolo il solo microcontrollore.
  3. Il pacchetto software linuxfreqcount-0.4 include un programma di controllo (avr_led_lcd_test.c) per la verifica della funzionalitą e del microcontrollore, dei LED e del display LCD. Eseguitelo, collegate tutti i cavi, come descritto nel primo articolo della serie inerente l'AVR (Marzo 2002, Programmare il microcontrollore AVR con GCC, e poi digitate "make testload" per eseguire il software avr_led_lcd_test presente nella distribuzione. I LED dovrebbero lampeggiare ed il display dovrebbe presentare la scritta "Hello".
  4. Inserite ora tutti gli integrati nei relativi zoccoli. Eseguite e caricate nel microcontrollore il software (make load). Verificatene il funzionamento, prima per mezzo della sezione a bassa frequenza, e successivamente quella ad alta. Avrete bisogno di un oscillatore come origine della frequenza (i segnali ad onda quadra sono preferibili).Nota del traduttore: Come origine, per verificare il funzionamento della sezione a bassa frequenza, potete ricorre all'uscita di un trasformatore a bassa tensione. La frequenza dell'alimentazione di casa si aggira sui 50Hz o 60Hz. Se all'uscita di questo trasformatore appliccherete un ponte a diodi avrete una frequenza doppia (rispettivamente 100Hz o 120Hz).

Come utilizzare il nostro contatore

Il contatore puņ funzionare in svariati modi:
  1. contatore continuo incrementale
  2. frequenzimetro con frequenze di campionamento ad 1Hz. In questa modalitą puņ misurare frequenze dell'ordine di 16bit di ampiezza. Potremmo quindi misurare fino a 65535Hz o 6.5535MHz, per mezzo del divisore 1/100.
  3. frequenzimetro con campionamento a 64Hz. In questa modalitą puņ misurare frequenza fino ad 1,5Mhz o 100MHz, per mezzo del divisore 1/100.
[Comandi ASCII per mezzo della seriale rs232]
comandi ASCII sull'interfaccia RS232.
Potete cambiare la modalitą di funzionamento per mezzo del pulsante mode o con una serie di comandi attraverso l'interfaccia seriale. L'interfaccia seriale puņ essere gestita con dei comandi ASCII, come avevamo descritto nell'articolo Maggio 2002, Un pannello di controllo LCD per il Vostro server Linux. I comandi disponibili sono descritti nel file README.commands.

Il LED verde indica che il segnale di ingresso non č presene. Esso lampeggerą allorquando sul segnale sarą presente un segnale che verrą conteggiato.

Il secondo pulsante č quello di clear. Questo pulsante puņ essere utilizzato per resettare il contatore, quando funziona come contapezzi in modalitą incrementale. e per variare la visualizzazione tra modalitą diretta e su scala 1/100. Questo per non far sģ che dobbiate eseguire complessi calcoli matematici. Ovvero andremo a far veder il risultato moltiplicato per 100. Si dimostra utile se utilizzate la porta di misurazione con divisore 1/100.

Quanto preciso?

Qualsiasi contatore digitale ha una precisione di +/- una unitą di visualizzazione. L'ultima cifra tende sempre ad oscillare anche se il segnale da analizzare avrą la massima stabilitą possibile. Se il segnale viene campionato a 64Hz, avremmo una precisione di +/- 64. Lo stesso vale per il divisore 1/100. In ogni caso questo contatore č assai preciso. L'unico punto debole č costituito dal cristallo di quarzo da 4194304Hz. I cristalli di quarzo oscillano pił lentamente quando sono caldi. Questo concerne la fisica e puņ essere eliminato solo controllando la temperatura in maniera esatta!

Č possibile calibrare il contatore se trovate un buon segnale di riferimento. Lo si puņ calibrare per mezzo del software inserendo un piccolo ritardo nella funzione handlecounterresult(). Ho confrontato il mio contatore con un segnale di riferimento molto preciso, ed ho potuto notare che il mio frequenzimetro č pressoché esatto. Vi comunico anche che i ritardi di compensazione sono attualmente commentati nel codice sorgente. Potete influenzare la frequenza del cristallo di quarzo variando la capacitą di uno dei condensatori da 27pF (dovrete perņ fare delle prove sperimentali per i valori o ricorrere ad un condensatore variabile).

Per un normale utilizzo amatoriale non vi č la necessitą di calibrare il frequenzimetro. Vi ricordo che i normali cristalli da 4194304Hz sono molto precisi.

Il contatore in azione

Qui potete vedere il frequenzimetro/contatore in azione
[il frequenzimetro]

Per chi vuole saperne di pił

In questo articolo non viene fornito alcun software per gestire i responsi direttamente da Linux. Si potrebbe utilizzare questo frequenzimetro, per esempio, per misurare la velocitą del vento in luoghi lontani o quello che la fantasia ci suggerisce, purché possa essere convertito in una frequenza digitale. Scrivere software per Linux per gestire risultati in caso di misurazione che si perpetrano nel tempo non č complesso. Potete per esempio apportare delle modifiche al programma in perl presente nell'articolo Maggio 2002, Un pannello di controllo LCD per il Vostro server Linux. Se siete interessati a registrare i risultati su di un file, potete utilizzare semplicemente i seguenti comandi:

ttydevinit /dev/ttyS0
cat /dev/ttyS0 > your_logfile.txt

In questo caso si presuppone che il frequenzimetro sia collegato alla porta seriale COM1 (=ttyS0).
Semplice no?

Bibliografia