🧲

フラックスゲート磁気センサの実験

2023/04/05に公開

はじめに

磁気をセンシングする、すなわち磁界や磁束密度を電気信号に変換するというのは簡単なことのように思えるかもしれませんが、実際はそこまで簡単ではありません。
「そんなの、コイルを巻いてそこに生じる電圧を測ればよいのでは?」と思われる方も多いと思いますが、この方法には大きな問題があります。
というのも、誘導起電力は磁束の時間微分に比例するため、地磁気のような直流磁界(時間微分がゼロ)は検出できないのです。
そのため、直流や低周波磁界を高い感度でセンシングするには、ホール素子磁気抵抗センサといった特殊なセンサ素子が使われます。
こういった素子は半導体技術などを利用して作られるため、自作することはほぼ不可能です。
ですが、特別な材料や設備を使わずに個人でも作れる磁気センサとしてフラックスゲートという方式が存在します。
もちろん普通の電子工作で磁気をセンシングしたい場合は既製品の磁気センサを使えばよいのですが、今回は個人的な興味からフラックスゲートセンサを自作してみます。

フラックスゲート磁気センサとは

フラックスゲート(Fluxgate)センサは直流磁界を検出可能な磁気センサの一種です。
センサ部分の材料は通常のコイルとほぼ同じで、強磁性体(パーマロイなど)のコアと複数の巻線(銅線)で構成されています[1]
その一方で磁気センサとしての感度は比較的高く、地磁気検出に使われるほか、それよりもずっと微弱な心磁界(心臓の電気的活動によって生じる磁界)を検出する研究も行われています[2]
さらに特殊な材料を使ったフラックスゲートにより、心磁界より弱い脳磁界を検出したという論文[3]も出ています。

フラックスゲートセンサは強磁性体コアの磁気飽和という現象をうまく利用しています。
これはコアの磁束密度が一定の大きさに達すると頭打ちになり、それ以上は巻線の電流を増やすなどしても磁束密度がほとんど増加しなくなるという現象です(実際には一気に頭打ちになるのではなく少しずつ飽和します)。
これは電源回路などでコイルを普通に使う上では厄介な現象ですが、フラックスゲートセンサでは外部磁界によって磁気飽和のしやすさが変わることを利用して磁界を検出します。
具体的には、巻線に流す電流を増やしていった時、外部磁界と電流による磁界が同じ方向の場合は早く飽和し、逆方向の場合は遅れて飽和するという挙動を使います。
実際の検出には駆動用巻線とは別の巻線を使って変圧器のようにして磁束の変化を検出するのですが、その際、駆動電流を正弦波交流として、外部磁界による磁気飽和への影響が正負による非対称性として生じることを利用し、駆動電流の周波数に対する偶数次高調波成分同期検波して検出します。

センサ部

フラックスゲートセンサは、コアと巻線からなるセンサ部と、駆動用巻線に交流電流を流す駆動回路、検出用巻線に生じた波形を同期検波する検出回路から構成されますが、まずはセンサ部について説明します。

今回製作したセンサは、既製品のコイル(マルツで売っていた47mHのもの)を二つ並べて、その上に0.26mmポリウレタン銅線を50回巻き付けたものです。
小さい電流で飽和させられると思ってインダクタンスの高いコイルを使いましたが、実際は数十mAを流してもほとんど飽和せず、一方で30V程度の電源電圧が必要になってしまいました。
ですので本当は細いコアと太い銅線を使って自作した方が良いはずです。

センサ部。既製品のフェライトコア入りコイルを2つ並べて接着剤で固め、その上にポリウレタン銅線を巻き付けている。

これは2個のコアをそれぞれ逆方向に駆動することで、外部電流に関係なく駆動電流のみで生じる成分を同期検波する前の段階である程度打ち消してしまう工夫です[1:2]

駆動・検出回路

駆動回路は下図の通りです。
マイコンのDACで生成された1kHz、0~3.3Vの正弦波(SINE_F)はU2Aを中心としたImproved Howland Current Pump[5]という電流源に入力され、正弦波信号に比例した電流(振幅±40mA程度)を駆動用巻線に流します(ただし直流はカット)。
ただし下半分(U2B周辺)の反転増幅回路でHowland電流源の出力電圧を反転することで、電源電圧VCC(約30V)をフルに使ってコイルを駆動できるようにしています(オーディオにおけるBTLアンプと同様)。
オペアンプには大電流を出力できるNJM4556Aを使っているのですが、実は許容損失オーバーで熱々になるので、仕方なくヒートシンクで放熱しています。

駆動回路。Improved Howland Current Pumpによって入力の正弦波に比例した電流をコイルに流す。ただしHowland回路の出力電圧を反転増幅回路で反転し、オーディオにおけるBTLアンプと同じ仕組みで出力電圧の振幅を広げている。オペアンプにはNJM4556Aを使用。

次は検出回路ですが、こちらは駆動回路とは打って変わって3.3V電源で動作します。
検出用巻線に生じた起電力はまずプリアンプ(オペアンプU1Aによる反転増幅回路)で10倍に増幅されます。
その後はアナログスイッチを使った同期検波回路になっています。
これは信号に駆動電流の2倍の周波数の矩形波(PULSE_2F)を乗算してローパスフィルタに通すもので、2次高調波を抽出して振幅を直流電圧として出力しています。
検出回路。検出用巻線の起電力をオペアンプMCP6232を用いた反転増幅回路で10倍に増幅した後、同期検波回路で2次高調波の振幅を出力する。

(2023/4/6: アナログスイッチICの名前が間違っていたので4066→74HC4066に訂正)

マイコンにはDACを搭載したSeeeduino Xiaoを使用しており、1kHzの正弦波と位相の合った2kHzの矩形波を出力しています。
無駄に固定小数点演算を使った振幅調整機能も入っていますが、実際にはほぼ最大振幅で使っています。

Seeeduino Xiaoのスケッチ
#include <TimerTC3.h>

const int DAC_RES = 10;
const unsigned long SAMPLE_PERIOD_US = 10;
const int TABLE_LEN = 100;
int16_t table[TABLE_LEN]; // Q15 fixed-point
int pos = 0;
int16_t amplitude;

void setup() {
  Serial.begin(115200); // Baudrate is meaningless

  pinMode(1, OUTPUT);

  analogWriteResolution(10);

  for (int i = 0; i < TABLE_LEN; i++) {
    table[i] = doubleToQ15(sin(2 * PI * i / TABLE_LEN));
  }

  amplitude = doubleToQ15(0);

  TimerTc3.initialize(SAMPLE_PERIOD_US);
  TimerTc3.attachInterrupt(onTimer);
}

void loop() {
  int amplitudeChanged = false;

  int chr;
  while ((chr = Serial.read()) >= 0) {
    switch (chr) {
      case 'w':
        if (amplitude + 3276 <= 0x7FFF) {
          amplitude = amplitude + 3276;
          amplitudeChanged = true;
        }
        break;
      case 's':
        if (amplitude - 3276 >= 0) {
          amplitude = amplitude - 3276;
          amplitudeChanged = true;
        }
        break;
    }

    if (amplitudeChanged) {
      Serial.print("Amplitude ");
      Serial.println(q15ToDouble(amplitude));
    }
  }
}

void onTimer() {
  int16_t value = mulQ15(table[pos], amplitude);
  analogWrite(A0, (0x7FFF + value) >> (16 - DAC_RES));

  if ((2 * pos) % TABLE_LEN < TABLE_LEN / 2) {
    digitalWrite(1, LOW);
  } else {
    digitalWrite(1, HIGH);
  }
  
  pos = (pos + 1) % TABLE_LEN;
}

inline int16_t doubleToQ15(double value) {
  double real = value * 0x7FFF;
  return round(real);
}

inline double q15ToDouble(int16_t value) {
  return (double)value / 0x7FFF;
}

inline int16_t mulQ15(int16_t a, int16_t b) {
  int32_t result = ((int32_t)a * (int32_t)b) >> 15;
  return constrain(result, -0x7FFF, 0x7FFF);
}

結果

オシロ画面上段の黄色い線は同期検波回路の出力、下段の青い線は検波前の信号(プリアンプの出力)です。
手に持ったネオジム磁石を近づけると出力電圧が変化していることがわかります。
https://www.youtube.com/watch?v=IK-aO8uLUWI

考察

磁石が止まっている時も出力信号が中点に戻らないことから、普通のコイルとは違って直流磁界を検出できていることが確認できます。
フラックスゲート磁気センサとしての動作には成功したといえるでしょう。
ですが今回は強力なネオジム磁石を接近させてやっと信号の変化が出ているような状態でした。
ホール素子などと同じぐらいの感度だと思いますが、前述した「比較的高感度な磁気センサ」という印象からすると少し物足りません。
これはおそらく駆動電流が不足しており、外部磁界だけでコアが飽和するほどになってやっと信号が出ているような状態になっていたためだと思われます(実際ここまで磁石を近づけるとそれだけで飽和します)。

まとめ

今回は磁気センサの一種であるフラックスゲートセンサを、市販のコイルと一般的な電子部品を使って実装しました。
今はまだネオジム磁石に対する反応を目視で確認しただけですが、今後は地磁気の検出などを試せたらと思っています。

脚注
  1. フラックスゲート磁力計の仕組み https://staff.aist.go.jp/r-morijiri/MyHome2016/memomemo/anomaly/flux.html (2023/04/04閲覧) ↩︎ ↩︎ ↩︎

  2. 加呂光、基本波型直交フラックスゲートの生体磁気計測への応用に関する研究、九州大学博士論文、2016 https://doi.org/10.15017/1807076 ↩︎

  3. N. Koshev et al., “Evolution of MEG: A first MEG-feasible fluxgate magnetometer,” Human Brain Mapping, vol. 42, no. 15, pp. 4844–4856, Oct. 2021. https://onlinelibrary.wiley.com/doi/full/10.1002/hbm.25582 ↩︎

  4. 田口海詩、原理体験!高感度フラックスゲート磁力計、トランジスタ技術2021年12月号、pp.128-132、2021 ↩︎

  5. I. V. Lam, “Analysis of Improved Howland Current Pump Configurations,” Application Note SBOA437A, Texas Instruments, 2023. https://www.ti.com/lit/an/sboa437a/sboa437a.pdf?ts=1680693576104&ref_url=https%253A%252F%252Fwww.google.com%252F ↩︎

Discussion