2017年7月15日土曜日

ウィーンブリッジ回路をAD8403で制御する。

ウィーンブリッジ正弦波発振器の発振周波数を決めるRの値を、デジタルポテンショメータのAD8403で変化させて周波数可変にしてみた。

ブレッドボード図
<追記:2017.07.17>ブレッドボード図を修正</追記>


下のブレッドボードでArduino UnoとAD8403/10kΩを使って2本の可変抵抗を作っている。抵抗値はArduinoにつないだPOTで設定。

AD8403のデータシートによると、レオスタット(可変抵抗)として使うよりもポテンショメータ(可変電圧分圧器)として使ったほうが精度が出るようだが、ウィーンブリッジ回路はレオスタットとして使う必要がある。

AD8403のデータシートの10kΩバージョンの仕様によると


となっていて誤差が大きい。

最小値と最大値を設定してテスタで測定すると、

channel 最小(Ω) 最大(Ω)
RDAC1 50.9 8750
RDAC3 51.9 8720

だった。

上左のブレッドボードは、TLE2426を使って5V単電源から±2.5Vの仮想GNDを作っている。

上中のブレッドボードはNJM2732を使ったウィーンブリッジ回路。

上右のブレッドボードはACカップリング回路。

注意点として、オシロやオーディオインターフェイスなど測定機器をつなぐ場合、仮想GNDに測定機器のGNDをつなぐとUSB経由でArduinoに過電流が流れ込む。このため出力をACカップリングして真のGNDから見たDC成分を除去している。(参考:「SVF DCF 出力のGNDを修正 仮想GNDの扱いには注意するべし」)

また、ノイズ対策に0.01uFのEMIフィル(DSS1NB32A103)を入れている。

EMIフィルあり

EMIフィルなし

気持ち効果があるようなないような。

Arduinoのスケッチ

<AD8403_WeinBridge.ino>

/*
  Wein Bridge Control

  AD8403

  POTの出力電圧を読み取って
  Digi-Potのチャンネル1, 3の抵抗値を可変

  Pinの接続
  A0 POT1
  10 CS
  11 MOSI
  13 SCK
*/

// inslude the SPI library:
#include <SPI.h>

// set pin 10 as the slave select for the digital pot:
const int slaveSelectPin = 10;

byte cnt;
byte v0, v1;

void setup() {
  // set the slaveSelectPin as an output:
  pinMode (slaveSelectPin, OUTPUT);
  digitalWrite(slaveSelectPin, HIGH);
  // initialize SPI:
  SPI.begin();
  delay(1);

  Serial.begin(9600);  
  Serial.println("Wein Bridge Test.");
}

void loop() {
  v0 = analogRead(0) / 4;
  
  Serial.print(v0);
  Serial.print("\n");
  
  digitalPotWrite(0, v0);
  digitalPotWrite(2, v0);
  delay(1);
}

void digitalPotWrite(int address, int value) {
  // take the SS pin low to select the chip:
  digitalWrite(slaveSelectPin, LOW);
  //  send in the address and value via SPI:
  SPI.transfer(address);
  SPI.transfer(value);
  // take the SS pin high to de-select the chip:
  digitalWrite(slaveSelectPin, HIGH);
}

電源によるノイズの差


Arduinoの電源をPCのUSB経由でとった場合

Arduinoの電源を電池(単3×6)からとった場合

ノイズが相当違うので、以下電池電源にして測定した。

POTを右いっぱい(周波数最小)

周波数:39.22Hz
Vp-p: 1.1432V
Vrms: 490.1mV

約100Hz

周波数:100.0Hz
Vp-p: 1.1432V
Vrms:484.4mV

POTを左いっぱい(周波数最大)

周波数: 6680Hz(WaveSpectraで読み取り)
Vp-p: 112.0mV
Vrms: 24.3mV

出力レベルは小さくなるが、Rの値をAD8403の最小抵抗値(上述の通り約50Ω)にしても発振はする。

一つ上の値

周波数: 3.906kHz
Vp-p: 480.0mV
Vrms: 151.8mV

発振はするが、デジタルポテンショメータだと周波数が飛び飛びになるので端っこのほうは使わないほうが無難か?

WaveSpectraで測定


USB電源

THD: 0.16848%
THD+N: 0.98915%

電池電源

THD: 0.28599%
THD+N: 1.04803%

FFTのグラフは電池電源の方が良さそうだが、表示値はUSB電源のほうが良く出ている(@@?

メモ:


オシロの波形にヒゲが出ているが、おそらくSPI通信が行われている時のノイズだと思う。


ch1:波形出力 ch2:SPI_SCK

オシロのch2をSPI_SCKにつないでみると、ch1にもはっきりとノイズが乗る。ch2:SPI_SCKは1本の線状になっているが、1本の線がHの区間でSPI通信が行われている。

SPI通信を行うサンプリングレートは可聴帯域外に追い出したいところだ。