Looking for guidance in frequency measurement

Oh -- In your #22 code you had pin 8 connected to pin 7, but since pulseIn() blocks, pin 8 isn't getting toggled while pulseIn was waiting for a cycle.

I'd suggest a non-blocking reader (like FreqMeasure or FreqCount) and a non-blocking toggler like:

void pinUsToggler(uint32_t interval) {
  const byte pin = 8;
  static uint32_t last = 0;
  static byte pinState = LOW;
  if (micros() - last >= interval) {
    pinState = pinState != LOW ? LOW : HIGH;
    digitalWrite(pin, pinState);
    last += interval;
  }
}
...

void loop(void){
   ...
   pinUsToggler(25000);
   ...
}

Here's some code I was trying in Wokwi:

// WokwiMegaScope setup: https://wokwi.com/projects/390819455604080641
// for https://forum.arduino.cc/t/looking-for-guidance-in-frequency-measurement/1232046
#include <FreqCount.h> // https://www.pjrc.com/teensy/td_libs_Count.html
#include <FreqMeasure.h> // https://www.pjrc.com/teensy/td_libs_FreqMeasure.html

// wiring
const byte MeasurePin = 49; // ICP4 on a Mega // doesn't work on Wokwi
const byte CountPin = 47; // T5 on a Mega
const byte TonePin = 13; //

// measure vars
unsigned long count = 0;
unsigned long sum = 0;

// the setup function runs once when you press reset or power the board
void setup() {
  Serial.begin(115200);
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  FreqMeasure.begin(); //
  FreqCount.begin(1000); // 1000ms

  Serial.print("FreqMeasure on pin ");
  Serial.print(MeasurePin);
  Serial.print("FreqCount on pin ");
  Serial.print(CountPin);
  // tone(TonePin,1000);
  pinMode(TonePin, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  if (FreqMeasure.available()) {
    // Won't work on Wokwi because ICP not implemented
    // average several reading together
    sum = sum + FreqMeasure.read();
    count = count + 1;
    if (count > 30) {
      float frequency = FreqMeasure.countToFrequency(sum / count);
      Serial.println(frequency);
      sum = 0;
      count = 0;
    }
  }
  if (FreqCount.available()) {
    unsigned long count = FreqCount.read();
    Serial.print(" Count:");
    Serial.println(count);
  }
  pinUsToggler(25000);
}

void pinUsToggler(uint32_t interval) {
  const byte pin = TonePin;
  static uint32_t last = 0;
  static byte pinState = LOW;
  if (micros() - last >= interval) {
    pinState = pinState != LOW ? LOW : HIGH;
    digitalWrite(pin, pinState);
    last += interval;
  }
}

using MegaScope - Wokwi ESP32, STM32, Arduino Simulator plus some extra connections:

1 Like