Pages: [1]   Go Down
Author Topic: Misura di frequenza con arduino  (Read 1535 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve, dovrei misurare la frequenza (circa 31 kHz) di un segnale ad onda quadra in uscita da un TLC556/TLC555 in configurazione astabile, ho dimensionato le resistenze del circuito in modo tale da avere un duty cycle di circa 50%. Sto utilizzando la funzione PulseIn() per la misura, il problema è che il valore che misuro non è stabile (avvolte ho dei valori indesiderati che si discostano anche di molto dal valore vero). Vorrei sapere se è proprio la funzione PulseIn() ad essere poco precisa o sono io che sbaglio. Grazie in anticipo.
Logged

Offline Offline
God Member
*****
Karma: 0
Posts: 689
AHHAH
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

una volta qualcuno mi aveva dato questo sketch per misurare la frequenza, funzionava

Code:
//variabili
int sigPin = 7; //signal pin
int state; //the state of the input
int oldstate;
unsigned long t; //timer
unsigned long s; //samples
unsigned long c; //count
unsigned long f; //frequency


void setup()
{
  pinMode(sigPin, INPUT);
  Serial.begin(9600);
}

void loop()
{
  c = 0;

   t = millis(); // read time at start of sampling
   for(s=0; s<10000; s++){ //take a number of samples
state = digitalRead(sigPin); //read state
if (state != oldstate){ //if state changes:
  c++; //increment counter
  oldstate = state; //and reset current state
}

   }
   t = millis() - t; //read time at end of sampling

   c = c/2; // need to divide by 2 because counter incremented on each change - two changes per cycle

   f = 1000*c/t; //calculate frequency

  Serial.println("frequenza");
  Serial.println(f);
  delay(500);
}

io lo provavo con un generatore di forme d'onda

altro non so, e' un codice oltre le mie misere conoscenze smiley-wink

ps.: credo che per misurare 31kHz si debba incrementare il 10000, prova, come dicevo non ricordo e non so
« Last Edit: May 14, 2012, 01:23:40 pm by reizel » Logged

Tuscany
Offline Offline
Edison Member
*
Karma: 77
Posts: 2110
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ci sarebbe anche un'apposita libreria http://www.pjrc.com/teensy/td_libs_FreqCount.html ed ero pure curioso di provarla
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

una volta qualcuno mi aveva dato questo sketch per misurare la frequenza, funzionava

Code:
//variabili
int sigPin = 7; //signal pin
int state; //the state of the input
int oldstate;
unsigned long t; //timer
unsigned long s; //samples
unsigned long c; //count
unsigned long f; //frequency


void setup()
{
  pinMode(sigPin, INPUT);
  Serial.begin(9600);
}

void loop()
{
  c = 0;

   t = millis(); // read time at start of sampling
   for(s=0; s<10000; s++){ //take a number of samples
state = digitalRead(sigPin); //read state
if (state != oldstate){ //if state changes:
   c++; //increment counter
   oldstate = state; //and reset current state
}

   }
   t = millis() - t; //read time at end of sampling

   c = c/2; // need to divide by 2 because counter incremented on each change - two changes per cycle

   f = 1000*c/t; //calculate frequency

  Serial.println("frequenza");
  Serial.println(f);
  delay(500);
}

io lo provavo con un generatore di forme d'onda

altro non so, e' un codice oltre le mie misere conoscenze smiley-wink

ps.: credo che per misurare 31kHz si debba incrementare il 10000, prova, come dicevo non ricordo e non so

Reizel grazie mille questo codice fa il suo dovere, l'unica cosa è che per ottenere dei valori precisi (che oscillano di circa 6 Hz) devo incrementare il numero di cicli del for fino a 1000000, ma questo mi rallenta un pò il programma.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ci sarebbe anche un'apposita libreria http://www.pjrc.com/teensy/td_libs_FreqCount.html ed ero pure curioso di provarla

Ho già provato ad utilizzare questa libreria ma mi da un errore in fase di compilazione. Non capisco perchè! smiley-mad
Logged

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

Ci sarebbe anche un'apposita libreria http://www.pjrc.com/teensy/td_libs_FreqCount.html ed ero pure curioso di provarla

Ho già provato ad utilizzare questa libreria ma mi da un errore in fase di compilazione. Non capisco perchè! smiley-mad
Temo sia dovuto al fatto che quella libreria sia per il Teensyduino, che ha un core diverso dai modelli tipici degli Arduino. Magari se posti l'errore se ne può avere conferma.

EDIT: più in basso c'è scritto
Quote
FreqCount can be used on Arduino, Sanguino and probably other boards. See the file util/timers.h for details to port to other AVR-based boards.
quindi probabilmente bisogna cambiare i pin di riferimento per usarla con Arduino.
« Last Edit: May 15, 2012, 04:07:10 am by Michele Menniti » 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

Parma
Offline Offline
Edison Member
*
Karma: 21
Posts: 2389
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Guarda, l'oscillazione potrebbe essere dovuta dagli interrupt, prova a disabilitarli se non gli usi (la funzione delay() dopo non funziona però), un ulteriore causa dell'oscillazione potrebbe essere il clock con resonatore ceramico del 328 su arduino che non è stabile come un cristallo, ciao

EDIT: non so se senza interrupt funziona PulseIn..
« Last Edit: May 15, 2012, 04:25:03 am by flz47655 » Logged

Tuscany
Offline Offline
Edison Member
*
Karma: 77
Posts: 2110
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
Ho già provato ad utilizzare questa libreria ma mi da un errore in fase di compilazione. Non capisco perchè!

Strano che ti dia errore. Per scrupolo l'ho provata ora ora su un arduino UNo con IDE 1.0.
 Scavola di qualche hertz ( circa lo 0,15 % ) ma e' molto stabile
Logged

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

Code:
Ho già provato ad utilizzare questa libreria ma mi da un errore in fase di compilazione. Non capisco perchè!

Strano che ti dia errore. Per scrupolo l'ho provata ora ora su un arduino UNo con IDE 1.0.
 Scavola di qualche hertz ( circa lo 0,15 % ) ma e' molto stabile
Per curiosità, hai dovuto modificare i pin come credo di aver letto o l'hai provata così com'è?
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

Tuscany
Offline Offline
Edison Member
*
Karma: 77
Posts: 2110
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Cosi' com'e'. Con l'input sul Pin 5
Logged

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

fondamentalmente puoi provare a sostituire pulseIn con
Code:
tempo = micros();
while (HIGH ==digitalRead(pin)){;}
tempo = micros()-tempo;

la cosa ideale è sostituire digitalRead con le macro molto più veloci. Su linux alcune versioni di compilatori danno grossi problemi con la pulseIn
Logged

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

Pages: [1]   Go Up
Jump to: