Pages: [1] 2 3 ... 7   Go Down
Author Topic: Frequenzimetro  (Read 4971 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 0
Posts: 111
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Devo leggere una frequenza che vedo come un pin che diventa alto.
Ho visto pulseIn che però non so se va bene perchè misura la durata dell'impulso, ma se la frequenza và misurata vedendo il numero degli impulsi in un certo tempo con la durata dell'impulso posso farci qualcosa?

Forse potrei fare un interrupt RISING e ogni volta aumentare una variabile, poi in loop() vedere quanto vale la variabile e rapportarla con il tempo trascorso...

Qual'è il modo migliore?
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma a che frequenza massima ?
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Mantova
Offline Offline
Jr. Member
**
Karma: 2
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Puoi fare così:
  • leggi la durata dell'impulso
  • trovi il numero di impulsi facendo 60/durata dell'impulso
  • Calcoli la frequenza facendo 1/numero di impulsi
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21242
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il vantaggio del misurare il periodo di una frequenza é che la misura dura poco. Per misurare bene il numero di periodi durante un certo tempo il tempo deve essere molto maggiore del periodo percui una misura dura molto.

Misura con pulseIn(pin, HIGH, timout) e dopo con  pulseIn(pin, LOW, timout) il perodo della onda. Non é importante che la misura la fai su 2 onde diverse. La frequenza é 1 fratto il periodo.

Ciao Uwe

Logged

Tuscany
Offline Offline
Edison Member
*
Karma: 66
Posts: 1949
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

volendo ci sono anche due librerie della Teensy che funzionano anche su arduino

http://www.pjrc.com/teensy/td_libs_FreqCount.html
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 511
Posts: 12317
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Tenete presente che Arduino non riesce a leggere correttamente frequenze che superino i 7MHz.
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

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se la frequrenza che vuoi misurare non è stabile, allora non si può usare il sistema della pulseIN, ma puoi usare un interrupt in RISING o FALLING
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma per NON STABILE   cosa intendi di preciso?
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

intendo di frequenza variabile nel tempo. Se conti gli impulsi hai la media della frequenza, con la mpulsein hai una lettura a caso
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 511
Posts: 12317
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Nessuno strumento normale è in grado di misurare una frequenza variabile, che valore dovrebbe dare? Al più ci sono quelli che hanno il multidisplay e mostrano in contemporanea le ultime 3-4 misure, ma come dato memorizzato.
La misurazione viene fatti ad intervalli periodici di durata fissa, la visualizzazione del dato misurato viene aggiornata tra un intervallo e l'altro, se la frequenza è stabile si avrà sempre lo stesso valore, se è instabile o variabile si avrà il valore misurato nell'ultimo intervallo.
In genere si imposta la cosiddetta time base (base de tempi), un selettore che fissa gli intervalli a tempi che vanno da 10secondi (per misure di decimi di Hz) a 1sec, 0,1sec, 0,01sec, ecc; maggiore è la frequenza da misurare e minore è l'intervallo di misura da usare.
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

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

in teoria, applicando un poco di statistica, dai il numero di valori letti, il tempo, la media, la varianza (ovvero quanto è la variazione di frequenza nell'arco di tempo), la moda...

sono tutti dati utili. Sappiamo benissimo che la perfezione non esiste, e la varianza è quella che a colpo d'occhio ti dice di quanto stai fuori precisone. la moda ti dice che c'è un forte picco ad una determinata frequenza (da non confondere con la media!)

trovo che siano tutti dati utili, per esempio per verificare la qualità di un circuito PWM->analogico (in tal caso la frequenza sarebbero le variazioni dell'uscita analogica dato un PWM fisso in imput, causate dal circuito RC o RLC), oppure per valutare la qualità della 220V, o di un trasfromatore (che se fosse perfeto avrebbe frequenza 0)

però forse sto usando una definizione di frequenza che si discosta dalla definizione elettronica/elettrotecnica
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma facciamo un esempio reale:

motore sotto inverter (= che puo variare i giri 0-2800 minuto)

 10  impulsì al giro   quindi max frequenza 500 hz

la pulsein che problemi potrebbe avere a visualizzare i giri minuti anche se il motore è in accellerazione ?
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pulsein ogni segnale alto/basso: cambiamento dell'ouput più veloce dell'occhio umano.

media degli impulsi nell'ultimo secondo: il valore non è reale ma leggibile da un essere umano.

uso di una pulseIn ogni secondo:possibili false letture per arrotondamento dei float e disturbi esterni

media delle pulseIn di un secondo: complicazione inutile del codice, possibilità di perdere impulsi

media degli impulsi + pulsein: controllo degli impulsi reale, e anche del loro andamento high/low
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

allora cosa consigli di usare per rcavare la velocita del suddetto motore (no interrupt) ?
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10447
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

senza interrupt? perchè? c'è la attachInterrupt apposta, più facile di così!

comunque considerando la quntità di impulsi, se sono per rotazione, anche con un polling (vedi digitalRead/analogRead) in un loop, con baud il più alto possibile, sei più che a posto

edit: 2 conti; durata analogRead (la più lenta) 200micros. 1secondo = 1.000.000 micros, / 200 = 5000Hz. in RPM (*60) = 300.000 RPM max. Aggiungici il delay per la serial (in 1 secondo a 119200baud scrive 119200/10 = 11920 byte, per semplicità facciamo che in un byte ci fai stare la lettura e poi analizzi il flusse seriale con un editor esadeciomale o con un programma che passa da byte a stringa rappresentate il numero) 11.920Hz di scruitture, ovvero 1.000.000/11920=84micors a carattere


quindi 200micos di analog read + 84 micros di seriale fa 284micros. quindi 3521Hz max, ovvero 211.000 RPM max

direi che il motore fa in tempo a prendere fuoco prima che il nostro (inefficiente) loop conta-rpm vada in crisi. Se hai X segnali per giro, allora gli RPM max sono 211.000/X, ma fai attenzione che un segnale non può durare MENO di 284micros.

se non erro una digitalRead fatta con le CBI e TWI mni pare avvenga in 10micros... a te i conti.

Sappi che io ho testao con successo una UNO (e anche una 2009) a 921600 baud (anche di più mi pare, devo controllare)
« Last Edit: October 23, 2012, 04:54:12 pm by lesto » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1] 2 3 ... 7   Go Up
Jump to: