Reading signal frequency

double frequency = F_CPU / (sum / count);

That's not the greatest piece of code. You may want to change it.

bubulindo:
Mainly to see if the libraries were interfering with the internal setup. Didn't you notice some headers missing?

Ooops, I didn't notice the OP was mixing lcd and Serial print()s :stuck_out_tongue: Taking away every (non-strictly necessary) lib and using only Serial.print()s is a good debugging suggestion.

thank you for the reply.....i try the code suggest by bubulindo and it seems the output still the same. The weird is when i try unconnected the signal input from pin 8, there is still output and the value is 49-50

comsat:
thank you for the reply.....i try the code suggest by bubulindo and it seems the output still the same. The weird is when i try unconnected the signal input from pin 8, there is still output and the value is 49-50

Then you should make sure pin 8 is the right one to use.

I'd scrap the speed calculation, put an "analogWrite" into "setup" on a spare PWM pin set to a 50% duty cycle, and see if you can measure the PWM frequency of around 490Hz by connecting the PWM pin to your input pin..

comsat:
... the output keep going around 49-51 and it not change although i change the frequency from the signal generator.

comsat:
... when i try unconnected the signal input from pin 8, there is still output and the value is 49-50.

It looks like pin 8, ICP1, the Input Capture pin for timer0/counter0, is open-circuited, and it sees only power frequency noise. An easy way to test this is to connect a high-value resistor - like maybe 100k - between pin 8 and either ground and VCC, ort turn on the internal pullup resistor for pin 8. If ICP1 has no signal connected, then FreqMeasure.available() should never return true. You'll probably want to add some diagnostic code to tell you that it doesn't ever come true, rather than simply waiting to see if nothing happens. Save millis() in setup, and after each look at FreqMeasure.available(), check to see if a second has passed; if it has, Serial.print() something to tell you so, and save millis() again.

Check your frequency generator. It may have a button that disconnects its output. If it's disconnected, all you have connected to ICP1 is an antenna to pick up noise.

the original code is from here

If you are measuring a signal with sufficient swing (that it will trigger a counter click), all you need is a small resistor + the mcu.

AWOL, yup I tried and it can read the 490 Hz.

It looks like pin 8, ICP1, the Input Capture pin for timer0/counter0, is open-circuited, and it sees only power frequency noise. An easy way to test this is to connect a high-value resistor - like maybe 100k - between pin 8 and either ground and VCC, ort turn on the internal pullup resistor for pin 8. [/quote]

tmd3, so, i should try connect resistor between pin 8 and ground is it and dont i have to feed with any signal? by the way, what is ort?

comsat:
... so, i should try connect resistor between pin 8 and ground is it and dont i have to feed with any signal?

Um, no. If you want to know something about a signal, like it's frequency, you'll certainly have to connect it. My recommendation is that you connect a resistor to either 5V or to ground, and connect the other end to ICP1, or pin 8 on an Arduino Uno. Then connect your signal between ICP1 and ground, as you normally would.

Here's what I suspect: For some reason - a broken lead, an in correct connection, a switch in the wrong position, or something, there's nothing at all connected to ICP1. That makes ICP1 a "floating input." The pin has a very high impedance to both ground and VCC, and it's not referenced to anything. In that state, it's much more susceptible to electromagnetic interference than it would be if it were connected to something. I suspect that what you're reading is not your input signal, but the frequency of electromagnetic fields caused by the electric power system. Your readings suggest that you live in a region where the power frequency 50 Hz. Tell us if that's correct.

The fact that you can read 490 Hz from a PWM pin supports this theory. I suspect that you didn't use the leads from your frequency generator to connect the PWM pin to ICP1. That means that both the frequency generator and its leads were out of the circuit. I suspect that one of them isn't doing what you think: either the lead is broken, or improperly connected, or the frequency generator is disconnected from the circuit - probably by a switch on the front panel.

By applying a resistor between ICP1 and a good logic level, like VCC or GND, you make the pin a lot more resistant to the effects of electromagnetic fields. Pick a high value resistor - like maybe 100K. Then, connect your signal between ICP1 and ground, and run your program. I suspect that you'll never get a reading, because the logic level on ICP1 will never change. If that's what happens, it supports my theory that the input isn't seeing the signal, or anything else. To see what the frequency measurement library does with an input that never changes - one whose frequency is zero - see your link - FreqMeasure Library, for Measuring Frequencies in the 0.1 to 1000 Hz range, or RPM Tachometer Applications - under the heading, "Zero Handling."

... what is ort?

"ort" is a word that I typed by mistake. I had intended to type "or".

I try to connect as u suggested but no luck. or is it possible because i connect wrong pin? i looked the code again and there is no mention about pin 8 as an input.

comsat:
... but no luck.

Be more specific. What were your results? Did you continue to measure about 50 Hz? Did you fail to get a reading at all?

... or is it possible because i connect wrong pin?

I can't see your connections. If you connected to the wrong pin, that would be an explanation. Maybe you're asking if pin 8 is the correct pin for this program to use - I'll suggest that you review the site you referenced in your original post - FreqMeasure Library, for Measuring Frequencies in the 0.1 to 1000 Hz range, or RPM Tachometer Applications - which states that pin 8 is the pin to use for the Arduino Uno. If you're not using an Uno, maybe you are indeed connected to the wrong pin. Which Arduino are you using?

... i looked the code again and there is no mention about pin 8 as an input.

There's no mention of any pin as an input. INPUT is the default state of the pins, so it's generally not necessary to explicitly set the mode to INPUT.

I don't see that you've answered the question about the power frequency at your location. Is it 50 Hz?

comsat:
I looked the code again and there is no mention about pin 8 as an input.

The input pin is hard-coded into the library, and is listed in the web page you linked. It says for Arduino you have to use pin 8.

sorry for the lack of input.....yes, when i try to connect as you suggested, the measurement still 50 Hz

i'm using arduino uno and by referring the link, i put the input at pin 8.....it just i'm not really familiar with arduino....so, for arduino, i dont have to set the mode to input is it.....

Please answer these questions:

  • Exactly how is the signal generator connected to the Arduino?
  • Is the signal generator's ground connected to the Arduino's ground?
  • What is the voltage of the signal generators output?
  • What is the power frequency at your location?
  • I can't tell, but I think that you might have connected a resistor to pin 8. What was the value of the resistance? What was the other end of the resistor connected to?

I suspect that you haven't connected the signal generator's ground to the Arduino's ground. Wait! Before you make that connection, you need to be sure that the signal generator is delivering a voltage that is friendly to the Arduino. That means that the signal voltage - the one that isn't ground - doesn't go lower than ground, or higher than VCC. If you can't tell, read the manual for the signal generator.

It seems to be difficult to get more than a small amount of information at a time, and what little there is isn't clear. Can you be a bit more forthcoming?

"Exactly how is the signal generator connected to the Arduino?"
"Is the signal generator's ground connected to the Arduino's ground?"
-the signal generator connected to the arduino at pin 8 and also the ground of the arduino.

"What is the voltage of the signal generators output?"
-i put voltage output from the signal generator is 30V peak to peak

"What is the power frequency at your location?"
-my location is australia and i check from the website, it say that 50 Hz. Is it the reason why my output 49-51Hz. means the arduino not reading the signal at right right

"I can't tell, but I think that you might have connected a resistor to pin 8. What was the value of the resistance? What was the other end of the resistor connected to?"
yes, i connected the resistor and the value i used as you suggested which is 100k ohm. i connect the resistor to pin 8 and the other to ground. and i also tried to Vcc as well. the output still the same

by the way, how i can make quote only for certain sentence. its like when i click insert the quote, they quote everything.

-i put voltage output from the signal generator is 30V peak to peak

A 30V input to a 5V device? And, what appears to be AC, too.

When you get a new Arduino, having toasted the one you have, don't do that. Pay some attention to what the Arduino can, and can not, handle.

how i can make quote only for certain sentence. its like when i click insert the quote, they quote everything.

Highlight the sentence, copy to clipboard, hit the quote icon on the tool bar (to the right of the # icon) and paste between the quote tags that appear

A 30V input to a 5V device? And, what appears to be AC, too.

sorry....not 30V but 30mV

sorry....not 30V but 30mV

30mV is just as bad. That is too low. The Arduino needs 3.0V or more to be recognized as HIGH, on a 5V device.

Well, not quite just as bad, as 30mV won't damage the Arduino.

It sounds like your signal generator's output is not connected to the Arduino. Here's why:

  • You consistently get a frequency reading close to 50 Hz. That's the power frequency at your location. That result is consistent with the notion that you have no signal connected to pin 8, and that the voltage on pin 8 is being affected by the electromagnetic fields generated by parts of the power system close to the Arduino.
  • When you connect to a PWM output, you get the expected results. That certainly suggests that pin 8 hasn't been damaged in your experiments.

Here's a warning:

  • Be careful in fiddling with the output of the frequency generator. While 30mV is indeed too low to be sensed reliably by a digital input, it's likely that the output is an AC signal that goes both negative and positive with respect to ground. At a reasonable output level, the positive half-cycle won't hurt anything, but the negative half-cycle will try to drive the voltage at pin 8 below ground. There's a bit of protection on that pin inside the microcontroller, but it's not sophisticated, and it's not particularly robust. You will need to be certain that the output of the signal generator doesn't go below ground. If you can't persuade it to give you an appropriate DC offset, you'll have to add some level-shifting circuitry, an optocoupler, or something like that.

You'll get better results if your signal generator produces a square-wave.

More questions:

  • What's the model number of your signal generator? I ask because I suspect that there may be a switch on the front panel that disconnects the output, and it may be in the disconnected position.
  • Do you have confidence in the leads connected between the signal generator and the Arduino? If you have an ohmmeter, please verify that your leads are continuous.
  • What's the output frequency setting of the signal generator?

Try this:

  • Connect a 10K resistor between pin 8 and ground. It's possible, but not likely, that the 50 HZ noise is so intense that it can overwhelm a 100K resistor. A 10K should certainly overwhelm any reasonable noise. If you still read 50 Hz with a 10K resistor connected, and the signal generator disconnected, there's something fishy going on.