2016年6月18日土曜日

NucleoでVCVS DCFシールドの動作確認

以前作ったVCVS DCFシールドをNucleo F401REで動作確認してみた。


シールドを作ったとき、Nucleoが3.3V駆動なのに気付いていなくて、シールドは5V電源で動作するように作った。Arduino互換のピンソケットはちゃんと5Vのピンが出ているのでシールドはそのまま5V駆動できる。問題となるのはAD8403の信号線のレベルで、Data Sheetを見るとVDD=5Vのとき
Input Logic Hight(VIH) | Min 2.4V
となっているので、3.3Vで駆動のNucleoから送っても問題ないようだ。助かった(^q^;

Nucleo_DigitalPotControl_AnalogRead
main.cpp

/*
  Digital Pot Control

  AD8403

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

  Pinの接続
  A0 POT1 cutoff
  A1 POT2 resonance
  10 CS
  11 MOSI
  13 SCK
  
  Digi-Pot
  A1 - connect this to voltage
  W1 - this is the pot's wiper, which changes when you set it
  B1 - connect this to ground.
*/

#include "mbed.h"
 
Serial pc(SERIAL_TX, SERIAL_RX);

SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK);
DigitalOut CS(D10);

AnalogIn cutoffIn(A0);
AnalogIn resonanceIn(A1);

void digitalPotWrite(int address, int value)
{
    CS = 0;
    spi.write(address);
    spi.write(value);
    wait_us(1);
    CS = 1;
}

int main() {
    pc.printf("\r\n*** Digital Pot Control\r\n");
    while(1) {
        uint16_t cutoff = cutoffIn.read_u16() >> 8;
        uint16_t resonance = resonanceIn.read_u16() >> 8;
        
        pc.printf("%u\t%u\r\n", cutoff, resonance);
        
        digitalPotWrite(0, 255 - resonance);
        digitalPotWrite(1, 255 - cutoff);
        digitalPotWrite(3, 255 - cutoff);
    }
}


A0、A1につないだPOTでフィルターのcutoffとresonanceをコントロールする。

入出力のようす



ch1:入力 ch2:出力

Resonanceをあげない状態だと、普通のLPFとしても動作する。Resonance(Q)と増幅率が連動しているのでResonanceを下げると出力レベルは下がる。


出力は-300mVぐらいが下限の様だ。

メモ:


NJM13700を使ったVCAの入力振幅は±100mV以下にしないと歪むので、うまくレベル調整できるようにしたい。←まずはなるべく歪まないように設計。

5Vを分圧して±2.5V程度でフィルターに使うOPAMPを駆動すると入出力レベルの調整が厳しい。LTC1144という負電圧を作り出すICがあるのでこれを使う手もありそう。(アナログ系の素子を±5Vの両電源で駆動できる)

cutoff/resonanceの設定によってはファンクションジェネレータが異常発振してしまう。Filterの発振が逆流(?)しているのか?