element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • About Us
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Arduino
  • Products
  • More
Arduino
Arduino Forum Measure square wave frequency
  • Blog
  • Forum
  • Documents
  • Quiz
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Arduino to participate - click to join for free!
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • Replies 29 replies
  • Subscribers 396 subscribers
  • Views 4425 views
  • Users 0 members are here
  • square
  • arduino
  • frequency
Related

Measure square wave frequency

Former Member
Former Member over 11 years ago

Hello,

 

I'm working with the Arduino Due ans I used the following code:

 

// period of pulse accumulation and serial output, milliseconds

#define MainPeriod 100

long previousMillis = 0; // will store last time of the cycle end

volatile unsigned long duration=0; // accumulates pulse width

volatile unsigned int pulsecount=0;

volatile unsigned long previousMicros=0;

 

void setup()

{

  Serial.begin(19200);

  attachInterrupt(6, myinthandler, RISING);

}

 

void loop()

{

  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= MainPeriod)

  {

    previousMillis = currentMillis;  

    // need to bufferize to avoid glitches

    unsigned long _duration = duration;

    unsigned long _pulsecount = pulsecount;

    duration = 0; // clear counters

    pulsecount = 0;

    float Freq = 1e6 / float(_duration);

    Freq *= _pulsecount; // calculate F

    // output time and frequency data to RS232

    Serial.print(currentMillis);

    Serial.print(" "); // separator!

    Serial.print(Freq);

    Serial.print(" ");

    Serial.print(_pulsecount);

    Serial.print(" ");

    Serial.println(_duration);

  }

}

 

void myinthandler() // interrupt handler

{

  unsigned long currentMicros = micros();

  duration += currentMicros - previousMicros;

  previousMicros = currentMicros;

  pulsecount++;

}

 

to measure the frequency.

 

I can measure frequencies higher than 1.5kHz accurately, but I can't seem to measure lower frequencies.

 

How can I measure lower frequencies, say 400Hz and above?

 

Thanks.

  • Sign in to reply
  • Cancel

Top Replies

  • jw0752
    jw0752 over 11 years ago +1
    Hi Matt, I don't know about this situation but usually sampling over a longer time period will improve accuracy. John
  • D_Hersey
    D_Hersey over 11 years ago in reply to jw0752 +1
    John is right, there I said it! You might be able to get more accurate timing by latching the wdt upon interrupt. Reset the Arduino Due board using the watchdog - Arduino Forum
  • Former Member
    Former Member over 11 years ago in reply to D_Hersey +1
    I tried setting mainPeriod to be longer but it still didn't measure accurately lower frequencies. Regarding the wdt , I don't understand how can it help, can you elaborate? thanks.
Parents
  • ravi_butani
    ravi_butani over 11 years ago

    // mills() reference http://arduino.cc/en/Reference/millis
    // attachinterrupt() reference http://arduino.cc/en/Reference/attachInterrupt
    // Due pin 0,1,2 corresponding to pin interrupt 0,1,2 respectively
    // All the best from RAVI BUTANI
    // this code measures frequency only accurate for >100Hz
    // for less frequency minor modifications needed
    
    
    unsigned long time_stamp;
    unsigned int count0 = 0;
    unsigned int count1 = 0;
    unsigned int count2 = 0;
    
    
    unsigned int output0 = 0;
    unsigned int output1 = 0;
    unsigned int output2 = 0;
    
    
    void setup()
    {
      Serial.begin(9600);
      time_stamp = millis();
      attachInterrupt(0, sensor0, RISING); // sensor 1 on mega pin no 2 Due pin 0
      attachInterrupt(1, sensor1, RISING); // sensor 2 on mega pin no 3 Due Pin 1
      attachInterrupt(2, sensor2, RISING); // sensor 3 on mega pin no 21 Due Pin 2
    }
    
    
    void loop()
    {
      if(millis() - time_stamp > 50)
      {
        detachInterrupt(0); // disable interrups
        detachInterrupt(1);
        detachInterrupt(2);
        output0 = count0 * 20;
        output1 = count1 * 20;
        output2 = count2 * 20;
        Serial.print("Sensor0 Reading = ");
        Serial.println(output0);
        Serial.print("Sensor1 Reading = ");
        Serial.println(output1);
        Serial.print("Sensor2 Reading = ");
        Serial.println(output2);
        delay(40);
        count0 = 0;
        count1 = 0;
        count2 = 0;
        time_stamp = millis();
        attachInterrupt(0, sensor0, RISING); // we have done with this mesasurenment,enable interrups for next cycle
        attachInterrupt(1, sensor1, RISING);
        attachInterrupt(2, sensor2, RISING);
      }
    }
    
    
    void sensor0()
    {
      count0++;
    }
    
    
    void sensor1()
    {
      count1++;
    }
    
    
    void sensor2()
    {
      count2++;
    }

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Former Member
    Former Member over 11 years ago in reply to ravi_butani

    Thanks for your reply.

     

    I tried that, it measures 1500Hz and higher quite accurately but anything below it and it fails.

     

    Do you know what else can be done to fix this?

     

    Thanks again.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Robert Peter Oakes
    Robert Peter Oakes over 11 years ago in reply to Former Member

    did you checkout the spark fun link I provided, what was the result

     

    Thanks

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Reply
  • Robert Peter Oakes
    Robert Peter Oakes over 11 years ago in reply to Former Member

    did you checkout the spark fun link I provided, what was the result

     

    Thanks

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Children
  • Former Member
    Former Member over 11 years ago in reply to Robert Peter Oakes

    Thanks for that, but as far as I know this library is not compatible with the Due, right?

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Robert Peter Oakes
    Robert Peter Oakes over 11 years ago in reply to Former Member

    So in short, yes you can do it, I have done it before, a while back. I wont be able to investigate until the weekend though

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube