Loading...
Pages: [1]   Go Down
Author Topic: Libreria per Stadio Contatore Frequenzimetro Digitale con micro ATMEL  (Read 535 times)
0 Members and 1 Guest are viewing this topic.
Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 386
Posts: 10228
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16431
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Tesla Member
***
Karma: 74
Posts: 7342
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Shannon Member
****
Karma: 386
Posts: 10228
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Vero, come mi disse proprio Astro a suo tempo, il data-sheet (capitolo 17.3) recita:
Quote
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

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16431
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-sweat
Logged


Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16431
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Shannon Member
****
Karma: 386
Posts: 10228
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Leo smiley
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
Quote
si potrebbe usare l'Input Capture Unit presente sul timer 1 per misurare la frequenza?
smiley
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16431
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Alla luce di ciò ora chiedo
Quote
si potrebbe usare l'Input Capture Unit presente sul timer 1 per misurare la frequenza?
smiley
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 Offline
Shannon Member
****
Karma: 386
Posts: 10228
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16431
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Shannon Member
****
Karma: 386
Posts: 10228
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie Leo, sei sempre il solito generoso smiley-kiss
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 74
Posts: 7342
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Faraday Member
**
Karma: 49
Posts: 3000
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

x iscrizione
Logged

IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85
Ultimi acquisti:
CodeBender: http://codebender.cc/register/?referrer=PaoloP

Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16431
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Shannon Member
****
Karma: 386
Posts: 10228
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Pages: [1]   Go Up
Print
 
Jump to: