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だと差し替えの選択肢が狭まるので悩むところ。