Let's Make Robots!

ADC and strange readings

Hello guys,

I ran this sketch that would simply read an ADC port and print it out to my pc. It went just fine and results were pretty consistent, something like: 300 300 300 300 300 299 300 300 299 300 300 and so on....

But when I use Serial.print(analogRead(whatever_pin)); in a larger sketch, results are very different, something like: 300 290 305 288  310 315 306 296 and so on. This "larger" sketch has 3 interrupt service routines, and the hardware setup has 3 different chips and a loudspeaker.

I am not really sure why that happens. Is it software related (interrupt service routines ---> make the analogread lag?) or is it hardware related (lots of noise coming from chips ---> intereferes with readings)? Oh btw, i don't know if this really matter, but i am using pull up resistors on those pins (pinMode = input, digitalwrite = high) and i'm connecting "thing that gives the reading" between the ADC pin an GND.


Thank you!

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Like Robofreak and his Sharps, you could use a scope to confirm any fluctuations in the voltage levels. Or exclude that as a possibilty.

I have had mixed experiences with soundcard/software scopes lately. But a ripple in an otherwise steady voltage should be pretty easy to find.

My first suspect would be the speaker. Easy enough to eliminate, I suppose.

It is slightly possible that you are getting noise from your unused analog pins. You can use the internal pullups for the Arduino by setting the unused analog pins high.

digitalWrite(A0, HIGH);  // set pullup on analog pin 0

Most people don't have a problem leaving the unused pins floating, but it is something you can try if your problem is not eliminated by the other steps that have been suggested. It only costs you a few lines of code to set them high. I have also read that setting your unused lines high can reduce your power consumption. See link below.





@ignoblegnome: already had all analog pins set to HIGH, but thanks for the tip :=)

After further experiments i have come to the conclusion that when audio is being played there's a lot of noise. Calling the same "check_adc" routine when there's no sound gives consistent results. What could i do? Should i put a cap between the + and - of the speaker just like we do for motors, or shall i isolate/shield the ADC somehow?

How is the speaker wired up to the MCU? How big is it? What kind of power are we talking about? The last thing you want is to short out the AC signal that IS your audio. That may be what you're suggesting.

MCU ---> DAC ---> AMP ---> speaker 

that's how everything's wired up. Then i just connect the adc pin to a potentiometer. The speaker is 8 ohm 0.5W, DC current.

No capacitor in series to the speaker?

nope. The amp's datasheet showed the speaker directly connected to the amp. It's a TDA7052

Ok, I see in some schematics the capacitor in serie to the amplifier, like here:

But I'm not sure if this got something to do with your problem. Without a scope it's hard to say what goes wrong.


Oh, so you're saying that all this noise generated by speaker/amp is not normal? I thought it was just ok and was searching for a way to shield the adc pins. Ok then, i'll see if i can fix the amp somehow, and i'll try to follow the above schematic strictly to see if it gets better. Thanks!


I don't know if this has anything to do with your problem, but the reason you normally put a cap in series with an audio speaker is to drop the DC voltage. The cap effectively blocks the DC, but lets AC (your audio signal) through. You should use a non-polarized cap on either of the speaker connections.

It seems unlikely to me that your speaker is causing interference with the microprocessor through the amp.