JMAG
測定したデータが図 3. 37(a)の水色のグラフである。オシロスコープで測定し v2 の波形の精度があまり良くなかったので,測定データをフーリエ変換し
4. 結論
4.2 今後の課題
・電流センサを実際に作成し,実験や測定を行い解析結果と比較していく。
・DC/DCコンバータにおいて測定結果と同じようなマイナーループを描くた めに,プログラムを改良していく。
・提案した解析手法を電流センサや
DC/DC
コンバータ以外にも適用できるか 検討していく。63
謝辞
本研究を進めるにあたり, 終始熱意あるご指導とアドバイスを賜りました石 川赴夫教授, また多くのご助言とご協力を頂きました栗田伸幸准教授に心から 感謝とお礼を申し上げます。
また主査と副査としてご協力いただきました橋本誠司教授,高橋俊樹准教授 に深く感謝致します。
最後に, 日々の研究において様々な協力と激励をいただき苦楽を共にした石 川研究室の学生の皆様に深く感謝致します。
64
参考文献
[1]
忠津考,笹田一郎,ビラリ効果を利用した大電流センサ, 電気学会研究会資料,MAG,
マグネティックス研究会 2005, pp57-62, 2005[2]
忠津考,笹田一郎,磁性流体磁気ブリッジを用いた電流センサの開発, 九 州大学大学院総合理工学報告, 第31
巻, 第4
号, 1-7項, 2010.[3] Jeff pankau,David legate, David W.Schlegel,Russel J.Kerkman,Gary L.Skibiniski, High-Frequency Modeling of Current Sensors, IEEE pril April, pril. 50, Npril. 2, Mpril/April 2014,
[4] I.D.Mayerrgoyz, Matheintical models of hysteresis 1991, springer Verks.
[5] DC.Jiles, MK.Derine, Nuinrnicel Hetermition of hysteresis parameters for the modeling of magnets prepertises using the theory of ferromagnetic hysteresis, IEEE Times on Magnetics, vol.28, No.1, pp27-35,1992.
[6] JMAG-Designer User’s Manual
[7]
「デバイス材料から機器設計までに貢献する磁性シミュレーション」<http://www.hitachihyoron.com/jp/pdf/2008/11/2008_11_04.pdf>
65
本論文に関する発表論文
(1)田中恵悟,石川赴夫,栗田伸幸,有限要素法を用いた非接触直流電流セン サの解析,電気学会研究発表資料,ETG-15-10,2016.
(2)田中恵悟,石川赴夫,栗田信幸,有限要素法におけるヒステリシスの一考 慮法の提案と電流センサへの適用,第
27
回MAGDA コンファレンス in 桐
生, OS-01-3,2016.(3)田中恵悟,石川赴夫,栗田伸幸,電流センサにおける磁気ヒステリシスの 有限要素法による検討,電気学会研究発表資料,ETG-17-39,2017
66
付録
magusr
#include "usrsub.h"
CALLTYPE c_magusr(int icond, // IN: icond : =1 : Making Matrix
=2 : Post Process
int istep, // IN: step
double time, // IN: time[sec] or frequency[Hz]
int nowelm, // IN: element id int iflgm, // IN: material type (<0)
const double cod[3], // IN: center point position [ m ] on local coordinate system
// if local c.s. is not used, then it is the point on global coordinate system double tempr, // IN: temperature [degree] of this element
const complex bvec[3], // IN: magnetic flux density Bnow [T]
double bfac, // IN: revise constant for bvec
const double bveco[3], // IN: magnetic flux density of pre step Bold [T]
const double amv[3], // IN: Magnetization Vector(from Permanent Magnet Data) M0 [A/m]
int numel, // IN: total number of elements int numnp, // IN: total number of nodes
int maxnod, // IN: maximum number of nodes within an element
// 2D analysis = 4, 3D analysis = 8 const int ietyp[], // IN: element type
const int lm[], // IN: node ID within an element const double coord[][3], // IN: coordinate of all nodes [ m ]
complex amu[3], // OUT: magnetization vector M(B) [A/m]
double dmdbu[3][3], // OUT: derivative coefficient int iusprm, // IN: user defined array size double usprm[]) // IN & OUT: user defined array {
int i, j, n;
double kind, kind_old;
double b_max, b_r, h_hys, alpha, h_max;
double b, b_old, h, h_old, fac, fac_old, dhdb, dhdb_check, B1, B;
67 double eps;
b_max = 0.8; b_r = 0.07; h_hys = 500; h_max = h_hys*10;←3つのパラメータ を入力
eps = 1.e-15;
alpha = -1.0 / h_hys*log(2 / (1 + b_r / b_max) - 1);
double pmu0 = 4.0 * M_PI * 1.0e-7;
n = nowelm * 9;
for (i = 0; i<3; i++){
b_old = bveco[i];
b = bvec[i].real();
kind_old = usprm[n + i];
h_old = usprm[n + 3 + i];
fac_old = usprm[n + 6 + i];
if (abs(b - b_old)>eps && b<b_max && b>-b_max){
//if(kind_old==0){
if (abs(kind_old - 0) < eps){
if (b > b_old) kind = 1;
if (b < b_old) kind = -1;
}
//if(kind_old==1){
if (abs(kind_old - 1) < eps){
if (b > b_old) kind = 1;
if (b < b_old) kind = 3;
}
//if(kind_old==-1){
if (abs(kind_old + 1) < eps){
if (b > b_old) kind = 4;
if (b < b_old) kind = -1;
}
//if(kind_old==3){
if (abs(kind_old - 3) < eps){
if (b > b_old) kind = 4;
if (b < b_old) kind = 3;
}
68
if (abs(kind_old - 4) < eps){
if (b > b_old) kind = 4;
if (b < b_old) kind = 3;
}
if (abs(kind - 0) < eps || abs(kind + 1) < eps || abs(kind - 1)
< eps){
fac = 1;
h = -1 / alpha*log(1 / ((b / (2 * b_max)) / fac + 0.5) - 1);
dhdb = (1 + exp(-alpha*(h)))*(1 + exp(-alpha*(h))) / (2 * b_max*fac*alpha*exp(-alpha*(h)));
dhdb_check = (h - h_old) / (b - b_old);
}
if (abs(kind - 3) < eps){
if (abs(kind - kind_old) < eps){
fac = fac_old;
} else{
fac = (b_old / (2 * b_max) + 0.5) / (1 / (1 + exp(-alpha*(h_old + h_hys))) - 0.5 + 0.5);
}
if (fac > 1) fac = 1;
h = -1 / alpha*log(1 / ((b / (2 * b_max) + 0.5) / fac + 0.5 - 0.5) - 1) - h_hys;
dhdb = (1 + alpha*(h + h_hys)))*(1 + exp(-alpha*(h + h_hys)))
/ (2 * b_max*fac*alpha*exp(-alpha*(h + h_hys)));
dhdb_check = (h - h_old) / (b - b_old);
}
//if(kind==4){
if (abs(kind - 4) < eps){
if (abs(kind - kind_old) < eps){
fac = fac_old;
}
69 else{
= (b_old / (2 * b_max) - 0.5)
/ (1 / (1 + exp(-alpha*(h_old - h_hys))) - 0.5 - 0.5);
}
if (fac > 1) fac = 1;
h = -1 / alpha*log(1 / ((b / (2 * b_max) - 0.5) / fac + 0.5 + 0.5) - 1) + h_hys;
dhdb = (1 + alpha*(h - h_hys)))*(1 + exp(-alpha*(h - h_hys)))
/ (2 * b_max*fac*alpha*exp(-alpha*(h - h_hys)));
dhdb_check = (h - h_old) / (b - b_old);
}
kind_old=kind; b_old=b; h_old=h; fac_old=fac;
if (icond == 2){
usprm[n + i] = kind;
usprm[n + 3 + i] = h;
usprm[n + 6 + i] = fac;
}
amu[i] = bvec[i] / pmu0 - complex(h, 0);
dmdbu[i][i] = 1 / pmu0 - dhdb;
} if (b > b_max){
if (icond == 2){
usprm[n + i] = 1;
usprm[n + 3 + i] = h_max + (b - b_max) / pmu0;
usprm[n + 6 + i] = 1.0;
}
amu[i] = b_max / pmu0 - complex(h_max, 0);
dmdbu[i][i] = 0.0;
}
if (b < -b_max){
if (icond == 2){
usprm[n + i] = -1;
usprm[n + 3 + i] = -h_max + (b_max + b) / pmu0;
usprm[n + 6 + i] = 1.0;
70 }
amu[i] = -b_max / pmu0 + complex(h_max, 0);
dmdbu[i][i] = 0.0;
} }
}
71
usrisrc
#include "usrsub.h"
#include <complex>
CALLTYPE c_usrisrc(const int idfnc, // IN: ID of current function const int iuscur, // IN: ID of users' subroutine (-1,-2,...)
const int istep, // IN: step
const double time, // IN: time[sec] or frequency[Hz]
const double timef, // IN: time[sec] for FQ-HT const int iusprm, // IN: user defined array size
double usprm[], // IN & OUT: user defined array // OUT
complex *vval) // OUT: current [A]
{
int id;
int check;
double curr[2];
double mf[3];
;
id = 43152; //ギャップあり←要素番号を入力
if (istep == 1){
mf[0] = 0.0;
mf[1] = 0.0;
mf[2] = 0.0;
*vval = std::complex<double>(0.0, 0.0);
} else{
int numnp = get_element_count();
int handle = get_component("magnetic_flux_density");
check = get_component_value(handle, id, mf);
if (check == 0){
printf("%s¥n", "node not found in usrvsrc.");
fflush(stdout);
}
//B = sqrt(mf[0] * mf[0] + mf[1] * mf[1] + mf[2] * mf[2]);
72 // Set current [A].
if (mf[2]>0){
curr[0] = (usprm[0] - ((mf[2] / 6.18E-004) / 1000));
}
else if (mf[2] <= 0){
curr[0] = (usprm[0] + ((-mf[2] / 6.18E-004) / 1000));
}
*vval = std::complex<double>(curr[0], 0.0);
usprm[0] = curr[0];
} }
73
usrvsrc
CALLTYPE c_usrisrc(const int idfnc, // IN: ID of current function const int iuscur, // IN: ID of users' subroutine (-1,-2,...)
const int istep, // IN: step
const double time, // IN: time[sec] or frequency[Hz]
const double timef, // IN: time[sec] for FQ-HT const int iusprm, // IN: user defined array size
double usprm[], // IN & OUT: user defined array // OUT
complex *vval) // voltage [V]{
int id;
int check;
double curr[2];
double mf[3];
id = 43152; //ギャップあり←要素番号を入力
if (istep == 1){
mf[0] = 0.0;
mf[1] = 0.0;
mf[2] = 0.0;
*vval = std::complex<double>(0.0, 0.0);
} else{
int numnp = get_element_count();
int handle = get_component("magnetic_flux_density");
check = get_component_value(handle, id, mf);
if (check == 0){
printf("%s¥n", "node not found in usrvsrc.");
fflush(stdout);
}
// Set current [A].
if (mf[2]>0){
curr[0] = (usprm[0] - (10 * (mf[2] / 6.18E-004) / 1000));