Analysis of a Woofer Motor

David Meeker
dmeeker@ieee.org

14 May2009

Introduction

The purpose of this notebook is to automate the analysis of a woofer motor.  The notebook produces the static performance curves that designers often desire during the development of a new transducer: the actuator's "BL" (the amount of force produced on the voice coil per amp of coil current); the coil's self-inductance, and a plot of the magnetic field in which the coil is immersed.

Because there are so many possible variations in speaker motor geometry, the notebook does not create the speaker geometry within the notebook.  Rather, it reads an existing geometry info FEMM and analyses it at a number of different coil locations. It is assumed that the speaker motor has been drawn with all elements in the coil belonging to group number 1, so that the voice coil can be easily selected and moved by the notebook.  It is also assumed that the .fem file describing the motor is located in the same directory as the notebook (although the user could manually change the path to the .fem file).

Design - Specific Parameters

Model Name

ModelName="Woofer.fem";

Maximum excursion + /- from the centered position:

Xlim=5;

Movement increments used during the analysis

dX=1;

Define the range over which to plot the flux density :

Xcenter=17.15;    (* vertical location of the center of the airgap *)
Xspan=10;            (* field plotted between Xcenter-Xspan and Xcenter+Xspan *)

Analysis Routines

Load up the MathFEMM package and open an instance of FEMM

<<c:\\progra~1\\femm42\\mathfemm\\mathfemm.m

OpenFEMM[]

Analyze BL and incremental inductance at 1 mm steps between - Xlim and + Xlim

OpenDocument[NotebookDirectory[] <>ModelName];
MISaveAs[NotebookDirectory[]<>"temp.fem"];
MISelectGroup[1];
MIMoveTranslate[0,-Xlim];
MIClearSelected[];

bl={};
inductance={};

For[k=-Xlim,k≤Xlim,k+=dX,
MIModifyCircProp["icoil",1,1];
MIAnalyze[1];
MILoadSolution[];
MOGroupSelectBlock[1];
fz=MOBlockIntegral[12];
bl=Append[bl,{k,fz}];
fl1=MOGetCircuitProperties["icoil"][[3]];
R=MOGetCircuitProperties["icoil"][[2]];
MOClose[];
MIModifyCircProp["icoil",1,0];
MIAnalyze[1];
MILoadSolution[];
fl0=MOGetCircuitProperties["icoil"][[3]];
L=(fl1-fl0)*10^6;
inductance=Append[inductance,{k,L}];
Print[{k,fz,L}];
MISelectGroup[1];
MIMoveTranslate[0,1];
]

MIClose[];

Evaluate flux density in the gap at the position of the coil

OpenDocument[NotebookDirectory[] <>ModelName];
MISaveAs[NotebookDirectory[]<>"temp.fem"];
MIModifyCircProp["icoil",1,0];
MIAnalyze[1];
MILoadSolution[];
fluxdensity=Table[{x,MOGetB[16,Xcenter+x][[1]]},{x,-Xspan,Xspan,Xspan/100}];

CloseFEMM[];
DeleteFile[NotebookDirectory[] <> "temp.fem"];
DeleteFile[NotebookDirectory[] <> "temp.ans"];

Plot Analysis Results

Plot[Interpolation[bl][x],{x,-Xlim,Xlim},BaseStyle->{FontSize->14},Frame->True,GridLines->Automatic,FrameLabel->{"Displacement, mm","BL, N/A"},ImageSize->500,PlotLabel->"BL vs. Displacement"]

Plot[Interpolation[inductance][x],{x,-Xlim,Xlim},BaseStyle->{FontSize->14},Frame->True,GridLines->Automatic,FrameLabel->{"Displacement, mm","Inductance, μH"},ImageSize->500,PlotLabel->"Coil DC Self Inductance vs. Displacement"]

ListPlot[fluxdensity.DiagonalMatrix[{1,-1}],Joined->True,BaseStyle->{FontSize->14},Frame->True,GridLines->Automatic,FrameLabel->{"Vertical distance from center of gap, mm","Flux Density, T"},ImageSize->500,PlotLabel->"Air Gap Radial Flux Density vs. Position"]

DC Coil Resistance in Ohms:

R

Compute the nominal range of operation of the speaker.  It is assumed that the operating range is the range in which BL is within 10 % of th e maximum value of BL

BLMax=FindMaximum[Interpolation[bl][x],{x,-1,1}][[1]]

XmaxHigh=x /. FindRoot[Interpolation[bl][x]==0.9*BLMax,{x,0,5}]

XmaxLow = x /. FindRoot[Interpolation[bl][x]==0.9*BLMax,{x,-5,0}]