2017年4月19日水曜日

SVF(State Variable Filter)をデジタル・ポテンショメータのAD8403で制御してみる。

SVFをDCFとして製作するつもりで、デジタル・ポテンショメータのAD8403/100kΩで抵抗値を変えてフィルターのカットオフ周波数とQを変化させてみた。

基本的に、前回普通のPOTで設定した回路(参考:「SVF(State Variable Filter)の音出し」)をAD8403/100kΩに置き換えている。

ブレッドボード図

AD8403は「2.7V~5.5Vの単電源動作」で入出力はGND~VDDの範囲に収まっている必要がある。そのためOPAMPを使ったSVFの回路(ブレッドボード図の右上)は、5Vの単電源から仮想GNDを作って±2.5Vの両電源として使っている。ブレッドボード図の左上がTLE2426を使った仮想GNDを作り出す回路。


AD8403はSPI制御なので、ArduinoでSPI送信するスケッチを書いて送っている。カットオフ周波数とQを決める抵抗値は、POT2個でArduinoのAnalogInに入力して設定した。

Arduinoのスケッチ
<AD8403_Pot_Control.ino>

/*
  Digital Pot Control

  AD8403

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

  Pinの接続
  A0 POT1
  A1 POT2
  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);
  // initialize SPI:
  SPI.begin();
  delay(1);

  Serial.begin(9600);  
}

void loop() {
  v0 = analogRead(0) / 4;
  v1 = analogRead(1) / 4;
  
  Serial.print(v0);
  Serial.print("\t");
  Serial.print(v1);
  Serial.print("\n");
  
  digitalPotWrite(0, v0);
  digitalPotWrite(2, v1);
  digitalPotWrite(3, v1);
  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);
}


LPFの入出力波形の測定


入力は自作のPCM5102Aを使ったファンクションジェネレータで50Hzのノコギリ波を出力して使った。

OPAMPは±2Vから使えるNJM4580と低電圧フルスイングのNJM2732で見てみた。

Q設定値とfc設定値はAD8403に送っている数値で、fcの設定値は値が小さいほどカットオフ周波数が高くなる。

NJM4580


電源電圧: 5.07V +2.53V/-2.47V

Q最小


Q設定値:8 fc設定値:0 (Q設定値が8未満だと出力されない)

Q設定値:8 fc設定値:127

Q設定値:8 fc設定値:255

Q中間


Q設定値:127 fc設定値:6 (fc設定値が6未満だと発振)

Q設定値:127 fc設定値:127

Q設定値:127 fc設定値:255

Q最大


Q設定値:255 fc設定値:6 (fc設定値が4未満だと発振)

Q設定値:255 fc設定値:127

Q設定値:255 fc設定値:255

Qが大きくなると、波形の下側がNJM4580の出力振幅の下限に引っかかっているようだ。

NJM2732


電源電圧: 5.07V +2.53V/-2.51V

Q最小


Q設定値:6 fc設定値:1 (Q設定値が6未満だと出力されない、fc設定値が1未満だと発振)

Q設定値:6 fc設定値:127

Q設定値:6 fc設定値:255

Q中間


Q設定値:127 fc設定値:6 (fc設定値が6未満だと発振)

Q設定値:127 fc設定値:127

Q設定値:127 fc設定値:255

Q最大


Q設定値:255 fc設定値:8 (fc設定値が8未満だと発振)

Q設定値:255 fc設定値:127

Q設定値:255 fc設定値:255

波形のつぶれが軽減されていて、発振前やQを上げた場合の波形もNJM4580とは少々異なる。

Qの設定値に履かせるゲタ(適当)


AD8400のDATASHEETによると、

RWB(D) = (D / 256) * RAB + RW

となっているので、Q設定値が6の場合、

RWB(6) = (6 /256) * 100kΩ + 50Ω ≒ 2.4kΩ

となる。2.2kΩぐらい直列にいれておけばいいかな?fc設定値の方はゲタなしで。発振した場合はそれはそれでという方向で。

メモ:


NJM2734というNJM2732の4回路入りのバージョンもあって、OPAMPを3回路使うこの構成の場合配線が楽になるかどうか。4回路入りのOPAMPだと差し替えの選択肢が狭まるので悩むところ。