製作モジュール一覧

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

2017年8月20日日曜日

Dual OTA VCA 2chでテスト


※2chでテストと言っても2ch(掲示板)でテストしたわけではないです。

回路図

ブレッドボード配線図

ブレッドボード配線図の通りAとBの入力をつないで、音声波形、エンベロープ波形とも同じ波形を入力した。

入力インピーダンス10kΩ程度の電圧入力なのでこういうことをしてもほぼほぼ問題ないと思う。

電源電圧 +5.0V / -4.97V

音声入力: PCM5102Aファンクションジェネレータ(100Hz/Sine 両電源波形)
エンベロープ入力: Nucleo F446の内蔵DACからの出力(4Hz/Saw/+3.3p-p 片電源波形)

出力

ch1:OUTPUT B ch2:OUTPUT A

トリムPOTをまわして、AとBでLPFのかかり方や入力レベルを変えている。

入力

ch1:音声入力 ch2:エンベロープ入力

音声入力に単電源波形を入れてみる


音声入力の方はACカップリングして、単電源波形を入れても動作するようにしている。AD9833_FGで単電源波形のSIN波を生成して入力してみた。


ch1:音声入力A ch2:出力A

NJM13600のBIAS入力の電流はどこに向かって流れるか?


データシートに載っている等価回路



左下のAMP BIAS INPUTがBIAS入力で、Tr2のベース・エミッタ間の電圧降下が約0.6V、D1(またはTr1、Tr3のベース・エミッタ間)の電圧降下が約0.6Vで[V-]に向かって流れるようだ。

したがって、AMP BIAS INPUTの電位は[V-]+1.2V程度になると思う。

前回、AMP BIAS INPUTの電位を測定した。


ch1の縦軸は200mV/Divで22.0divシフトしているので、中央が-4.4V。電位は中央からマス目2個半~3個(500mV~600mV)ぐらい上なので、約-3.9V~-3.8V程度。

電源電圧は+5V/-4.97Vだったので、[V-]は-4.97V。

[V-] + 1.2V = -4.97V + 1.2V = -3.74V

なのでこれぐらいの電位になっているんだと思う。

つまり、AMP BIAS INに入力した電流は、ダイオード2個分を挟んで[V-]に向かって流れていることになる。

2016年7月28日木曜日

NJM13700 DCAの基板でけた。

回路図

基板図

途中でMCP4922(IC2)を間違えて5ホール分(基板のガイド線1個分)ずれてはんだ付けしてしまったので、急遽部品の配置を変更。R6とC3だがなんとか大事に至らず変更できた。助かった(^q^;;;

部品面

はんだ面

電解コンデンサの正負を間違えてはんだ付けしたり、なんだかんだあったがなんとか完成(^q^/

出力波形


PCM5102AのファンクションジェネレータとNucleoシーケンサーをつないで動作確認。


ch1:入力波形 ch2:出力波形

2016年7月25日月曜日

NJM13700 DCAの基板設計

回路図

基板図

配線の都合で、NJM13700はチャンネルA、TL072はチャンネルBを使うように変更した。

33kΩの抵抗の手持ちがなくなったので27kΩに変更。出力レベルが若干上がる。100mV(p-p)の入力で2V(p-p)強。

部品並べ



頑張れば1日ではんだ付けできるかな?

配線の再チェック


NJM13700のチャンネルを変更して再度チェックしてみた。(パイロットランプ用のLEDもつけた)



これ完成させたらラズパイ買う!!

2016年7月23日土曜日

NJM13700 DCAの設計

回路図

図ではOTAはLM13600ANになっているが、NJM13700を使った。NJM13600でも動作する。

R1とR2の分圧で入力を100mV(p-p)になるように調整する(NJM13700の信号入力範囲)。

C1とR3はACカップリング(fc≒1.38Hz)。C2とR9も出力用のACカップリング。

R6とC3はバイアス波形(エンベロープ)をなまらせるLPFでR6で調節する。IC3BとTr1付近はOTAに入力するための電圧→電流変換回路。

NJM13700ボードはSPIハブ(?)機能をもたせる(JP5, JP6)。

このボードに±5Vを入力し、IC4(3.3V LDO)で3.3V電源とし、あわせて±5V/3Vの電源供給元(JP7, JP8, JP9)とする予定。

配線チェック


配線図


シーケンサーとして使うNucleo F401の5V電源も、NJM13700 DCAから供給した。Nucleoのボード上のJP5のE5V側をショートし、morpho headerのE5V/GNDから電源を供給した。

電源電流
+5V 62mA~73mA
-5V 4.80mA

出力波形


矩形波

ch1:NJM13700の+INPUT B(14Pin)への入力波形 ch2:出力波形

サイン波

ノコギリ波


2016年6月15日水曜日

MCP4922とNJM13700でSPI制御のDCA(Nucleo編)

Nucleo F401REで動作させてみた。

回路図


ブレッドボード図


Nucleoは3.3V駆動なので、MCP4922も3.3V駆動させた。I-V変換回路とNJM13700は別に±5Vの電源を使用。

mbed Repository:
https://developer.mbed.org/users/ryood/code/Nucleo_MCP4922_DCA_Test/

main.cpp

#include "mbed.h"
#include "rtos.h"
#include "AverageAnalogIn.h"
 
#define SPIM_TIMER_PERIOD   (5)         // 5ms
#define SPIM_RATE           (8000000)   // 8MHz
#define SPIM_WAIT           /*(wait_us(1))*/
 
// ピン・アサイン
#define PIN_CHECK       PA_10
#define PIN_DAC_CS      PA_9
#define PIN_DAC_LDAC    PA_8
 
SPI SpiM(SPI_MOSI, SPI_MISO, SPI_SCK); 
DigitalOut DacCs(PIN_DAC_CS);
DigitalOut DacLdac(PIN_DAC_LDAC);
 
DigitalOut CheckPin(PIN_CHECK);
 
AverageAnalogIn DurationIn(A0);
AverageAnalogIn DecayIn(A1);
AverageAnalogIn SustainIn(A2);
 
int16_t beatLen = 25;
 
int16_t level = 4095;
int16_t duration = 400;
int16_t decay = 100;
int16_t sustain = 2000;
 
int16_t decay_delta;
int16_t release_delta = 1000;
int16_t mod_value;
 
int16_t tick;
 
// DAC A Channelに出力
// parameter: v: 出力値(0 .. 4095)
void writeToDacA(int16_t v)
{
    // Channel A
    DacLdac = 1;
    DacCs = 0;
    SpiM.write((v >> 8) | 0x30);    // 0x30: DAC_A(0) | Vref Unbuffered(0) | Vout 1x(1) | !SHDN(1)
    SpiM.write(v & 0xff);
    SPIM_WAIT;
    DacCs = 1;
    DacLdac = 0;
}
 
// DAC B ChannelにA ChannelのVrefを出力
void outVref()
{
    // Channel B
    DacLdac = 1;
    DacCs = 0;
    SpiM.write(0x08 | 0xB0);    // 0xB0: DAC_B(1) | Vref Unbuffered(0) | Vout 1x(1) | !SHDN(1)
    SpiM.write(0x00);  
    SPIM_WAIT;
    DacCs = 1;
    DacLdac = 0;
}
 
// ADSR波形を出力
void outADSR(void const* arg)
{
    tick++;
 
    if (tick > beatLen) {
        tick = 0;
        // モジュレーション波形を初期化する
        mod_value = level;
        decay_delta = (level - sustain) / decay;
    }
 
    // 出力値補正
    if (mod_value < 0) {
        mod_value = 0;
    }
    writeToDacA(mod_value);
 
    if (tick < decay) {
        mod_value -= decay_delta;
    }
    /*
    if (tick >= duration) {
        mod_value -= release_delta;
    }
    */
    if (tick == duration) {
        mod_value = 0;
    }
}
 
int main()
{
    RtosTimer SpiM_timer(outADSR, osTimerPeriodic);
        
    SpiM.format(8, 0);
    SpiM.frequency(SPIM_RATE);
    
    outVref();
    
    SpiM_timer.start(SPIM_TIMER_PERIOD);
    
    while(true) {
        duration = DurationIn.read() * beatLen;
        decay    = DecayIn.read() * beatLen;
        sustain  = SustainIn.read() * 4095;
        
        printf("%d\t%d\t%d\r\n", duration, decay, sustain);
        
        Thread::wait(10);
    }
}


MCP4922の余っているchannel Bをchannel AのVrefとして使うようにしてみた。0x0800(2048)を出力しているので、channel AのVrefはVDD/2になり、channelAの出力は0V~VDD/2、3.3V駆動させているので0V~1.65Vの振幅になる。

プログラムで後から振幅を調整できるのがメリット。

入出力のようす



ch1:MCP4922の出力 ch2:WaveOut


ch1:WaveIn ch2:WaveOut

拡大

WaveInの振幅

差動入力電圧100mV(p-p)以下

ch1:WaveIn ch2:WaveOut

差動入力電圧100mV(p-p)以上

波形の振幅は±100mV(p-p)以内におさえないと激しく歪む。歪ました方が面白い場合もあるのでトリマーで調節できるようにしようか。

ADSR波形にLPFを入れてみる


MCP4922で出力した波形がカックカクなので、出音がブツブツ言う。なのでLPFを入れてアナログチックな波形にしてみた。

LTSpiceでシミュレーション

過渡解析

125m秒と言うのは、120BPMの四分音符の長さ。これぐらいのなまり方ちょうど良さそう。


ch1:MCP4922の出力 ch2:WaveOut

メモ:


いまだに割と簡単に発振してしまう。意図しない発振なのでつぶす必要がある。デカップリングコンデンサは入れているので、NJM13700の使ってないB側をGND入力のボルテージフォロワーにして安定させてみるとか。オーディオ信号が発振するのでNJM13700の周辺だと思う。

ADSR波形のLPFもなまり方を可変できるようにRを10kΩ程度のトリマーにしてみる?

回路図のR1とR2は兼用できないか?


2016年6月13日月曜日

MCP4922とNJM13700でSPI制御のDCAを作ってみる。

配線図


OPAMPはTL072を使用。両電源が必要なTL072とNJM13700はプラス5VをArduinoから給電、マイナス5Vを自作の5V-3.3V安定化電源Ver.2から給電。

振幅制御用にPOT3個(ぴゅんぴゅんコントローラー1号)を使った。

ブレッドボード図では18kΩになっているV-I変換用のRの値を47kΩにしてV→Iの変換比率を下げ、たまに発振するようなので2.2kΩのRと並列に0.1uFのCを入れた。(気休め)

Arduinoのスケッチ


ArduinoとSPIのDAC(MCP4922)でエンベロープ・ジェネレーターを作る。」のスケッチとほとんど同じだが、5V MAXで出力するとV-I変換でNJM13700に入力する電流が大きくなりすぎるので、2bit右シフトして出力電圧を1/4にして出力するようにした。

MCP4922_NJM13700_DCA_Test

#include <SPI.h>
#include <MsTimer2.h>

#define MOD_RATE  1   // ms

#define PIN_LDAC   9      // MCP4922のラッチ動作出力ピン
#define PIN_DURATION  A0
#define PIN_DECAY     A1
#define PIN_SUSTAIN   A2   

int16_t beatLen = 500;

int16_t level = 4095;
int16_t duration = 400;
int16_t decay = 100;
int16_t sustain = 2000;

int16_t decay_delta;
int16_t mod_value;

int16_t tick;

// DACに出力
// parameter: v: 出力値(0 .. 4095)
void outDAC(int16_t v)
{
  v >>= 2;
  digitalWrite(PIN_LDAC, HIGH) ;
  digitalWrite(SS, LOW) ;
  SPI.transfer((v >> 8)| 0x30) ;
  SPI.transfer(v & 0xff) ;
  digitalWrite(SS, HIGH) ;
  digitalWrite(PIN_LDAC, LOW) ;
}

void outADSR()
{
  tick++;
  
  if (tick > beatLen) {
    tick = 0;    
    // モジュレーション波形を初期化する
    mod_value = level;
    decay_delta = (level - sustain) / decay;
  }
  
  // 出力値補正
  if (mod_value < 0) {
      mod_value = 0;
  }
  outDAC(mod_value);
  
  if (tick < decay) {
    mod_value -= decay_delta;
  }
  if (tick == duration) {
    mod_value = 0;
  }
}

void setup() {
  Serial.begin(9600);
  
  // DAC出力の初期化
  pinMode(PIN_LDAC, OUTPUT);
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);            // ビットオーダー
  SPI.setClockDivider(SPI_CLOCK_DIV8);  // クロック(CLK)をシステムクロックの1/8で使用(16MHz/8)
  SPI.setDataMode(SPI_MODE0) ;          // クロック極性0(LOW) クロック位相0
  
  // Timerの初期化
  MsTimer2::set(MOD_RATE, outADSR);
  MsTimer2::start();
}

void loop() {
  
  duration = map(analogRead(PIN_DURATION), 0, 1023, 0, beatLen);
  decay    = map(analogRead(PIN_DECAY), 0, 1023, 0, beatLen);
  sustain  = analogRead(PIN_SUSTAIN) << 2;
  
  Serial.print(duration);
  Serial.print("\t");
  Serial.print(decay);
  Serial.print("\t");
  Serial.print(sustain);
  Serial.print("\n");
}

入出力のようす


自作のファンクションジェネレータで100Hzのノコギリ波を出力して振幅を変化させてみた。


ch1:Audio Out ch2:MCP4922の出力


ch1:Audio Out ch2:Audio In

入力信号はノイズに埋もれてしまっているが、出力信号はまあまあきれに変調できているようだ。

メモ:


OPAMPとPNP Trの組み合わせでV-I変換の比率をシミュレーションで調べた方がいいかも知れない。TrのhFEが絡んでくるのかどうかよくわからない。

DACへの入力を1/4にすると精度が悪くなるので(12bit精度が10bit精度になる)アナログ回路的にもう少し考える。


2016年5月4日水曜日

OTAのNJM13600、NJM13700をシンプルに使う。

出力バッファにNJM13700の内蔵Trを使って、電圧電流変換を抵抗1本でやっても動作した。

回路図

ブレッドボード図


入力はV+とV-を「CtlIN」のPOTで分圧して、R(33kΩ)に入力すること電流に変換している。

出力バッファはNJM13700の内蔵のTrを使った。バッファのエミッタをGNDではなく、V-に接続してTrを動作させている。

出力はマイナス側に偏るので10uFの電解コンデンサと100kΩのRでACカップリングした。

部品数はかなり少なくなった(^q^/

入出力


電源電圧 +5.06V/-5.09V
R1(V→I変換抵抗) 33.18kΩ


入力電圧(V) P1の電圧(V) 電位差(V) 電流(uA) 出力電圧(mV(p-p)
-5.09 -5.07 -0.02 -0.602772755 24
-4.18 -4.17 -0.01 -0.301386377 78
-3.00 -3.91 0.91 27.42616034 1120
-2.00 -3.88 1.88 56.66063894 2320
-1.00 -3.84 2.84 85.59373116 3480
0.00 -3.84 3.84 115.7323689 4680
1.00 -3.82 4.82 145.177818 5760
2.02 -3.81 5.83 175.708258 6960
3.00 -3.81 6.81 205.244123 7680
5.06 -3.79 8.85 266.7269439 8000

<追記:2017.07.04>

P1とはNJM13700のPin1の増幅率を決める電流入力端子の意味です。←見返しててわからなかったので追記。

</追記>


バイアス入力電圧 vs 波形出力電圧

バイアス入力電流 vs 波形出力電圧

NJM13700のP1(AMP/BIAS)の電位がマイナスなので、バイアス入力電圧はマイナスから必要だが、電圧で波形の増幅率を制御できている。

(バイアス入力電圧 - P1の電圧)とR1の抵抗値から計算した電流は波形の出力電圧とほぼ比例している。

NJM13700のP1の電圧


電源電圧でP1の電圧が変わりそうなので、電源電圧を変化させて調べてみた。


電源+(V) 電源-(V) 電源差分(V) P1(V)
3 -2.99 5.99 -1.772
4 -4 8 -2.77
5 -5 10 -3.75
6.01 -6.01 12.02 -4.74
6.99 -6.99 13.98 -5.72
8 -8 16 -6.7
8.96 -9 17.96 -7.72
10.03 -10.01 20.04 -8.73




メモ:


バイアス電圧を負側から与えられればV→I変換は抵抗1本で済みそう。増幅率は0からでないとVCAとしては使えない。

抵抗値(R1)で電圧→電流の変換の比率は変えられる。

電源電圧でバイアス電流が変化するが、きちんと安定化できれば大丈夫?

OPAMP+PNPトランジスタの方がV-I変換は確実そう。(GNDレベルは気にしないでいい)


以下、オシロのキャプ画です。


2016年5月2日月曜日

OTAのNJM13600、NJM13700のバッファを使わない実験

バッファを外して実験してみた。前回の実験でNJM13600は内蔵バッファを使わないでボルテージフォロワーを使うと出力がリニアにならくて、出力電圧も違ったようなので、内蔵バッファを使わないでOTAの出力を「BUFFER INPUT」に入れてみる場合も試してみた。

ブレッドボード図

OTAの出力(5Pin)からバッファの入力(7Pin)の青色のジャンパ線を抜き差しして比べた。

5PinからGNDに落としている33kΩの抵抗は、これがないとオシロで測定した時出力電圧がかなり上がってしまうので入れている(→ということは電流出力なのかな?)

NJM13600 バッファなし


バイアス電圧(mV) 201 400 602 800 1004
出力電圧(mV(p-p)) 520 968 1400 1820 2220


NJM13600 バッファなし (OTAの出力を内蔵バッファにインプット)


バイアス電圧(mV) 201 400 600 802 1004
出力電圧(mV(p-p)) 320 592 872 1160 1440


NJM13700 バッファなし


バイアス電圧(mV) 201 400 601 800 1003
出力電圧(mV(p-p)) 312 584 864 1128 1420


NJM13700 バッファなし (OTAの出力を内蔵バッファにインプット)


バイアス電圧(mV) 201 400 601 800 1003
出力電圧(mV(p-p)) 312 584 864 1128 1420

グラフ化してみると、NJM13600で内蔵バッファにOTAの出力を入力しない場合(グラフのオレンジの線)だけ出力電圧が異なっている。


また、点線で直線を引いてみて比べる他と比べてカーブしている。

メモ:


NJM13600は内蔵バッファを使わない時でもOTAの「OUTPUT」から内蔵バッファの「BUFFER INPUT」に繋いでおいたほうが無難かもしれない。

前回のオシロのキャプ画を見てみると、内蔵Trでバッファリングした場合は同位相だが、ボルテージフォロワーにした場合はNJM13600もNJM13700も位相が反転している。なぜだ(@@?

<追記:2016.05.07>

OTAの反転入力端子(P4)と非反転入力端子(P3)で、信号を入力するのとGNDに落とす位置を逆に接続してしまっていたのが原因だったようです。

</追記>

以下オシロキャプ画です。

NJM13600 バッファなし


バイアス入力電圧201mV

バイアス入力電圧400mV

バイアス入力電圧602mV

バイアス入力電圧800mV

バイアス入力電圧1004mV

NJM13600 バッファなし (OTAの出力を内蔵バッファにインプット)


バイアス入力電圧201mV

バイアス入力電圧400mV

バイアス入力電圧602mV

バイアス入力電圧800mV

バイアス入力電圧1004mV

NJM13700 バッファなし


バイアス入力電圧200mV

バイアス入力電圧400mV

バイアス入力電圧601mV

バイアス入力電圧800mV

バイアス入力電圧1004mV

NJM13700 バッファなし (OTAの出力を内蔵バッファにインプット)


バイアス入力電圧201mV

バイアス入力電圧400mV

バイアス入力電圧601mV

バイアス入力電圧800mV

バイアス入力電圧1003mV