Gas station without pumps

2012 September 13

Characterizing tactile transducer

Filed under: Circuits course — gasstationwithoutpumps @ 11:34
Tags: , , , , , , ,

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 R/(2 \pi L) 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):

Simple fit of a resistor in series with an inductor. The “Bode plot” is a straight line approximation that assumes that the resistance is all that matters up to the frequency of the pole of the LR circuit, and that the inductance is all that matters after that. We can see that the simple LR model is not a good fit.

In reading specs for loud speakers, I found frequent reference to a frequency fs, 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 \frac{1}{2 \pi}\sqrt{\frac{k_s}{m}}, 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).

Model for the Puck mini bass shaker. L1 and R1 are the basic model for the voice coil, while Rs, Cs, and Ls model the mechanical resonance. Parameters were fit to the data using gnuplot. Note that Cs is very large: it corresponds to the mass shaken by the voice coil, not to a capacitor that stores charge.

Adding a model for the mechanical resonance of the voice coil gets a better fit around the 24.05Hz peak, but the high frequency response is still not well modeled, and the resistance at the low end is off also.

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

Model of Puck mini bass shaker with two inductors and resistors for modeling the voice coil. Parameters were fit with gnuplot.

Fit of model using 2 inductors and 2 resistors for the voice coil, plus an LRC parallel circuit for the mechanical resonance. The fit is much improved at both high and low frequencies, and may be good enough for most purposes.

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.

Model of Puck mini bass shaker using 3 inductors and 3 resistors for the voice coil. Parameters were fit using gnuplot.

The fit using 3 inductors and 3 resistors for the voice coil is quite good, though there is still a little error around 160 Hz. Further improvement could be done by adding yet another inductor and resistor, but I felt that this model was good enough.

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:

Detailed plot around the resonance peak shows that the additional LR components to fit the high frequencies also provide a better model at low frequencies, by lowering the baseline.

The specs I found online suggested that the usable frequency range of the Puck is 20–80Hz and that fs was 40Hz. I’m seeing a much lower fs 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

4 Comments »

  1. 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 | Reply

    • 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 | Reply

  2. […] 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 | Reply

  3. […] Characterizing tactile transducer […]

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


RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: