製作モジュール一覧

ラベル AD8402_WienBridge_DCO の投稿を表示しています。 すべての投稿を表示
ラベル AD8402_WienBridge_DCO の投稿を表示しています。 すべての投稿を表示

2017年9月18日月曜日

KIK01 作戦検討その2

AD8402 Wien Bridge DCODual OTA VCAを組み合わせて音出ししてみた。


前半は振幅と周波数のエンベロープをいじって、中盤は音域を高くしてスネア・タムっぽくしたもの、後半は過大入力をいれてOverDriveしている。

ジャンル的には、Techno → Psy Trance → Hard Styleっぽいかんじでしょうか(^q^?

キックマシン KIK01 Nucleo(mbed)でプロトタイピング」ですべて内部演算をしていたものと比べて出音は丸い感じになってるかな?

XSplitで録音/録画して、YouTubeにあげているのでわかりにくかもしれません。

KIK01 Proto04の構成



消費電流
NucleoF446 + AD8402 Wien Bridge DCO: 100mA~120mA
Dual OTA VCA: ±17mA

NucleoF446はまあまあいい量の電力を食いよりますね。

mbed repository:
https://os.mbed.com/users/ryood/code/KIK01_Proto04/ Revision:23

サンプリングレートの問題


今回は元になる波形はWien Bridgeからアナログ的に出力していて音声出力のためのサンプリングレートではないが、一定の周期で波形の周波数と振幅を更新しているのでその周期の問題です。


WaveSpectraでスペクトルを見たものだが、32,000Hzあたりにピークが出ている。これは上記サンプリング周期によるデジタル的な歪だと思う。直接音にしなくても、離散処理するとこんなとこにまで影響が現れる。

処理のタイミングを計測

ch1:D8 ch2:D9

ch1は一回のタイマ割り込み処理の最初と最後でH/L、ch2はAD8402 Wien Bridge DCOにSPI送信する最初と最後でH/Lさせている。AD8402 Wien Bridge DCOは2回送信しているので間に細い線で分割されている。

周期は31usで、逆数をとって約32,258Hz。

タイマ割り込み一回分の処理時間は16.3us、SPI通信で11.7us(カーソルで測定)とほとんどがSPI通信に食われている。エンベロープを対数カーブにする浮動小数点演算や内蔵DACからの出力はch1とch2のHの時間の差分で行っていて、処理が重そうなわりにほとんど消費していない。

ch1の間隔を見るとまだ余裕がありそうだが、これ以上処理の間隔を縮めると処理が追いつかず、入力系の処理ができなくなる。入力系の処理はMCP3008と遅~いSPI通信を行っている。

PSoC 5LPはCortex-M3でFPUが載っていないが、SPI通信はNucleoをmbedで使うよりも高速なので使ってみる手はあるかも。

または、Nucleoをmbedではなくネイティブ環境でやってみる。←かなりめんどくさい(@@;

でもまあ、32,000Hzは可聴帯域外だし、高速化できたとしてもエイリアスの出る周波数が高くなるだけで消えるわけではないので、とりあえずは一旦妥協する方向で。

Dual OTA VCAのエンベロープ波形の発振



上図はDual OTA VCAの回路の一部で、R8とC3で1次LPFを構成してエンベロープ波形を滑らかにしている。ところが、R8を0Ω側に回し切ると発振してしまう。

抵抗値を少し上げる(正常

ch1:エンベロープ入力 ch2:エンベロープLPF通過後

抵抗値ほぼ0Ω(発振)

ch1:エンベロープ入力 ch2:エンベロープLPF通過後

拡大(発振波形)

R8を0ΩにするとIC3Aのボルテージフォロアの出力をIC4Aの非反転入力(インピーダンス高)に直接つないでいることになり、GNDに落としているC8がもろに容量性負荷というやつになっていると思う。

発振しないようにするには、固定抵抗でゲタをはかすべきだと思うが、トリムPOTをちょっとだけプラス側に回しておけば大丈夫なので、今後気をつけることにする。←もう少し理論的なことも調べる。

KIK01の第二次作戦



図の下半分あたりは、AD8402 Wien Bridge DCOとDual OTA DCAで構成できた。

キック音源としては、Attackでかすかにシャンシャンいう音を混ぜたい。サンプリング音源と混ぜてもいいが、アナログシンセではノイズ・ジェネレーターを使っていることが多いので試しにやってみたい。

ホワイトノイズを発生させて、フィルターを通してピンクノイズやブルーノイズにしてみる。ノイズ系はシーケンサーから制御するのは振幅変調のみ。フィルターはSVFを考えていて、カットオフ周波数やレゾナンスのパラメータは普通のPOTで手で設定する。フィルターにエンベロープをかけても面白いかも知れないので後で差し替えられるようにしておく。

NucleoF446は、SPIが3系統付いていてSPI制御はしやすいが、DACは2個しかない。

NucleoF303は、DACが3系統使えるがSPIが1系統しかなく、演算速度も若干遅い。

痛し痒し(@@;

サイン波出力部分の改良案


Wien Bridgeは周波数が高くなると出力振幅が小さくなるので、周波数が高くなると振幅が大きくなるように補正してVCAにエンベロープを出力するようにして、ようすを見てみる。

プログラム上でexp()関数を使ってエンベロープ波形をアナログチックにしているが、Digital Filterのプログラムを書いてIIRを通して違いを見てみる。Digitalフィルターのパラメータはプログラム上で計算するのは大変なので、いくつか用意しておいて切り替えられるようにする。

メモ:


現状でもエンベロープ設定用にPOTx16を使っているが、ノイズジェネレーターのエンベロープ波形を設定するとなるとさらに8個ぐらいは必要そう。

POTをズラッと並べた方がパラメータいじりは楽だが、コンパクトにしたい気もするなぁ・・・

2017年9月16日土曜日

AD8402 Wien Bridge DCO はんだ付け完了

回路図

基板図

部品面

ハンダ面

消費電流 3mA
10kΩ負荷、100Hz出力時。

Github:
https://github.com/ryood/SPI_Wein_Bridge_Osc

メモ:


増幅率を決める5kΩのトリムPOTは調整がちょっとむずかしいので、多回転タイプの方が良かったかも。



2017年9月10日日曜日

AD8402 Wien Bridge DCO 基板設計

回路図

基板図

部品並べ

はんだ付けは2日ぐらいでしょうか。

発振周波数と振幅


前回かんたんにデータをとってみたがちょっと変なので、もう一度測定してみた。


抵抗設定値はAD8402に設定した値で0~255の8bit値。


多少ガチャガチャしているが、おおむね周波数が高くなると振幅が小さくなる。なんでそうなるのかはよくわからないです(^q^;

測定値

Vr 発振周波数(Hz) 振幅(Vp-p)
0 6677 1.14
1 3828 1.69
2 2703 1.88
3 2089 2.05
4 1698 2.16
5 1433 2.26
6 1238 2.38
7 1089 2.5
8 972.8 2.62
9 878.7 2.74
10 801.3 2.84
11 736.4 2.86
12 681.2 2.98
13 632.9 3.02
14 592.4 3.06
15 555.6 3.08
23 375.2 3.12
31 282.1 3.34
39 226.2 3.38
47 188.7 3.48
55 162.1 3.42
63 141.8 3.48
71 125.9 3.6
79 113.6 3.64
95 94.6 3.6
104 86.6 3.72
111 81.1 3.76
127 71 3.78
143 63 3.74
159 56.8 3.76
191 47.3 3.84
223 40.6 3.84
255 35.5 3.8

2017年9月3日日曜日

AD8402 Wien Bridge DCOの構想


以前「ウィーンブリッジ回路をAD8403で制御する。」でウィーンブリッジ正弦波発振器の実験をしたが、可変抵抗は2個でいいので2回路入りのAD8402/10kでやってみた。

回路図

AD8402も電源電圧は2.7V~5.5Vなので、発振回路のOPAMPには低電圧フルスイングのNJM2732を使い、5V単電源で、レールスプリッターのTLE2426を使ってVCC/2の仮想GNDを作っている。

出力はGNDに対する振幅にするためにACカップリングした。

発振周波数foscは、AD8402で生成する抵抗値をR、C=C1、C2とすると、

fosc = 1 / (2 * π * R * C)

で、AD8402の最小抵抗値は約50Ωなので、約33.9Hz~6776Hzになる。

ブレッドボードで実験


配線図

電源はUSB経由でArduinoの電源を使い、実測値+4.89V、仮想GNDは+2.44V。負荷には1kΩの抵抗を入れた。

R1の5kΩのトリムPOTを出力があまり歪まない程度にできるだけ大きくなるように調整した。

Arduinoのスケッチ
<AD8402_WeinBridge.ino>

/*
  Wein Bridge Control

  AD8402

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

  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 v0;

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() {
  int v = analogRead(0) / 4;
  if (v != v0) {
    v0 = v;
  
    Serial.print(v0);
    Serial.print("\n");
    
    digitalPotWrite(0, v0);
    digitalPotWrite(1, v0);
  }
}

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

AD8402の抵抗値を変化させて正弦波出力を見てみた。電源を入れた状態でAD8402のch1とch2の抵抗値も測定してみた。

v0=255

AD8402 Ch1: 9.30kΩ
AD8402 Ch2: 9.32kΩ

F:35.46Hz
Vp-p: 4.280V

v0=163

AD8402 Ch1: 5.97kΩ
AD8402 Ch2: 5.97kΩ

F:55.33Hz
Vp-p:3.80V

v0=89

AD8402 Ch1: 3.28kΩ
AD8402 Ch2: 3.28kΩ

F:100.6Hz
Vp-p: 3.720V

v0=20

AD8402 Ch1: 773Ω
AD8402 Ch2: 774Ω

F:426.7Hz
Vp-p:3.88V

v0=15

AD8402 Ch1: 594Ω
AD8402 Ch2: 596Ω

F:554.8Hz
Vp-p:3.84V

v0=10

AD8402 Ch1: 413Ω
AD8402 Ch2: 415Ω

F:798.7Hz
Vp-p: 3.520V

v0=5

AD8402 Ch1: 231Ω
AD8402 Ch2: 232Ω

F:1.427kHz
Vp-p: 2.640V

v0=2

AD8402 Ch1: 123.2Ω
AD8402 Ch2: 122.2Ω

F:2.692kHz
Vp-p: 2.080V

v0=1

AD8402 Ch1: 86.0Ω
AD8402 Ch2: 87.2Ω

F:3.799kHz
Vp-p:1.800V

v0=0

AD8402 Ch1: 49.5Ω
AD8402 Ch2: 49.3Ω

F:6.618kHz
Vp-p:1.270V


1kHz以下の出力振幅が何か変な感じだが、AD8402の抵抗値を測定するためにケーブルを抜き差ししたのが原因かもしれない?もう一度計り直したほうがいいかも。

また、AD8402に設定値v0が0と1のときは振幅が小さいだけでなく波形が歪んでいる。

ACカップリングのCの容量


低周波数も出力できるように出力のACカップリング用のコンデンサの容量は少し大きめの100uFにした。

最低周波数に設定して、10uFと100uFに差し替えて、負荷を1kΩにして比較してみた。

100uF(無負荷)

Vp-p:4.960V

10uF(無負荷)

Vp-p:4.920V

100uF(1kΩ負荷)

Vp-p:4.440V

10uF(1kΩ負荷)

Vp-p:4.040V

無負荷時はどちらも出力レベルが同等だが、1kΩ負荷時は10uFの方が出力レベルが下がっている。

周波数が50Hzのときインピーダンスは10uFで約318Ω、100uFで約31.8Ωになるので、10uFでカップリングすると出力先によっては音痩せするかもしれない。

FFT


55.1Hz出力

2.5kHz/div (全幅で25kHz)

500kHz/div (全幅で5MHz)

SPI通信由来のノイズが心配だったが、出力振幅が4Vp-p程度と大きいので目立ったノイズは乗っていない。

WaveSpectraで測定

高調波歪はまあまあ多い。特に奇数次の歪が出ている。奇数次が多いのは矩形波っぽい歪でしたっけ(^q^?