Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10281
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« on: January 26, 2013, 07:00:01 am » |
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=812e trovato queste lib: http://interface.khm.de/index.php/lab/experiments/arduino-frequency-counter-library/http://www.pjrc.com/teensy/td_libs_FreqCount.htmlMa 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.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16500
Don't know what I do
|
 |
« Reply #1 on: January 26, 2013, 07:34:35 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 74
Posts: 7379
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #2 on: January 26, 2013, 07:44:24 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10281
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #3 on: January 26, 2013, 08:46:01 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16500
Don't know what I do
|
 |
« Reply #4 on: January 26, 2013, 12:10:34 pm » |
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 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16500
Don't know what I do
|
 |
« Reply #5 on: January 26, 2013, 12:27:37 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10281
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #6 on: January 26, 2013, 05:37:14 pm » |
Grazie Leo  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? 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16500
Don't know what I do
|
 |
« Reply #7 on: January 26, 2013, 05:47:26 pm » |
Alla luce di ciò ora chiedo si potrebbe usare l'Input Capture Unit presente sul timer 1 per misurare la frequenza?  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.
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10281
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #8 on: January 26, 2013, 06:02:14 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16500
Don't know what I do
|
 |
« Reply #9 on: January 26, 2013, 06:04:49 pm » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10281
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #10 on: January 26, 2013, 06:10:45 pm » |
Grazie Leo, sei sempre il solito generoso 
|
|
|
|
|
Logged
|
|
|
|
|
Rome (Italy)
Offline
Tesla Member
Karma: 74
Posts: 7379
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
|
 |
« Reply #11 on: January 27, 2013, 01:56:05 am » |
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.
|
|
|
|
|
Logged
|
|
|
|
|
Cagliari
Offline
Faraday Member
Karma: 49
Posts: 3030
|
 |
« Reply #12 on: January 27, 2013, 05:59:04 am » |
x iscrizione
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16500
Don't know what I do
|
 |
« Reply #13 on: January 27, 2013, 06:07:09 am » |
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...
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10281
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #14 on: January 27, 2013, 10:00:58 am » |
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
|
|
|
|
|
Logged
|
|
|
|
|
|