Go Down

### Topic: Frequency Counter Library (Read 139748 times)previous topic - next topic

#### Yuliia_Sych #75
##### Jan 26, 2016, 12:39 am
Can you please explain me why preamplifier scheme has such view and why there is such transistor and what this scheme do with signal (I've make it in Workbench and the signal from generator just shifts under zero level) #76
##### Mar 04, 2016, 03:52 pm
In the FrequencyCounter::start() function use 1000 instead of 100 if you want to get the exact frequency in Hz. because when you write 100 in start function, it takes it in ms in library running at the back end and will calculate frequency for 100ms which obviously will be 1/10th of original frequency in Hz. Similarly using 10 in the start function will give you the frequency 1/100th of the original frequency in Hz. Hopefully you understands it now.

#### futurebird #77
##### Apr 28, 2016, 01:56 am
I just wanted to thank the developer for this library. It was very useful on the project I created today. I hacked a digital anemometer which produced a pulsing signal, then used it to create a formula to translate the signal into windspeed in km/h.

I started to try to write something like this myself thank god I found this!

#### gawnieg #78
##### Jul 28, 2016, 12:41 pm
Hello All

I am trying to use dc42's code to measure a low frequency speed from the flywheel of an internal combustion engine. The signal of interest is a 5V square wave in the order of 30 to 40Hz. However, using dc40's code there are rogue high values (50 to 60Hz) appearing which is completely throwing my speed control system.

I am using a servo motor to control the throttle angle based on speed to keep the speed at a setpoint, using a PID library. Would this be throwing the ISR timer? Can the two work together? Where are these rogue values coming from? They appear randomly, with every 20 to 40 seconds of running:

Code: [Select]
`#include <PID_v1.h> //include PID library in sketch#include <Wire.h>#include <Servo.h>#define ECU2_RESET 8 //was 3#define SERVO_PIN 9 //was 5#define OVERSPEED_PIN 10 //overspeed to master#define RELAY_PIN 11 //local overspeed relayvolatile unsigned long firstPulseTime;volatile unsigned long lastPulseTime;volatile unsigned long numPulses;unsigned long over_speed_setpoint = 50; //define an over speed setpoint (i.e 3000rpm) here in correct units = 3000rpm double speed_setpoint = 41 ; // see engine calcs overview for this calc. or onenote To Do sheet. 48000=2500rpm, 50000=2400rpmunsigned int sample_time = 100;unsigned long num_iterations;/////////////////////PID SETTINGS///////////////////////////////////////double Kp = 1.0; //was o.008double Ki = 0.7; // was 0.0022double Kd=0.0;////////////////////SERVO SETTINGS//////////////////////////////////////////////////double throttle_setpoint;    // variable to store the desired throttle angle - WHAT SHOULD THIS BE INITIALISED AT?? int throttle_sig; //whats set to the servo = (90-throttle_setpoint) calculated by map() functionServo myservo; //initalising servo as servo objectdouble freq_1=0; //variable for frequency readoutboolean engine_running = false; // this is false until the engine starter motor is engagedPID myPID(&freq_1, &throttle_setpoint, &speed_setpoint, Kp, Ki, Kd, DIRECT); //PID setup using speed avg //REVERSEvoid isr(){ unsigned long now = micros(); if (numPulses == 1) {   firstPulseTime = now; } else {   lastPulseTime = now; } ++numPulses;}void setup(){Serial.begin(9600);Serial.println("Setup Finished"); Serial.print("This  run we have :  ");Serial.print("Kp = ");Serial.print(Kp);Serial.print(" Ki = ");Serial.print(Ki);Serial.print(" Kd = ");Serial.print(Kd);Serial.print("Sample time = ");Serial.print(sample_time);Serial.print("Speed setpoint = ");Serial.println(speed_setpoint);pinMode(21, INPUT);     //input for the HES signaldigitalWrite(21,HIGH); // added to prevent floating values???pinMode(OVERSPEED_PIN, OUTPUT); //pin 4 will be HIGH when engine speed is too high and shutdown is required, LOW when ok to keep running.OVERSPEED PINpinMode(RELAY_PIN,OUTPUT); //pin 7 as local overspeed pindigitalWrite(OVERSPEED_PIN,LOW); //initailly set this to low to say that there is no overspeed on system intialisationdigitalWrite(RELAY_PIN,HIGH); //initailly set this to low to say that there is no overspeed on system intialisationmyservo.attach(SERVO_PIN);//attaching the servo to PIN 9. myservo.write(8);// setting inital value of 85 to get it started on idlemyPID.SetMode(AUTOMATIC); //this sets the PID algoithm to automatic, i.e. it will compute every loop}// Measure the frequency over the specified sample time in milliseconds, returning the frequency in Hzfloat readFrequency(unsigned int sampleTime){ numPulses = 0;                      // prime the system to start a new reading attachInterrupt(2, isr, RISING);    // enable the interrupt delay(sampleTime); detachInterrupt(2); return (numPulses < 3) ? 0 : (1000000.0 * (float)(numPulses - 2))/(float)(lastPulseTime - firstPulseTime); // if the number of pulses is less than 3, then 0, otherwise - }void loop(){  if(engine_running==true){    num_iterations++;  }  freq_1 = readFrequency(sample_time);if(freq_1 > 5 && engine_running == false && freq_1 < 1000){ //if the engine is cranking then the engine_running variable is set to on so the PID controller is activated  Serial.println("Engine is now running, ECU activated");  engine_running = true;        }  if(engine_running==true ){ //if closed loop control is need then the master controller will set pin 3 to HIGH AND the engine has started and the servo should be activated    myPID.Compute();//required for PID to work   throttle_sig=(int)map(throttle_setpoint, 0, 255, 6, 87);// remapping the PID controller output (0-255), set by the PID setoutput function in the setup to 90 to 0 i.e. 90 degrees throttle_setpoint is actually 0 degrees throttle angle ---23.05.2016 was 0,255,0,90 changed to 87 as was conking on start   myservo.write(throttle_sig); // this is writing the mapped PID output to the servo//      Serial.print("The PID OUTPUT is: ");   Serial.print(throttle_setpoint);   Serial.print("\t");//   Serial.print("The servo sig is: ");   Serial.print(throttle_sig);   Serial.print("\t");//   Serial.print("The speed is is: ");   Serial.print(freq_1);   Serial.print("\t");   Serial.print(freq_2);   Serial.print("\t");   Serial.println(millis());  }  if(freq_1 >= over_speed_setpoint){  Serial.println(freq_1);  digitalWrite(OVERSPEED_PIN,HIGH); //sending 5v signal to master to indicate overspeed  digitalWrite(RELAY_PIN,LOW);        Serial.println("OVERSPEED");    }  else {  digitalWrite(OVERSPEED_PIN,LOW);//telling master that there is no overspeed present  digitalWrite(RELAY_PIN,HIGH); //keeping local overspeed relay switched on as there is no issues  }}`

#### Atmoz22 #79
##### Sep 01, 2016, 07:23 pm
Hey,

I have to measure the netfrequenzy and i need a resolution of milli hertz 50.xxx Hz, is it possible to change the counter resolution that he will measure milli Hertz?

#### Freezin #80
##### Oct 05, 2016, 11:57 pm
Post 42 has a modified library for the Leonardo. As I go through the code it says it will measure the frequency on pin 12 of the Leonardo. Is there any way to change it so the input frequency can be on D5 or D11?

// hardware counter setup ( refer atmega32u4)
TCCR1A=0;                  // reset timer/counter1 control register A
TCCR1B=0;                    // reset timer/counter1 control register A
TCNT1=0;                    // counter value = 0

// set timer/counter1 hardware as counter , counts events on pin T1 ( arduino leonardo pin 12)
// normal mode, wgm10 .. wgm13 = 0

TCCR1B |=  (1<<CS10) ;//CLOCK ESTERNO su fronte di salita
TCCR1B |=  (1<<CS11) ;
TCCR1B |=  (1<<CS12) ;

#### anilpandeya12 #81
##### Jan 08, 2017, 08:57 am
#include <FreqCount.h>

void setup() {
Serial.begin(57600);
FreqCount.begin(1000);
}

void loop() {
tone(9,3100);    //Error in compiling when added this line in arduino Uno
if (FreqCount.available()) {
Serial.println(count);
}
}

#### loic_38 #82
##### Jan 10, 2017, 11:48 am
Hi All !

Since the 1.8.0 update, the fequency counter using interrupt doesn't work..
I have an Arduino.org M0 Board. Do you have the same problem with other boards ?

Code: [Select]
`void isr(){ unsigned long now = micros(); if (numPulses == 1) {   firstPulseTime = now; } else {   lastPulseTime = now; } ++numPulses;float readFrequency(unsigned int sampleTime){ numPulses = 0;                      // prime the system to start a new reading attachInterrupt(2, isr, RISING);    // enable the interrupt delay(sampleTime); detachInterrupt(2); return (numPulses < 3) ? 0 : (1000000.0 * (float)(numPulses - 2))/(float)(lastPulseTime - firstPulseTime); // if the number of pulses is less than 3, then 0, otherwise - }`

#### Luis_Barragan #83
##### Jan 10, 2019, 12:12 am
hola que tal...

estoy empezando un proyecto, modificando el contador de frecuencias, pero no tengo idea de como empezar.

les explico lo que quiero a ver si alguien me ayuda....

quiero contar la frecuencia de una señal analoga, guardadrla en una variable (x) y dividirla para dos  (x/2)

y reproducir el valor de la variable divida en forma de pulsos digitales

en otras palabras por cada dos pulsos analogicos se emita un pulso digital

#### ShantelJean #84
##### Apr 06, 2019, 02:18 am
Try this:

Code: [Select]
`// Frequency counter sketch, for measuring frequencies low enough to execute an interrupt for each cycle// Connect the frequency source to the INT0 pin (digital pin 2 on an Arduino Uno)volatile unsigned long firstPulseTime;volatile unsigned long lastPulseTime;volatile unsigned long numPulses;void isr(){  unsigned long now = micros();  if (numPulses == 0)  {    firstPulseTime = now;  }  else  {    lastPulseTime = now;  }  ++numPulses;}void setup(){  Serial.begin(19200);}// Measure the frequency over the specified sample time in milliseconds, returning the frequency in Hzunsigned int readFrequency(unsigned int sampleTime){  numPulses = 0;                      // prime the system to start a new reading  attachInterrupt(0, isr, RISING);    // enable the interrupt  delay(sampleTime);  detachInterrupt(0);  return (numPulses < 2) ? 0 : (1000000UL * (numPulses - 1))/(lastPulseTime - firstPulseTime);}void loop(){  unsigned int freq = readFrequency(1000);  Serial.println(freq);  delay(1000);}`
hie dc42 how can i use this code wch incoporates interrupts to measure frequency from an astable  555 timer circuit of of up to 100khz.

#### jb1055 #85
##### May 20, 2019, 03:22 pm
Hello,
I would like to measure a frequenze from 150kHZ with my Arduino Mega2560.
Do I Need a Spezial <FreqCounter.h> for the Adruino Mega?
I copied the Sketch from #2 but i get a lot of Errors. I quess i have the <FreqCounter.h> for the Arduino Uno
Thank you for helping.

Go Up