Piezo amplifier random behaviour


Im trying to make piezo working with arduino to read very little vibrations.
Piezo can detect these vibrations but changes in voltage are very small (0.1- 0.8 mV). So I tried to connect it with op amp and dc voltage bias to be able to detect it on arduino. That is my schematics:

I would like to amplify those .x milivolts by 1000 times to have reasonable reading on arduino. I have encountered many problems with that and spent hours trying different configurations with op amp and everytime I try I have different results. So here's what I was doing and what i measured:

  1. I build schematics on breadboard with Rf = 10kohm and R3 = 1kOhm. Everything worked, my 0.x voltage changes became x mv changes.

2)I did the same but with 100kOhm as Rf resistor and again everything was fine.

3)I did the same but with 1MOhm as Rf resistor and I started to have problems. I had constant 2.3 V output and sensitivity was really same as with 100kOhm resistor.

  1. So I put 500kOhm resistor and I got 0.9 V as constatnt output and it seemed to be working fine beside that "resting" output beeing high. But after measuring few times output was constantly and slowly growing to 5V. When I disconnected battery from op amp and plug it again output was again 0.9V and stable but after few measserement it was growing again. Why is that?

  2. After few trials suddenly output was stable at 0.4V but sensitivity was terrible. Even with high pressure put on piezo voltage barely changes as if it wasn't amplyfiyng.

  3. I connected 100kOhm resistor again and it had very unstable output constantly changing between 0.9V and 1.5V. Also sensitivity was the same as with 10kOhm resistor and not 100kOhm.

  4. So I connected 10kOhm resistor and had stable output at 0.4V but it wasn't amplifying at all. I had same voltage directly from piezo as after op amp.

8 ) I changed op amp as I thought something broke but it was the same

  1. I connected 100kOhm again and it was amplifying alright this time and had stable 1.3 output but after every touch of piezo it changed resting output to different value like 0.9V or 0.4V.

  2. I connected 500kOhm Resistor and nothing changed

I tried many times more and I always have different results. Like there is constant 0.9 V output and I unplug und plug battery again voltage changes to 2.5V.

Everytime I checked if the circuit is all right, if there's undesired resistors contact and etc.

What may be a reason of such random behaviour?
Why amplifying doesn't change when I change resistor sometimes?
Also is amplifying by 1000x possible?

OP's schematic, posted properly.
-The output circuit is wrong, and will subject the Arduino input to damaging overvoltage.
-R1 should be much larger.
-The LM386 is not an operational amplifier. It is an audio amplifier. Use a decent op amp.
-There are no decoupling capacitors on the power connections.

Better output bias circuit:



Thank You for reply.

So I did:
-put 1MOhm resistor instead of 100 Ohm.
-put decoupling capacitor as you said.

About op amp I'm sorry but I have normal op amp which is lm358p. Number is worn down and I misread it. Sorry.

Lastly I know output voltages are to high and will destroy arduino, but I read voltage with multimeter for now so I didn't made it properly but to check if it works.


  • When I put 500kOhm resitor as Rf output voltage is amplified by about 10x and should be 500x.
  • changing resistor to 100kOhm or 10kOhm changes nothing

Try lowering the value of the 1uF decoupling capacitor.
Try 0.1uF or 0.47uF to see if the offset is lower.

Also some 0.1uF caps from +9v to gnd and -9v to ground on your opamp supply batteries.

What is the application, what frequency are you trying to detect vibrations?

Thanks.. Tom.. :slight_smile:

  1. Expecting any opamp stage to function with a gain of more than 100x is asking for difficulties - don't expect it to work well except at low frequencies, and you may have to take measures with extra supply decoupling to prevent instability.

  2. piezo's are basically current sources, not voltage sources, the most appropriate choice of amplifier circuit is a transimpedance amp, not a voltage amp. Transimpedance amplifier - Wikipedia

  3. Loading the piezo with 100 ohms is basically shorting it out (from a voltage perspective). 1M is much more reasonable load to use if you are wanting to voltage-amplify.

  4. The output current of a piezo sensor in a particular application is likelt to be limited, if its below a mA or so it cannot damage a CMOS input protection diode. Try measuring the AC current?

  5. What are R4 and R5 for? They will overload the opamps output stage - as a rule of thumb 2k is the minimum load impedance you should present to an opamp unless the datasheet says different.

Lastly I know output voltages are to high and will destroy arduino, but I read voltage with multimeter for now so I didn't made it properly but to check if it works.

Is the vibration fairly-constant? A multimeter won't accurately read short-term "spikes". You might get something like an average but multimeters are made to read constant (or slowly-changing) AC sine waves or DC. For example, a multimeter is bad for reading regular audio (voice or music).

The Arduino is even trickier... It "samples" the voltage at one instant in time (usually in a loop). That makes a constant AC voltage "look random", except higher voltages will have a wider range of voltages. It also means that you can miss a short impulse (like if you are using a piezo to detect a drum-hit).

Typically you can find the peaks (but remember you won't sample every peak), or you can calculate RMS, or take an average of the absolute values or an average of the positive-readings (after subtracting the bias). (The average of an AC waveform is zero so the true-average isn't helpful.)

Even with high pressure put on piezo voltage barely changes as if it wasn't amplyfiyng.

A piezo puts-out a voltage while being flexed. Constant pressure won't do anything. You'll get a voltage when the pressure is applied and the opposite voltage when the pressure is released.

[u]Over-voltage protection circuits[/u] If your op-amp has positive & negative supplies, you should protect against any voltage above +5V and ANY negative voltages. (Increase the current limiting resistor to between 1K and 10K.)

What are you detecting.
A simple 1" piezo disk with 1Megohm resistor across, directly connected to an analogue pin, with 1.1voltAref enabled in code, is very very sensitive and can detect a pin dropped on a desk.
You might not need that opamp. Just the right code.