For the pressure sensor labs, I’m thinking of building a homemade shaker table that can be driven from a function generator. I bought a Dayton Audio TT25-16 PUCK tactile transducer for $11. Interestingly, Zikoss’s e-bay price is lower than their price on their own web site—I’ve not checked whether shipping charges differ. The Puck is basically a loudspeaker, but instead of a cone to move air efficiently, it has a mass that it moves. The idea is that shaking the mass causes the case of the Puck to shake in reaction, and the case is firmly screwed to the frame of a sofa or chair and shakes the person sitting in the chair. These devices are also called “bass shakers” and are routinely used in hobbyist home-theater setups. The Puck was the cheapest one I could find. I plan to mount it on a piece of plywood sitting on large rubber feet to make a cheap shaker table.

It takes a lot of power to shake large objects, and I’m still waiting for the 20W LP-2020A+ Lepai Tripath 20W amplifier to arrive, but in the meantime I decided to characterize the impedance of the transducer using the same setup I used for characterizing Ag/AgCl electrodes.

I’ve never quite understood how loudspeakers could be characterized as 8Ω or 4Ω (the Puck is nominally 16Ω), since the device is basically a coil of wire, which should be an inductor, not a resistor. I thought about this a bit and realized that the wire is long enough to have substantial resistance, and we could characterize the loudspeaker as a resistor in series with an inductor. At low frequencies, this behaves like the resistor, and at high frequencies like the inductor. If the frequency of the knee at is high enough, then this would be close enough to a constant resistance for practical purposes.

I tried modeling the Puck with this very simple model (knowing that it wasn’t adequate, because I’d done some more reading):

In reading specs for loud speakers, I found frequent reference to a frequency f_{s}, which I did not know the significance of, so I read the Wikipedia article on Electrical characteristics of dynamic loudspeakers. Because the voice coil is a mechanical system consisting mainly of a mass on a spring, there is a mechanical resonance at the frequency , which can be observed as an increase in the impedance of the voice coil around that frequency.

Knowing about the resonant peak, I looked for it in the data and gathered more data points around the peak. (The plot above uses all the data points.) Because the peak can be quite narrow, it is necessary to measure at frequencies clustered pretty close to the peak to get the shape right.

We can model this resonance as a parallel connection of a capacitor, an inductor, and a resistor, all added in series with our basic R+L model. The parallel resistor represents damping of the mechanical oscillator—a small resistance would damp the oscillation and reduce the resonant peak. In electrical terms, at the resonant frequency the R||L||C circuit behaves just like the resistor alone, but at very low or very high frequencies, the parallel circuit acts like a short circuit (0 impedance).

To improve the model further, I needed to improve the high end fit, by using an extra resistance and inductance.

Although the fit is better with 2 inductors, it is still not great. I should be able to do even better with 3 inductors and resistors.

Because the plots above don’t show the details around the resonance peak very well, I made a detailed plot from 10 Hz to 300 Hz:

The specs I found online suggested that the usable frequency range of the Puck is 20–80Hz and that f_{s} was 40Hz. I’m seeing a much lower f_{s} around 24Hz. I have no idea how the “usable frequency range” is determined for a bass shaker, since it is clearly not where the impedance is fairly flat, which would be about 26–160Hz. Perhaps the low end is determined by where the power needed to feel the shaking exceeds what the puck can withstand without burning out.

I should probably redo the characterization once I mount the puck on the shaker table, since the resonance of the plywood may affect the mechanical resonance peak.

Here are the gnuplot scripts for the fitting

set xrange[*:*] set yrange [*:*] j=sqrt(-1.0) zpar(z1,z2) = z1*z2/(z1+z2) zc(c,f) = 1/(j*2*pi*f*c) zl(L,f) = j*2*pi*f*L z_known(f)=zpar(24000, zc(4.7e-6,f)) ohmic(f) = 10.0 lr(L1,R1,f) = abs(zl(L1,f)+R1) lrlr(L1,R1,L2,R2,f) = abs(zpar(zl(L1,f),zl(L2,f)+R2)+R1) lrlrc(L1,R1,Ls,Rs,Cs,f) = abs(zl(L1,f)+R1+zpar(Rs,zpar(zl(Ls,f),zc(Cs,f)))) lr2lrc(L1,R1,L2,R2,Ls,Rs,Cs,f) = abs(zpar(zl(L1,f),zl(L2,f)+R2)+R1+zpar(Rs,zpar(zl(Ls,f),zc(Cs,f)))) lr3lrc(L1,R1,L2,R2,L3,R3,Ls,Rs,Cs,f) = abs(zpar(zl(L1,f),R2+zpar(zl(L2,f),R3+zl(L3,f)))+R1+zpar(Rs,zpar(zl(Ls,f),zc(Cs,f)))) R1=17 L1=0.001 fit log(abs(ohmic(x)/lr(L1,R1,x))) 'puck-10-table' using 1:(log($2/$3)) via L1 fit log(abs(ohmic(x)/lr(L1,R1,x))) 'puck-10-table' using 1:(log($2/$3)) via R1 fit log(abs(ohmic(x)/lr(L1,R1,x))) 'puck-10-table' using 1:(log($2/$3)) via L1,R1 R1_lr=abs(R1) L1_lr=abs(L1) R1=17 L1=0.001 Rs=14 Ls=0.005 Cs=0.009 fit [10:200] log(abs(ohmic(x)/lrlrc(L1,R1,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via Ls,Cs Ls=abs(Ls) Cs=abs(Cs) fit [10:200] log(abs(ohmic(x)/lrlrc(L1,R1,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via Ls,Cs,Rs, R1 Ls=abs(Ls) Cs=abs(Cs) fit log(abs(ohmic(x)/lrlrc(L1,R1,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via L1, R1 L1=abs(L1) fit [10:200] log(abs(ohmic(x)/lrlrc(L1,R1,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via Ls,Cs,Rs, R1 Ls=abs(Ls) Cs=abs(Cs) fit log(abs(ohmic(x)/lrlrc(L1,R1,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via Ls,Cs,Rs, L1,R1 L1=abs(L1) R1_lrlrc=abs(R1) L1_lrlrc=abs(L1) Rs_lrlrc=abs(Rs) Ls_lrlrc=abs(Ls) Cs_lrlrc=abs(Cs) R2=180 L2=0.0015 fit log(abs(ohmic(x)/lr2lrc(L1,R1,L2,R2,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via L2,R2 L2=abs(L2) fit [10:200] log(abs(ohmic(x)/lr2lrc(L1,R1,L2,R2,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via Ls,Cs Ls=abs(Ls) Cs=abs(Cs) fit [10:200] log(abs(ohmic(x)/lr2lrc(L1,R1,L2,R2,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via R1,Rs fit log(abs(ohmic(x)/lr2lrc(L1,R1,L2,R2,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via L1,R1,L2,R2 fit log(abs(ohmic(x)/lr2lrc(L1,R1,L2,R2,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via L1,R1,L2,R2,Ls,Cs,Rs R1_lr2lrc=abs(R1) L1_lr2lrc=abs(L1) R2_lr2lrc=abs(R2) L2_lr2lrc=abs(L2) Rs_lr2lrc=abs(Rs) Ls_lr2lrc=abs(Ls) Cs_lr2lrc=abs(Cs) R3=300 L3=0.0005 fit [10:200] log(abs(ohmic(x)/lr3lrc(L1,R1,L2,R2,L3,R3,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via Ls,Cs Ls=abs(Ls) Cs=abs(Cs) fit [10:200] log(abs(ohmic(x)/lr3lrc(L1,R1,L2,R2,L3,R3,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via Ls,Cs,Rs,R1 Ls=abs(Ls) Cs=abs(Cs) fit log(abs(ohmic(x)/lr3lrc(L1,R1,L2,R2,L3,R3,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via L1,R1 L1=abs(L1) fit log(abs(ohmic(x)/lr3lrc(L1,R1,L2,R2,L3,R3,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via L2,R2 fit log(abs(ohmic(x)/lr3lrc(L1,R1,L2,R2,L3,R3,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via L3,R3 fit log(abs(ohmic(x)/lr3lrc(L1,R1,L2,R2,L3,R3,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via Ls,Cs,Rs,R1 Ls=abs(Ls) Cs=abs(Cs) fit log(abs(ohmic(x)/lr3lrc(L1,R1,L2,R2,L3,R3,Ls,Rs,Cs,x))) 'puck-10-table' using 1:(log($2/$3)) via L1,L2,R1,R2,L3,R3,Ls,Rs,Cs

the detail plot (the other plots are similarly done)

load 'fit-puck-10.gnuplot' set title "Magnitude of impedance for Puck tactile transducer (detail of resonance)" set xlabel "frequency [Hz]" set ylabel "impedance [ohms]" set xrange[10:300] set yrange [*:*] set logscale xy unset parametric unset label # set label sprintf("%.3g ohm + (%.3g ohm || %.3g H || %.3g F)", R1,Rs,Ls,Cs) at 15,500 # set label sprintf(" + (%.3g H || (%.3g ohm + (%.3g H || (%.3g ohm + %.3g H))))", L1,R2,L2,R3,L3) at 15,400 set key top left reverse Left spacing 2.1 samplen 2 font "" set samples 800 plot 'puck-10-table' using 1:(abs($3/$2*ohmic($1))) notitle, \ lr(L1_lr,R1_lr,x) lt 2 title sprintf("%.3g ohm + %.3g H", R1_lr,L1_lr),\ lrlrc(L1_lrlrc,R1_lrlrc,Ls_lrlrc,Rs_lrlrc,Cs_lrlrc,x) lt 3 title \ sprintf("%.3g ohm + %.3g H + (%.3g ohm || %.3g H || %.3g F)", R1_lrlrc,L1_lrlrc,Rs_lrlrc,Ls_lrlrc,Cs_lrlrc),\ lr2lrc(L1_lr2lrc,R1_lr2lrc,L2_lr2lrc,R2_lr2lrc,Ls_lr2lrc,Rs_lr2lrc,Cs_lr2lrc,x) lt 4 title \ sprintf("%.3g ohm + (%.3g H ||(%.3g ohm + %.3g H) + (%.3g ohm || %.3g H || %.3g F)", \ R1_lr2lrc,L1_lr2lrc,R2_lr2lrc,L2_lr2lrc,Rs_lr2lrc,Ls_lr2lrc,Cs_lr2lrc),\ lr3lrc(L1,R1,L2,R2,L3,R3,Ls,Rs,Cs,x) lt 1 title \ sprintf("%.3g ohm + (%.3g H ||(%.3g ohm + (%.3g H ||(%.3g ohm + %.3g H)) + (%.3g ohm || %.3g H || %.3g F)", \ R1,L1,R2,L2,R3,L3,Rs,Ls,Cs)

and the raw data

# series connection of Dayton Audio TT25-16 PUCK tactile transducer # in series with 10.0 ohm resistor # driven by AC-coupled function generator # measured with Fluke 8060A # 2012 sept 6 # frequency mv across 10 mv across Puck 11.75 23.94 36.15 11.59 23.85 36.0 115.71 23.67 38.25 1145.4 23.51 66.06 11493 22.21 245.5 197300 5.49 480.5 20590 21.17 337.0 2059 23.24 84.87 209.3 23.45 41.20 20.94 23.52 38.3 45.42 23.47 35.99 455.7 23.31 45.38 4421 22.84 134.53 43950 18.91 463.1 141370 9.09 534.1 174270 6.89 497.3 16.07 24.18 36.93 28.56 24.02 37.8 34.67 23.75 36.8 47.38 23.72 36.3 75.65 23.53 36.70 82510 13.90 534.7 8410 22.16 198.85 26.83 24.19 40.83 29.04 24.07 37.75 18.14 23.89 36.8 24.934 23.47 56.9 24.08 23.15 69.80 23.50 23.27 61.6 22.83 23.35 49.7 22.30 23.35 43.1 24.51 23.07 65.4 329.4 23.29 42.36 766.9 23.08 53.35 7342 22.27 184.21 2979 22.88 104.83 23.65 23.85 67.2 13.65 23.81 36.17 25.49 24.17 45.3 25.07 23.76 48.6 250.9 23.49 41.54 2459 23.21 94.89 160.46 23.50 40.40 604.8 23.29 49.61 5822 22.67 161.11 1615.7 23.20 80.45 59.55 23.44 36.46

I’m under the assumption that the 8 ohms that characterizes a speaker is its impedance at 1KHz — but I did a quick search and didn’t find any source that could back that up. If I find a reliable source, I’ll pass it on.

Comment by Mylène — 2012 September 14 @ 13:29 |

I did a fair amount of reading, and the nominal impedance is sort of an average over the region where the impedance doesn’t vary much with frequency. That is, above the resonance at Fs and below the frequency where the loudspeaker start acting like an inductor. Tweeters and subwoofers may have the impedance values checked at different frequencies, since they are used at different frequencies. The number you suggest, 1kHz should be a reasonable place to check impedance for mid-range speakers and tweeters, but may be too high a frequency for subwoofers and bass shakers, which aren’t used above about 100Hz.

In my measurements of the Puck, the 16Ω nominal impedance seems pretty good in the intended frequency range (30–100Hz), but at 1kHz the impedance is more like 27Ω.

The best writeup I’ve seen is on Wikipedia: http://en.wikipedia.org/wiki/Electrical_characteristics_of_dynamic_loudspeakers

Comment by gasstationwithoutpumps — 2012 September 14 @ 13:46 |

[…] is the model I had before (in the post Characterizing tactile transducer) for the Puck unmounted and sitting on a thin piece of foam rubber on my benchtop: Model of Puck […]

Pingback by Characterizing tactile transducer again « Gas station without pumps — 2012 September 15 @ 22:13 |

[…] Characterizing tactile transducer […]

Pingback by Rethinking the pressure sensor lab « Gas station without pumps — 2012 October 23 @ 17:27 |