Go Down

Topic: frequenzimetro (Read 797 times) previous topic - next topic

MMatteo

Ho usato il seguente programma per calcolare la frequenza:

int sigPin = 47; //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);
  pinMode(DAC0, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  c = 0;

   t = micros(); // read time at start of sampling
   for(s=0; s<1000; 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 = micros() - 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 = 1000000*c/t; //calculate frequency
  analogWriteResolution(12);
  analogWrite(DAC0, map(f, 0, 1023, 0 ,4095));
  Serial.print(" , 12-bit PWM value : ");
  Serial.print(map(f, 0, 1023, 0 ,4095));

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


quello che non capisco e` perche` cambiando il valore di s, mi cambia anche la frequenza che mi legge ? io devo calcolare frequenze che arrivano a max 200 kHz. Uso questo programma perche` avendo arduino due non posso mettere le librerie FreqCount e FreqCounter; essendo il nuovo microcontrollore AT91SAM3X differente dagli altri microcontrollori ed ha registri timer counter diversi. Ho provato a cercare di modificare la libreria ma il nuovo microcontrollore ha pochissimi registri, qualcuno sa` come modificarla o farne una nuova con i registri del AT91SAM3X ?

tonid

Be,guardando quì
Code: [Select]
t = micros(); // read time at start of sampling
   for(s=0; s<1000; 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
   }

   }

usi la variabile s all'interno del ciclo for che a sua volta è usato per aumentare la variabile c e vista la formula usata per calcolare la frequenza
Code: [Select]
f = 1000000*c/t; //calculate frequency
riducendo il valore di s ad esempio s<500 la variabile c assumerà un valore pari alla metà rispetto al codice riportato sopra e di conseguenza anche la frequenza cambia.

MMatteo

Grazie Tonid,
però non hai considerato una cosa:
Se diminuisci il valore di s, ad esempio lo porti alla metà,
diminuisce proporzionalmente c, ma diminuisce anche t in proporzione,
quindi alla fine la f calcolata dovrebbe non cambiare...

tonid

Hai ragione ,scusa,avevo approfondito la cosa basandomi solo sulla formula ed il ciclo for. Effettivamente usi la micros() per calcolare il tempo trascorso dall'inizio della lettura alla fine e quindi il tuo discorso non fa una piega.
Ma la differenza di frequenza che leggi (variando come dicevi il valore di s )su che valori si aggira?

Go Up