2021年12月5日日曜日

ArEG Arduinoを使ったEnvelope Generatorの構想

以前もArduinoを利用してEnvelope Generatorを製作しました。 今回はその改良版を製作します。

ステート制御にGPIOを3ステートで利用


コンデンサへの充放電の制御にダイオードを使って電流の逆流を防止していましたが、AVRのGPIOはWriteモードの時H/L出力できるのに加えて、Readモードの時Hi-Zとなる3ステートバッファとなっています。Hi-Zを使えばダイオードを入れなくても電流が流れなくなります。

利点としては、555タイマーやロジックICを使った場合に比べ部品数を少なくできること、またダイオードを入れないのでダイオードの順方向電圧のため波形の底が0Vまで落ちない(0.6V程度になってしまう)問題が解消されます。

ADSR波形のステートについては「アナログ・エンベロープ・ジェネレーターをプログラムでシミュレートする」で少し書きました。

回路図

実験に使った回路のアナログ部分です。回路図のSWは実際にはAVRのGPIOです。

閾値の判定にコンパレーターを使う


Attackステートは出力波形がある電位(今回は3.3V)に達した時終了し、Decayステートに移行します。ADコンバーターを使って電位を測定することもできますが、処理に時間がかかるためAttackの立ち上がりが急峻な場合行き過ぎてしまいます。

コンパレーターを使って閾値を越えたかどうか判定し(閾値の前後でH/Lが切り替わる)コンパレーターの出力でAVRの割り込みを発生させる方法を取りました。

また、ヒステリシス付きコンパレーターでないとSustainレベルが高い場合に出力がバタついてしまいます。プログラムで回避する方法もあるのですが、ノイズ源になりそうなのでコンパレーターはヒステリシス付きにしました。

コンパレーター出力のバタ付く例

C1:ADSR出力 C2:Threshold

ヒステリシス付き反転入力コンパレーター部分のシミュレーション

定数はVh=3.3V Vl=3.0Vを目標に決めています。

実験したブレッドボード配線図

Arduinoのスケッチ
/*
 * ADSR Switch Test
 * 
 * スレッショルド割り込み: 負論理
 *
 * 2021.11.27
 *
 */

const int ThresholdPin = 2; // INT0

const int AttackPin = 5;
const int DecayPin = 6;
const int ReleasePin = 7;

volatile bool th = false; 

void threshold()
{
  th = true;
}

void setup()
{
  pinMode(AttackPin, INPUT);  // Hi-Z
  pinMode(DecayPin, INPUT);   // Hi-Z
  pinMode(ReleasePin, INPUT); // Hi-Z

  // 負論理
  attachInterrupt(digitalPinToInterrupt(ThresholdPin), threshold, FALLING);
  // 正論理
  //attachInterrupt(digitalPinToInterrupt(ThresholdPin), threshold, RISING);
    
  Serial.begin(9600);
}

void loop()
{
  th = false;
  
  // Attack
  pinMode(DecayPin, INPUT);   // Hi-Z
  pinMode(ReleasePin, INPUT); // Hi-Z
  pinMode(AttackPin, OUTPUT);
  digitalWrite(AttackPin, HIGH);

  while (th == false) // スレッショルド割り込みを待つ
    ;
  
  // Decay
  pinMode(AttackPin, INPUT); // Hi-Z
  pinMode(DecayPin, OUTPUT);
  digitalWrite(DecayPin, LOW);
  delay(80);
  
  // Release
  pinMode(ReleasePin, OUTPUT);
  digitalWrite(ReleasePin, LOW);
  delay(100);
}

検証のため、Gate信号入力はなくプログラムでDecay→Releaseを切り替えています。実用的には、delay()関数で制御している部分をGate信号の割り込み処理に置き換えます。

出力波形

C1:ADSR出力 C2:Threshold

反転入力 or 非反転入力のコンパレーター


ヒステリシス付きコンパレーターは反転入力、非反転入力がありますが入力が閾値を上回った場合、出力がHになるかLになるかの違いがあります。プログラム次第でどちらでも使えそうですが、非反転入力の場合は問題があります。

非反転入力のヒステリシス付きコンパレーターを使った回路

右下の「Threshold」出力の回路が異なります。

ヒステリシス付き非反転入力コンパレーター部分のシミュレーション

こちらも定数はVh=3.3V Vl=3.0Vを目標に決めています。(少しずれてしまっていますが本題とはあまり関係ない)

ブレッドボード配線図

この場合コンパレーターの出力が入力に影響を与えてしまいます。


C1:ADSR出力 C2:Threshold

ThresholdがHの場合とLの場合でDecayの波形が異なってしまい段差が出ています。

次図のように入力インピーダンスが高い反転入力の場合は同じパラメータでも影響が出ません。


ヒステリシス付きコンパレーターは正帰還を掛けるので、負帰還を掛ける増幅回路とは逆に、非反転入力の方が入力インピーダンスが低く、反転入力の方が入力インピーダンスが高くなります。
 

0 件のコメント:

コメントを投稿