Frequenzimetro con PIC16F84

Frequenzimetro

Funzionamento
Il segnale in ingresso in HF/VHF passa in un prescaler che provvede a creare un segnale, alla sua uscita, di frequenza più bassa, in relazione al fattore di divisione impostato.
Nel caso in cui il segnale da misurare sia di bassa frequenza (MF) bisogna commutare un deviatore manualmente (il quale bypassa il prescaler facendo passare il segnale in ingresso direttamente al circuito di condizionamento) e selezionare la banda MF nel menu visualizzato sul display.

Alimentazione
I vari integrati scelti necessitano di un’alimentazione a 5V continui.
Ho quindi creato uno stadio di alimentazione intorno allo stabilizzatore integrato 7805.

Il prescaler
I vari prescaler in commercio si differenziano per i fattori di divisione disponibili e per la frequenza massima di lavoro.
Il prescaler scelto (MB507 della Fujitsu) supporta una frequenza in ingresso massima di 1.6 GHz, e dispone di vari fattori di divisione, impostabili grazie a diversi stati degli ingressi (piedini SW e MC), come si può notare dalla tabella seguente:

Il fattore di divisione da me utilizzato é 256.
Questo prescaler prevede un condensatore di disaccoppiamento di 1nF al suo ingresso.
A questo io ho anteposto due diodi Schottky, in antiparallelo, che salvaguardano il prescaler se inavvertitamente si applicano, in ingresso al frequenzimetro, segnali di ampiezza troppo alta (il datasheet di questo prescaler definisce un’ampiezza massima in ingresso pari a 10 dBmW, equivalenti a circa 700 mV su 50 Ω).
Per la scelta di tali diodi il requisito essenziale é che abbiano una bassa capacità di giunzione, in polarizzazione inversa: ho scelto dei BAT46 che offrono 6 pF con una tensione inversa di 1 V.
Se avessero, invece, una capacità elevata, presenterebbero una reattanza capacitiva troppo bassa, e diminuirebbero il livello del segnale all’ingresso al prescaler.

Circuito di condizionamento
Questa parte serve ad amplificare il segnale in uscita dal prescaler, il quale (da datasheet) mi fornirebbe un segnale di ampiezza massima 1,6 Vpp, insufficenti perché il PIC effettui un corretto conteggio.
Il mio intento è stato quello di amplificare il più possibile il segnale in uscita dal prescaler, e per fare ciò mi sono servito di due comuni transistor NPN BC546 montati in configurazione ad emettitore comune, e posti in cascata.
Come si può notare dallo schema elettrico a fianco, sui loro collettori ho montato delle induttanze per far sì che tutto il segnale variabile, amplificato e prelevato dal collettore, prosegua verso gli stadi successivi tramite un condensatore di disaccoppiamento.
Non sono riuscito ad ottenere, all’uscita del blocco di condizionamento, un segnale di tipo "pura onda quadra", ma é risultato essere di un’ampiezza più che adeguata per eseguire le misure.

Inoltre l’ingresso RA4/T0CKI, impiegato per effettuare il conteggio, é del tipo a Trigger di Smith: non è quindi necessario un perfetto “squadramento” del segnale in ingresso, in quanto é presente una certa isteresi.

Il microcontrollore PIC16F84A
Il PIC16F84A é un microcontrollore (ormai in disuso) a 8 bit prodotto dalla Microchip Tecnology, costruito con architettura Harvard, la quale prevede due bus e due memorie separate per i dati e il programma: ciò gli permette di accedere ad entrambe contemporaneamente.
La memoria interna si divide in memoria programma o ROM (di tipo Flash, supporta fino a 1024 parole da 14 bit), memoria dati o RAM (68 registri che formano quindi 68 byte di RAM, divisi in due “banchi”) e memoria EEPROM (64 byte); ogni registro é costituito da 8 bit (un byte).
Può essere programmato tramite linguaggio a basso (Assembler) o alto livello (C); il programma scritto in linguaggio utente deve essere convertito in linguaggio macchina tramite un programma assemblatore o compilatore.
Inoltre é un microcontrollore di tipo RISC (Reduced Instruction Set Computer): ha un set di appena 35 istruzioni, le quali si dividono principalmente in bit-oriented-instruction (quelle che agiscono sul singolo bit) e byte-oriented-instruction (agenti sul byte completo).
Dispone di due “porti” (linee di input/output):
• RA, composta di 5 bit
• RB, composta da 8 bit

Il programma, da me scritto in Assembly, impiega vari registri di memoria RAM per memorizzare i dati relativi a misure, elaborazioni e comandi per il display.
Vengono usati anche vari registri di configurazione, quali:
• Registro Timer: implementa il conteggio della frequenza
• Registro Intcon: per l’abilitazione e disabilitazione degli interrupt
• Registro Option: su di esso si imposta il fattore di divisione del prescaler interno al PIC, la sua abilitazione/disabilitazione ed il fronte (di salita o di discesa) del segnale, applicato alla linea RA4/T0CKI, sul quale incrementare il registro Timer
• Registri PortA e PortB: rappresentano gli stati degli ingressi/uscite
• Registri TrisA e TrisB: indicano la direzionalità di ciascuna linea di input/output
• Registro Status: in esso si seleziona il banco di memoria utilizzato e si possono controllare i “flag” che segnalano il risultato di certe operazioni logico-aritmetiche

Software

Il programma effettua il conteggio dei fronti di salita del segnale applicato al piedino RA4/T0CKI. Ad ogni periodo del segnale in ingresso (o a più periodi, nel caso in cui il prescaler interno al PIC sia abilitato) corrisponde un incremento del registro timer, TMR0. Ho settato quindi i bit del registro OPTION affinché il Timer del PIC venisse incrementato tramite la sorgente di clock esterna, posta sul piedino RA4/T0CKI. Inoltre ho abilitato l’interrupt su overflow del TMR0: il PIC esegue quindi la routine di interrupt ogni volta che il registro TMR0 passa da 255 a 0 (overflow). Ho lasciato disabilitati tutte le altre sorgenti di interrupt.

Il firmware è stato scritto in ASSEMBLY.

Nella routine di interrupt il PIC incrementa un registro costituente la cifra meno significativa della frequenza misurata (ad esempio le unità di megahertz); controlla, poi, se c’é un riporto da sommare alle cifre di peso superiore (quindi alle decine e alle centinaia di megahertz). L’interrupt non é sempre abilitato durante l’esecuzione del programma: viene abilitato nell’istante che precede l’avvio del “periodo di misura”, ovvero il tempo necessario a misurare la frequenza del segnale, e disabilitato al suo termine, per lasciare al microcontrollore il tempo di elaborare i dati e inviarli al display LCD, bloccando così il conteggio di frequenza che andrebbe altrimenti a falsare la misura. Il “periodo di misura”  è costituito da un ritardo software; quest’ultimo consiste nel decrementare ciclicamente delle variabili memorizzate nella memoria RAM del microcontrollore e testare se il risultato é zero; quando questa condizione si verifica il programma esce dal ciclo e, come detto prima, disabilita l’interrupt nel caso il TMR0 generi un overflow. Per stabilire il corretto tempo di misura ho inizialmente pensato a quanti conteggi sarebbero stati utili per avere una certa precisione nella misurazione. Per esempio nella portata HF/VHF, ho deciso di voler contare 1000 fronti di salita nel caso in cui abbia in ingresso una frequenza di 100 MHz; questi  diventano 390625 Hz dopo il passaggio nel prescaler. Ho quindi un segnale sul piedino RA4/T0CKI avente periodo di 2,56 µs; sapendo che si genera un overflow ogni 256 periodi di tale segnale, il periodo di misura varrà quindi: Tm=1000*256*2,56*10^-6=655,36ms.

Completata la misura (terminato il periodo di misura) il programma elabora i dati relativi al valore di frequenza misurato e invia al display una “stringa” di caratteri.

Il lavoro di elaborazione consiste nel sommare la cifra decimale 48 alle variabili del conteggio, codificate in BCD, per portarle alla codifica ASCII, interpretabile dal display in uso. Al termine dell'invio dei dati al display, i registri contenenti i dati della misura precedente vengono azzerati, e viene fatta partire quella nuova.

Questo frequezimetro é dotato, come già detto, di due scale di misura:

·         La MF: Medie Frequenze, con la quale riesce a misurare (ottenendo buoni risultati) dai 100 Hz ai 2 MHz, con una risoluzione di 10 Hz; per questa portata il segnale d’ingresso deve avere un’ampiezza minima di 800 mVpp, altrimenti il conteggio di frequenza non risulta corretto

·         La HF/VHF: Alte Frequenze: questa portata consente misure da 1 MHz a 500 MHz con una risoluzione di 10 KHz; il livello minimo del segnale é 50 mVpp

Per le HF/VHF il limite dei 500 MHz é dato dal quarzo da 4 MHz con cui lavora il PIC, il quale fa da "base tempi". Inoltre nella portata HF/VHF é possibile impostare, tramite pressione del relativo menù (pulsante SET durante una misurazione), una certa frequenza intermedia IF che verrà sottratta dal conteggio totale; questa modalità é indispensabile per misurare la frequenza reale di ricezione di una radio. Piccole regolazioni possono essere effettuate agendo sul compensatore C15, usando però come riferimento un generatore di segnale affidabile; nel caso non si disponesse di tale strumento non occorre montare il compensatore e non é necessaria alcuna regolazione (la misura risulta comunque abbastanza precisa).

Display LCD
Il display applicato é del tipo 16x2 (16 caratteri e 2 linee), a matrice di punti.
E’ gestito da un microcontrollore HD44780, comunemente usato su vari display LCD,  il quale si occupa di interpretare i segnali ricevuti dal PIC per poterli visualizzare.

Per inviare un carattere/comando (8 bit) bisogna innanzitutto decidere il tipo di interfaccia che si intende usare: a 4 o a 8 bit.
Io ho optato per la prima, in quanto mi ha consentito di risparmiare 4 linee del PIC, che potrò usare nel caso volessi in futuro cambiare o aggiornare il progetto.
L’unica differenza del bus a 4 bit rispetto a quello da 8 é nell’invio di un dato all’LCD: usando il primo bisogna rendere disponibile, sulle linee dati più significative del display (DB7÷DB4) , il nibble (mezzo byte, 4 bit) alto, mandare un impulso di Enable, aggiornare le linee DB7÷DB4 con il nibble basso e mandare un ulteriore impulso di Enable; usando il secondo, invece, si pone direttamente il byte completo sulle linee dati e si dà un impulso di Enable.

Risultato finale
A realizzazione ultimata il frequenzimetro é risultato avere una buona  precisione ed essere affidabile per le misure per cui é stato progettato.
Un difetto di questo frequenzimetro può essere il fatto che rileva una certa frequenza se al suo ingresso non é applicato segnale: questo é causato dal prescaler MB507, il quale autooscilla nel caso non riceva segnale in ingresso. L’autooscillazione viene istantaneamente soppressa quando al suo piedino IN si fornisce un qualsiasi segnale.
Non é risultato possibile misurare una frequenza superiore ai 500 MHz, perché il PIC perde il conteggio di qualche impulso, e quindi falsa la misura.
 

Frequenzimetro