La semplice misura della frequenza di un segnale è sempre di grande aiuto, ma spesso è necessario ricorrere a strumenti non molto economici. Questo frequenzimetro, basato su un microcontrollore Atmega328, permette la misura si un segnale ad onda quadra, sinusoidale e triangolare, fino a 560 kHz (max 800 kHz). E’ dotato di un doppio prescaler e di un circuito di condizionamento del segnale. Le misure vengono visualizzate su un display LCD 16×2, grazie al quale è possibile modificare le impostazioni, e salvarle nella EEPROM, per un mantenimento permanente. Lo strumento è utilizzabile anche come contagiri.

Mediante una libreria, è possibile misurare la durata del periodo di un segnale. La libreria si chiama FreqPeriod, ed è scritta da Martin Nawrath, del sito http://interface.khm.de/.

Per il download della libreria, che si può effettuare anche direttamente dal sito indicato sopra, cliccare qui: LIBRERIA FREQPERIOD.

La libreria sfrutta un comparatore analogico interno del microcontrollore atmega328, grazie al quale è possibile stabilire con un’alta precisione l’inizio e la fine del periodo.

Di seguito viene riportato lo schema del progetto, quindi la sua descrizione.

–> LINK ALLO SCHEMA IN PDF

–> LINK ALLA LISTA DEI COMPONENTI

Descrizione dello schema:

In alto a sinistra c’è lo stadio di alimentazione, il quale necessità in ingresso di una tensione a 12 V (continua o alternata). L’alimentatore stabilizza la tensione a 5 Vdc, per la logica di controllo.

Al centro c’è l’ArduinoUNO, il quale controlla tutto il sistema, ed è collegato al display HD44780 alfanumerico 16×2 (in alto a destra) per la visualizzazione.

Il segnale viene prelevato mediante il connettore X2 (BNC femmina da pannello), ed entra nelle porte logiche U2A e U2B (74HC00). U2A ha il compito di squadrare il segnale e opera come un buffer, ma nega il segnale, quindi U2B nega anch’esso il segnale, il quale torna ad acquisre i normali stati logici.

Dopo essere stato squadrato, il segnale entra nel prescaler, composto da 4 flip-flip J-K, (2 74LS112) in configurazione “contatore”. Il la frequenza del segnale viene divisia per 2, 4, 8 e 16.

I tre relè pilotati dai transistor sulle uscite 2,3 e 4 di Arduino, hanno il compito di prelevare il segnale in punti precisi del circuito, ovvero:

-all’uscita del buffer: rapporto segnale reale/misurato = 1:1, non c’è nessun prescaler;

-all’uscita del secondo flip-flop: rapporto segnale reale/misurato = 4:1: il prescaler è X4;

-all’uscita del quarto flip-flop: rapporto segnale reale/misurato = 16:1: il prescaler è X16.

Questo permette di utilizzare il rapporto desiderato ogni volta.

Arduino, con la libreria FreqPeriod, riesce a misurare frequenze fino 35 kHz senza problemi, e arriva fino a 50 kHz con qualche problemi di false misure (ovvero il valore visualizzato sul display ha piccoli sbalzi).

Utilizzando il prescaler X4, si può arrivare fino a 140 kHz (200 kHz con piccoli sbalzi), e utilizzando ill prescaler X16 la massima misura ammissibile è di 560 kHz (800 kHz con i piccoli sbalzi).

I piccoli sbalzi di cui si parla non sono nulla di fastidioso, semplicemente se il segnale non è proprio pulito al massimo, alcune volte il valore visualizzato sul display cambia per un istante, appena percepibile. Comunque il funzionamento perfetto è fino a 560 kHz.

Durante le misure bisogna sempre utilizzare il prescaler più basso possibile, per aumentare la frequenza di refresh della misura.

Il prescaler si seleziona con i primi 3 pulsanti del pannello, il quarto pulsante apre il menu utente.

Nello schema è presente una piccola rete R-C che adatta il segnale da misurare al comparatore analogico, in modo che quest’ultimo (funzionante grazie agli interrupts del programma) rileva ogni fronte di salita e discesa del segnale.

Il programma (per Arduino UNO R3, o per atmega328) è scritto con la tecnica dei menu ad “if”, ovvero ogni schermata del display corrisponde ad un menu, e c’è una variabile che tiene registrato il menu da visualizzare. Ad esempio, se siamo nella schermata iniziale (menu 0) e viene premuto il pulsante [4] (menu), il menu da visualizzare è il menu 1, quindi verrà aggiornato il contenuto della variabile.

Ogni menu ha una sua routine, che è composta da un macro IF, che viene attivato solo se il menu attivo corrisponde con quello dell’IF. Quindi all’interno dell’IF ci sono le varie istruzioni per il display, quelle interne, e le operazioni da fare in caso di pressioni di uno dei pulsanti.

Esempio:

if(menuatt==1){
  Serial.print("il menu 1 è attivo");
  if(bt1press==1){
    menuatt=2;
  }
}
if(menuatt==2){
  Serial.print("adesso è attivo il menu 2");
  delay(1000);
  menuatt=1;
}

Lo sketch comprende due menu, ipotizzando che la variabile “menuatt” venga dichiarato con valore iniziale 1, normalmente il menu attivo è il “menu 1”, e viene stampata la frase sulla porta seriale, ma se viene premuto il pulsante BT1 (la variabile bt1press è controllata da un’altra parte di programma), viene attivato il menu 2.

Quando è attivo il menu 2, la frase sulla porta seriale è diversa, quindi il programma attende 1 secondo (con il delay) e riattiva il menu 1.

Il controllo dei pulsanti premuti è realizzato mediante una routine anti rimbalzo, ovvero viene tenuto in memoria lo stato precedente del pulsante, e se si verifica la condizone “1 – 0 – 1” (ovvero pulsante premuto e rilasciato, 1 è lo stato logico che normalmente ha il pulsante, essendo dotato di resistenze di pull-up interne al MCU), viene attivato un flag che corrisponde al “pulsante premuto”.

–>PROGRAMMA PER ARDUINO UNO<–

–>LIBRERIA FREQPERIOD <–

Per installare la libreria è necessario copiare la cartella “FreqPeriod” (quella che dovete scaricare) all’interno della cartella “/arduino/libraries” del vostro computer.

Visuale dall’alto, si nota il dissipatore ricavato da un profilato rettangolare in alluminio:

Si possono notare 4 schede diverse:

-Arduino UNO in fondo (chiaramente riconoscibile per il caratteristico colore blu);

-La scheda a destra (con il dissipatore) è l’alimentatore;

-la scheda in basso davanti comprende i prescaler e il buffer;

-la scheda in alto davanti è la rete R-C di adattamento per il comparatore analogico.

Il cablaggio interno è molto fitto, infatti sono stati eliminati il più possibile gli “spazi vuoti” per via del piccolo contenitore a disposizione.

Parte anteriore del frequenzimetro finito:

Parte posteriore del frequenzimetro:

(si nota il connettore per l’alimentazione a 12 Vac e la porta USB, infatti la scheda Arduino è stata montata sul retro, e la lamiera del contenitore è stata forata per fare uscire il connettore, in modo da agevolare la programmazione)

Frequenzimetro in funzione (modalità frequenza, collegato ad un generatore di funzioni):

Come accennato in precedenza, lo strumento può funzionare anche come contagiri utilizzando un sensore a effetto hall (montando un piccolo magnetino sull’albero, che ad ogni giro passa molto vicino al sensore).

Se il motore è a combustione, ed ha un accensione elettronica (non a puntine), si può fare un piccolo avvolgimento (una decina di spire, il numero esatto per la stabilità massima del contagiri dipende dal motore e si determina sperimentalmente) sul cavo della candela e collegare un terminale alla massa del frequenzimetro e uno all’ingresso. Questo metodo è utilizzabile per i motori monocilindrici; per i motori con più cilindri è necessario modificare il programma (in quanto il segnale viene moltiplicato per 60).

In ogni caso il metodo migliore per misurare gli RPM è utilizzare il sensore a effetto hall.

–> MANUALE UTENTE (per l’utilizzo dello strumento) <–

LINKs DELL’ARTICOLO:

>SCHEMA FREQUENZIMETRO

>LISTA COMPONENTI

>SCHEMA COLLEGAMENTO SENSORE A EFFETTO HALL

>PROGRAMMA ARDUINO UNO

>LIBRERIA FREQPERIOD (link kmh.interface.de)

(questo articolo proviene dal vecchio sito)


6 commenti

Yddu · 19 Novembre 2015 alle 12:01

Arrivo con due anni di ritardo su questo progetto che trovo estremamente interessante.
Vorrei realizzare un generatore di onde ed inserire questo frequenzimetro, però volevo capire se è possibile ridurre al minimo il codice inserendo dei parametri (frequenza, porta seriale..ecc..) fissi (quindi senza scrittura in eeprom e magari senza pulsanti) in modo da ridurre all’osso il progetto ed utilizzare il frequenzimentro solo per la lettura della frequenza in uscita dal generatore
Grazie

    Marco Plessi · 19 Novembre 2015 alle 12:33

    Ciao, il sistema è tranquillamente integrabile nel tuo progetto.
    Dal punto di vista hardware, è sufficiente eliminare i pulsanti. Per il software, è necessario eliminare alcune parti, ovvero quella che legge e scrive i parametri sulla eeprom, la gestione dei pulsanti e dei menu. Il codice è commentato in ogni parte, quindi è un lavoro molto semplice da fare. Praticamente devi lasciare solo la parte relativa alla misurazione e all’output su display e, se ti serve, su porta seriale.
    Saluti, Marco

Daniele · 8 Febbraio 2016 alle 20:21

Molto interessante. Volevo chiederti una cosa: E’ possibile sostituire l’arduino uno con il microcontrollore vero e proprio? Con arduino programmo l’ATMega 328 e poi lo saldo nel PCB. Grazie mille!

    Marco Plessi · 2 Marzo 2016 alle 20:36

    Grazie 😉 Si è possibile, non c’è nessun problema, l’importante è che prevedi nel circuito lo stadio oscillatore e la resistenza per il reset.

Daniele · 14 Marzo 2016 alle 17:50

Un’ultima cosa: Ho notato che i flip flop da te utilizzati (74LS112), sia il clear che il preset non sono stati connessi a nulla. Visto che sono solamente dei divisori di frequenza, non potrei usare dei flip flop che già possiedo(vedi il 74LS73 o il 74LS74)? Grazie mille, attendo una risposta 🙂

    Marco Plessi · 16 Marzo 2016 alle 18:47

    Si, essendo utilizzati come divisori di frequenza, puoi usare qualsiasi flip flop J-K o S-R, quindi anche quelli che hai già.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *