Frequenzimetro Digitale con micro ATMEL - FINITO -

Ho bisogno dell’aiuto degli esperti software nella scelta di una libreria per il mio mega-progetto 2013: un Frequenzimetro digitale in grado di leggere da 0,1Hz a 1,1GHz.
Lo stadio degli ingressi hardware è pronto (ma è passibile di interventi per adeguamenti al Contatore) e ogni range di Frequenza viene riportato , mediante opportuni divisori a: 2,5MHz (1GHz), 1MHz (10MHz), 4MHz (40MHz).
Mediante una serie di opportune commutazioni tali frequenze saranno applicate ad un contatore, costituito da un mega328P, che invierà i risultati ad un Display LCD.
Esistono delle librerie create appositamente per la funzione frequenzimetro e quindi devo scegliere quella che dal punto di vista software è la migliore (come tecnica di programmazione) in modo da avere certezza di non poter tirare altro dal micro.
Il micro potenzialmente legge fino a 10MHz, a patto di usare un quarzo da 20MHz e di fornire segnali con duty-cycle al 50% (da data-sheet), ma sono molto dubbioso sul limite, che avrei voluto raggiungere per evitare il divisore sullo stadio a 10MHz, quindi ho deciso di sopperire in altro modo, con altro hardware.
Ho fatto questa ricerca:
http://www.google.it/search?hl=it&q=FreqCounter&meta=#hl=it&tbo=d&sclient=psy-ab&q=FreqCounter+library+Arduino&oq=FreqCounter+library+Arduino&gs_l=serp.3...58281.65875.0.66625.16.5.0.0.0.0.0.0..0.0...0.0...1c.1.HV_LXhVdrYM&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.&bvm=bv.41524429,d.Yms&fp=2cac4f519ccbd381&biw=1280&bih=812
e trovato queste lib:
http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/
http://www.pjrc.com/teensy/td_libs_FreqCount.html
Ma mi pare di capire che ci sia altro materiale utile, solo che per me la ricerca non è semplice. Intanto con ogni probabilità mi servirà anche un periodimetro, disponibile in coppia sul primo link, ecco perché sarei più propenso verso questo.
http://interface.khm.de/index.php/lab/experiments/frequency-measurement-library/
Poi avrò bisogno di aiuto per una serie di comandi per la gestione degli ingressi, ovvio che proverò a fare tutto da solo, ma so già che certi limiti per ora sono insuperabili per me.
Grazie.

Non ho mai usato una tale lib. Dando un'occhiata alle 2 che hai linkato quella presente qui:
http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/
mi sembra molto più complessa ed articolata dell'altra.
La libreria regge ingressi fino ad 8 MHz con segnali livello logici.

leo72:
La libreria regge ingressi fino ad 8 MHz con segnali livello logici.

Il limite di 8 MHz non è dato dalla libreria, dipende dal clock del ATmega, la massima frequenza in ingresso, da esterno, ad un timer in modalità counter non può essere superiore a 1/2 fosc (16 MHz/2 = 8 MHz), da qui l'esigenza di utilizzare un quarzo da 20 MHz per ottenere il tetto di 10 MHz.

Vero, come mi disse proprio Astro a suo tempo, il data-sheet (capitolo 17.3) recita:

The external clock must be guaranteed to have less than half the system clock frequency (fExtClk< fclk_I/O/2) given a 50/50% duty cycle

il vero problema non sarebbe tanto la "conversione" sulla temporizzazione del pwm (a 20MHz la temporizzazione del PWM cambia da 490Hz a 612.5Hz) quanto il fatto che ho toccato con mano la difficoltà ad ottenere un duty cycle al 50%, quindi temo che a 10MHz "diretti" non arriverò mai.
Allora vada per la coppia "khm.de"; devo dire che la prima prova la feci circa un anno fa e ricordo che oltre i 7MHz già dava i numeri, probabilmente (ma lo capisco ora) proprio per la questione del duty cycle; ma a me basta ed avanza, visto che a questo punto lascio i divisori hw e nella peggiore ipotesi porto al micro 4MHz.

Solo Vi chiedo, trattandosi di "tempi", se c'è qualcosa che si possa ottimizzare per rendere più rapida ed efficiente la lib, naturalmente se la cosa non vi porta via troppo tempo; ovviamente mi bastano suggerimenti, tutti i test del caso li farò io.

astrobeed:

leo72:
La libreria regge ingressi fino ad 8 MHz con segnali livello logici.

Il limite di 8 MHz non è dato dalla libreria, dipende dal clock del ATmega, la massima frequenza in ingresso, da esterno, ad un timer in modalità counter non può essere superiore a 1/2 fosc (16 MHz/2 = 8 MHz), da qui l'esigenza di utilizzare un quarzo da 20 MHz per ottenere il tetto di 10 MHz.

Trattandosi di una lib che si appoggia ai timer, era sottinteso che il suo limite è dato dai timer che sta usando. Ho scritto "la lib regge ecc.." per sintetizzare. La prox volta misuro meglio le parole :sweat_smile:

In teoria..... potresti usare anche clock maggiori di 20 MHz. L'Uzebox, ad esempio, è cloccata a 28 MHz.
Certo, siamo oltre le specifiche Atmel ma in teoria... un clock leggermente superiore a 20 MHz dovrebbe essere tollerabile dal chip.

Altra cosa, non si potrebbe usare l'Input Capture Unit presente sul timer 1 per misurare la frequenza?
Ogni volta che arriva un segnale (alto o basso sul pin) il valore del contatore viene scritto in un registro e da lì si può estrarre mediante un'apposita ISR. Facendo la media dei tempi si potrebbe avere la frequenza del segnale.

Grazie Leo :slight_smile:
L'idea dell'overclock non mi attira molto perché il progetto è destinato ad un pubblico e se capita quello che becca l'atmega poco tollerante (i miei 1284 insegnano....) non va bene.

Comunque questa è una cosa risolta: prevederò un deviatore per bypassare manualmente il divisore alle frequenze più basse e risolvo, magari poi approfondisco la problematica per curiosità.

io non so rispondere alla tua domanda, voglio invece spiegare come funziona il mio metodo di misura per chi non conoscesse la tecnica, così ripetiamo anche un minimo di teoria.

1Hz = 1 ciclo al secondo - 1 ciclo = distanza tra due successivi fronti di salita (o di discesa).
La misura della frequenza si effettua con il conteggio dei cicli che arrivano nell'unità di tempo al pin di ingresso
Le varie unità di tempo (multiple l'una dell'altra) usate in questi strumenti vengono definite "base dei tempi"
Un esempio: base dei tempi = 1 secondo - frequenza applicata 15689 Hz
quindi nel secondo passano 15689 cicli, vengono conteggiati e mostrati sul display; il conteggio è continuo, inizia ad ogni secondo e finisce al successivo, in questa fase il display mostra la lettura precedente, che quindi viene aggiornata ogni secondo. In genere alla bt da 1 secondo viene applicata unità di misura Hz, quindi vedremo 15689 Hz

Se ora impostiamo come base dei tempi 0,1 secondi cosa succede? il numero dei cicli che passa in un decimo del tempo precedente è un decimo anch'esso, quindi vengono conteggiati 1569 cicli; con 0,1 secondi l'unità di misura passa a kHz quindi vedremo sul display 15.69

Se ora impostiamo bt = 0,01 secondi la lettura sarà 157, l'UM sarà in MHz e la lettura sul display 0.157.

Alla luce di ciò ora chiedo

si potrebbe usare l'Input Capture Unit presente sul timer 1 per misurare la frequenza?

:slight_smile:

Il datasheet dice espressamente che l'Input Capture Unit del timer 1 si può usare proprio per misurare frequenze. Non so che frequenza sia in grado di reggere, tenuto conto che bisogna anche gestire un interrupt per svuotare il registro in cui viene scritto il valore del contatore. Andrebbero fatte delle prove.

Io devo misurare frequenze da 0,1Hz a 4MHz. Se riesci a buttare qualche riga per fare prove ovviamente i test li faccio io, se la cosa è complicata però aspetta che prima faccio i test con la lib, magariu risolvo senza farti perdere tempo. Regolati tu.

Allora prima fai i test con quella lib. Se poi vuoi provare una variante (e trovo 2 minuti... che poi saranno 2 ore, per buttar giù qualcosa di funzionante) fammi un fischio.

Grazie Leo, sei sempre il solito generoso :*

leo72:
Il datasheet dice espressamente che l'Input Capture Unit del timer 1 si può usare proprio per misurare frequenze.

Quella funzione misura il periodo tra due impulsi, la frequenza altro non è che il reciproco del periodo quindi va da se che con quella funzione puoi anche ottenere la frequenza, però tocca fare i conti con la bassa risoluzione del timer, solo 16 bit, il che limita moltissimo il reale range di frequenze misurabili, sopratutto tenendo conto del fatto che più ci si avvicina ai piccoli periodi e più aumenta la granularità della misura.
In pratica questa funzione può essere utile per misurare con maggiore precisione, e in minor tempo, le frequenze basse, dove il conteggio degli impulsi limita la risoluzione a meno di non usare come base dei tempi 10 secondi, però tocca verificare se è possibile usare il prescaler sul clock in ingresso altrimenti con 16 MHz il periodo minimo utile misurabile è molto breve.

x iscrizione

astrobeed:

leo72:
Il datasheet dice espressamente che l'Input Capture Unit del timer 1 si può usare proprio per misurare frequenze.

Quella funzione misura il periodo tra due impulsi, la frequenza altro non è che il reciproco del periodo quindi va da se che con quella funzione puoi anche ottenere la frequenza, però tocca fare i conti con la bassa risoluzione del timer, solo 16 bit, il che limita moltissimo il reale range di frequenze misurabili, sopratutto tenendo conto del fatto che più ci si avvicina ai piccoli periodi e più aumenta la granularità della misura.
In pratica questa funzione può essere utile per misurare con maggiore precisione, e in minor tempo, le frequenze basse, dove il conteggio degli impulsi limita la risoluzione a meno di non usare come base dei tempi 10 secondi, però tocca verificare se è possibile usare il prescaler sul clock in ingresso altrimenti con 16 MHz il periodo minimo utile misurabile è molto breve.

Sì, F = 1/t.
Difatti ho detto che si può usare l'ICU (Input Capture Unit) per prendere il valore del registro e versarlo in un registro da cui poterlo leggere tramite una ISR. L'ICU di suo non fa questi calcoli.
Però astro mi ha messo il pungolo, e guardando il datasheet, cap 16.6 fig. 16.3, l'ICU non ha il prescaler sul pin di ingresso. Quindi la max frequenza misurabile è bassa..
Niente, lasciamo perdere...

ok, restiamo sulla lib, sono appena arrivato in lab, ora faccio le prove col bl del 1284, la versione precedente di mighty, poi voglio provare a mettere in piedi la parte contatore e fare la prime prove con gli strumenti

Cari amici,
finalmente dopo 6 mesi di duro lavoro questa sera posso pubblicare le prime foto del neonato Frequenzimetro digitale, mio prossimo articolo in pubblicazione. Ero partito con l'idea di realizzare uno strumento semplice, con prestazioni hobbystiche, ma poi mi sono fatto prendere la mano, perché avevo le "spalle coperte" da gente in gamba e quindi alla fine ne è uscito fuori uno strumento professionale.
Le caratteristiche essenziali:
3 ingressi (commutabili mediante pulsante, ingresso attivo indicato dal relativo LED):
BF per segnali tipicamente sinusoidali/triangolari (1Hz-10MHz sensibilità minima 20mVpp)
TTL per segnali digitali TTL/CMOS da 3Vpp a 15Vpp (1Hz - 32MHz)
RF per segnali "radio" (1MHz - 1,1GHz sensibilità da 25mVpp a 1,6Vpp). Questo stadio dispone di un ingresso BNC standard ed un ingresso SMA per sonde speciali HF o per il collegamento di antenne se i segnali da misurare sono particolarmente elevati
Il cambioportata è automatico, lo strumento si autoimposta per la migliore risoluzione
E' possibile impostare la scala di lettura in Hz, kHz, MHz, GHz (commutabili mediante pulsante)
Lo strumento è alimentabile direttamente dalla 220Vac in quanto è previsto un PCB con trasformatore e regolatore integrati, oppure è sufficiente una fonte 5V 2-300mA ma ben filtrata.
L’ho montato in un contenitore TEKO di buone fattezze.
Ed ora i necessari e doverosi ringraziamenti:
@ Astrobeed: che mi ha fornito sigle di integrati e schemi di base, nonché tante spiegazioni, non so come farmi perdonare, spero che almeno ora sia fiero del suo allievo
@ Cyclone: mi ha dato una dritta fondamentale per bloccare l’RF che se ne andava a spasso per l’intero circuito come i topi nelle fogne di Parigi; questo mi ha permesso di “spingere” lo strumento dai 300MHz iniziali ad oltre 1GHz.
@ FLZ: altra dritta fondamentale per bloccare le tremende autoscillazioni dello stadio BF, in tal modo ho raggiunto sensibilità minime di 20Vpp contro i circa 80-100mVpp iniziali
@ Leo: mi ha risolto un paio di problemi software importanti e mi ha dato alcune dritte per l’implementazione delle “scale”.
Praticamente un lavoro d’equipe XD, naturalmente anch’io ho fatto la mia parte ed ho arricchito gli schemi ed il software con bellissime soluzioni che saranno rese pubbliche e che potranno essere adottate da chiunque per situazioni simili; ho dedicato a questo progetto centinaia di ore di test; per poter lavorare al meglio con l’RF ho comprato espressamente un Generatore Marconi da 1GHz ed un Analizzatore di Spettro portatile (bellissimo), senza i quali sarebbe stato impossibile raggiungere questi risultati. Ho in lab già tre frequenzimetri: un HC F1000 da 1GHz, un ottimo Metex da 1.6GHz ed un Velleman da 2.4GHz, posso assicurarvi che nessuno dei tre gli sta alla pari quanto a sensibilità di lettura, anche se poi questi hanno altre caratteristiche migliori.
La chicca finale: non ho fatto un conto preciso ma non credo servano più di 60-70 euro per realizzarlo completo di tutto e considerando nel computo l’acquisto dei PCB da mdsrl che, da soli, rappresentano quasi la metà della somma.
Nelle foto allegate (non badate alla qualità, la fretta….) potete vedere l’interno con lo stadio alimentazione, e lo stadio micro&display (in PDIP), lo stadio “ingressi” (il vero cuore dello strumento, tutto necessariamente in smd) ed il frontalino: notate la spia blu che indica l’ingresso RF attivo e soprattutto la lettura della frequenza sotto misura: 1,035 GHz (ampiezza 1,6Vpp)!!!

azzz... :astonished: :astonished:
COMPLIMENTI!

Ca...volo :stuck_out_tongue: ... ed io che pensavo che il mio progetto di frequenzimetro portatile da 500MHz fosse chissa cosa ... quasi quasi mi vergogno.

Complimenti, bella realizzazione davvero ... mi fa venire voglia di fregarti l'idea e trasformarla in una versione "quasi tascabile", buttando quello che stavo facendo io ... questo qui, anche solo dalle specifiche preliminari, avrebbe quasi il doppio della sensibilita' e piu del doppio della portata ... sempre che la cosa non ti dia fastidio, ovviamente ...

Leo: grazie, in effetti tu hai visto solo software, questa è un'anteprima anche per te XD però sottolineo la preziosità del tuo lavoro in questo progetto, ed ancora non è finita..... :smiley:

Etem: io ho fatto questo lavoro per pubblicarlo sulla Rivista, quindi sono vincolato a loro per quanto riguarda schema, software, ecc. ma dubito che a te servano i miei consigli per realizzare una versione tua di un frequenzimetro con queste caratteristiche, perché dovrei provarne fastidio? Alla versione portatile avevo pensato anch'io, ad un certo punto, mi sarebbe bastato prevedere un'alimentazione esterna da 5V (come ho scritto prima) e mettere in smd anche lo stadio logica e display, però io ho una passione per la strumentazione da banco XD, solo il capacimetro in TTL l'ho fatto portatile perché la misura di un condensatore non è la stessa cosa della misura di un segnale. Quindi.... buon lavoro!

Ciao, anch'io ho un po di roba da banco, quasi tutta autocostruita, ma ultimamente mi e' venuta voglia di integrare un po della strumentazione "portatile", per potermela tirare dietro se devo andare in giro ... per il frequenzimetro ne avevo costruito uno da banco tempo fa' (a led, alla faccia del "vintage" :D), che ancora funziona bene ... ora stavo progettandone uno il piu piccolo possibile, usando uno schema con un pic che avevo trovato in rete, ed aggiungendoci un prescaler "riciclato" da un tuner TV per la portata alta, e qualche modifica al software (per la quale dovrebbe aiutarmi un'amico quando avra' tempo :P) per usare un display 16x4 ed avere cosi visualizzate anche informazioni aggiuntive , tipo lunghezza d'onda, periodo, tempo, ecc (lo so che ci sono gia fatti su ebay, ma io sono un maniaco del fai da te :P) ... ma come ho detto, dalla tua descrizione la tua versione e' decisamente migliore sia come portata sia come sensibilita', quindi pensavo di usare quella.

Ovviamente non sto chiedendoti gli schemi prima che li pubblichino, fin li ci arrivo :stuck_out_tongue: ... se puoi anticiparmi un'informazione senza violare il tuo accordo con la rivista, dimmi solo che prescaler hai usato ... tutti quelli che avevo trovato io, o non erano sensibili, o non davano portate decenti, o avevano altri problemi, per quello avevo finito col riciclare parte di un tuner TV ... ovviamente, se non lo puoi dire prima che esca la rivista, va benissimo anche cosi ... aspettare non costa nulla :wink: .