2017年4月28日金曜日

SVF DCFはんだ付け完了

回路図

基板図

C基板だと余裕がないのでB基板にした。

部品面(ICなし)

部品面(IC挿入)

ハンダ面

AD8403と2回路入りのOPAMPを使うとどうしても配線が錯綜してしまうので、ジャンパ線が多めになってしまった。

一通り導通状態をチェックして単体で波形を入れてみたが動作しているようだ。

メモ:


ジャンパ線を加工するのに便利かと思ってサンハヤトのリード・ベンダというのを買ってみた。今のところ劇的に便利ということもないです。使い方を工夫しつつ試し中。


ベースマシンにつないだ場合GNDレベルがどうなるのかよくわかっていない。ベースマシンの電源ボードは±2.5Vを作り出すのに(GND)-(+5V)を分圧して仮想GNDとして利用しているので真のGNDはフィルタ回路で使っている仮想GNDとは異なる(参考:「5V/3.3V/2.5V電源 はんだ付け完了」)

SVF DCFの出力のGNDは仮想GNDにしている。NJM13700 DCA の入力のGNDは真のGNDなので、GNDレベルがずれているが、10kΩ以上の入力インピーダンスで受けた後、ACカップリングしているのでバカみたいに電流が流れることはないと思うが一応確認した方が良さそう。

2017年4月25日火曜日

SVFの入力をACカップリングして、AD8403で制御してみる。

回路図

ブレッドボード配線図


Arduinoのスケッチ
<AD8403_SVF_Pot_Control.ino>

/*
  Digital Pot Control

  AD8403

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

  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");

  // Channel2 Q
  digitalPotWrite(1, v0);
  // Channel1, 3 Cutoff
  digitalPotWrite(0, 255 - v1);
  digitalPotWrite(2, 255 - 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);
}


配線が楽になりそうなので、B端子とW端子(普通のPOTで言う1番と2番)で抵抗値を変化させている。設定値が大きくなると抵抗値が小さくなるので、プログラムで
digitalPotWrite(0, 255 - v1);
digitalPotWrite(2, 255 - v1);
として反転させている。

前回の実験と同じく、Qを決めるch2を20kΩ、カットオフ周波数を決めるch1、ch3が15kΩになるように値を設定して波形を見てみた。

DATASHEETの抵抗値を求める計算式
RWB(D) = (D /256) * RAB + RW (RAB = 100kΩ、RW = 50Ω)
から、

設定値
ch2: 46: 18018.75Ω + 2.2kΩ ≒ 20.2kΩ
ch1,ch3: 217: 約14.9kΩ
※ch2は2.2kΩのゲタを履かせている。

電源電圧(フィルタ回路) -2.47V / +2.54V
電源電圧(Digi-Pot回路) 5.01V
OPAMP NJM2732

LPF

ch1:入力 ch2:LPF出力

BPF

ch1:入力 ch2:BPF出力

HPF

ch1:入力 ch2:HPF出力

入力は単電源波形で、なおかつ試しに入力のGNDをフィルタ回路の仮想GNDではなく、電源のGNDに接続している。どっちがいいのかはよくわかっていない(^q^;

基板図

※配線まだ

部品並べ

C基板でなんとかなるかな?

メモ:


AD8403の余っている1回路とOPAMPの余っている1回路で入力ゲイン調節もできそうだが。

2017年4月22日土曜日

SVFの入力をACカップリングしてみる

AD8400のDATASHEETに載っていた回路はうまく動かせれば良さそうだが、バンドリジェクトはまず使わないと思うので、まずはOPAMP3個構成で考えてみる

PSoC4 DCOは単電源波形なので、SVFの入力をACカップリングしてみた。

今から思えばVCVS DCFの入力もACカップリングしておくべきだった。ACカップリングしないでも動作しているのは、フルスイングOPAMPのNJM2732を使っているので正側だけでなんとかなっていて、出力をACカップリングしているので両電源波形として出力されているような気がする。(参考:「NucleoシーケンサーとPSoC4 DCOとVCVS DCFの結合テスト

VCVS DCFはArduinoのシールドに作り込んで、ユニバーサル基板と2段積みにしていて不格好なので、いずれ作り直すかも。

LTSpiceでシミュレーション


ACカップリングなし


シミュレーション回路図

AC解析

ACカップリングあり


ACカップリングはフィルムコンデンサを使うことにして、2.2uF/100kΩでカットオフ周波数は
fc = 1 / (2 * π * C * R) ≒ 0.72Hz
になる。

シミュレーション回路図

AC解析

R2(Rq)の値を低くしてQを下げると低域が減衰するようだ。ACカップリングをバイパスできるようにしておいたほうが無難かな。

ブレッドボードで実験


回路図

ACカップリングするのと同時に、入力レベルを調節できるように10kΩ/Bのトリム・ポットを入れてみた。入力インピーダンスはだいたい10kΩになる。トリム・ポットを右いっぱいに回せば10kΩのRで受けているのと同等になると思う。

ブレッドボード図

左側のブレッドボードは、TLE2426を使って、5V電源を分圧して±2.5Vの仮想GNDを作り出す。右側はSVFで今回はOPAMP(NJM4580)2個で配線した。

作図に使っているflitzingでフィルム・コンデンサのアイコンが用意されたので使ってみた。以前は積セラのしかなくて代用していたが、これで多少わかりやすくなったかも。

自作の矩形波だけのファンクションジェネレータで、単電源波形で1kHzの矩形波を出力してオシロで測定してみた。



LPF

ch1:入力 ch2:LPF出力

fc≒1kHzのLPFで矩形波がほぼサイン波になっている。ACカップリングも効いているようで、単電源波形が両電源波形になっている。


ch1:ACカップリング後 ch2:LPF出力

ch1は回路図のC10の直後で測定してみた。ハイ・パスフィルターとして働くのでエッジが強調された波形になっているが、回路の他の部分が影響しているのかちょっと変な感じ。

やはりバイパスできるようにしておいた方が良さそうだが、おかしな回路でも楽器の場合は味になるので動けばよしとする。

BPF

ch1:入力 ch2:BPF出力

HPF

ch1:入力 ch2:HPF出力

BPFもHPFも気色悪い波形(^q^;

改めて矩形波でシミュレーション

1kHzの矩形波を入力して過渡解析してみた。

シミュレーション回路図

過渡解析


LPFとHPFは実験結果と似ているが、BPFはかなり違う。測定ミスかな?

<追記:2017.04.25>

1kHz矩形波入力のBPF出力は測定ポイントを間違えていたようです。↓オシロで測定し直しました。


ch1:入力 ch2:BPF出力

シミュレーションに比べると歪な感じですが大きくは違わないと思います。

</追記>

POTを使ってカットオフ周波数とQを可変する


ブレッドボード図


抵抗をPOTに置き換えた。POTの2番と3番で抵抗値を変えるようにすると、右に回すと周波数が上がる感じになる。

矩形波、ノコギリ波を入れてみたが、VCVSにくらべるとかなりおとなしい感じだ。

AD8400のDATASHEETに載っているSVF回路をシミュレーションしてみる。

AD8400のDATASHEET(AD8400_AD8402_AD8403_jp.pdf)に応用回路としてSVFの回路例が載っていたのでシミュレーションしてみた。


回路図でHIGH-PASSと表記されている出力は、どうもバンド・リジェクトのようだ。

シミュレーション回路図

上記シミュレーション回路図のように、U1の出力がBAND-REJECT、U2の出力がHIGH-PASSになる。

R1とR2、R3とR4はポテンショメータで100kΩの中点として設定している。

R1とR2のポテンショメータでゲイン設定、R3とR4のポテンショメータでQを設定する。R6とR7は同じ値にしてカットオフ周波数を設定。R3とR4でQを上げるとゲインが下がる。

AC解析

メモ


この回路だと4回路入りのAD8403を全部使うし、OPAMPも2回路入り2個でちょうど収まる。

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