以前も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になるかの違いがあります。プログラム次第でどちらでも使えそうですが、非反転入力の場合は問題があります。
非反転入力のヒステリシス付きコンパレーターを使った回路
ヒステリシス付き非反転入力コンパレーター部分のシミュレーション
こちらも定数はVh=3.3V Vl=3.0Vを目標に決めています。(少しずれてしまっていますが本題とはあまり関係ない)
ブレッドボード配線図
この場合コンパレーターの出力が入力に影響を与えてしまいます。
C1:ADSR出力 C2:Threshold
ThresholdがHの場合とLの場合でDecayの波形が異なってしまい段差が出ています。
次図のように入力インピーダンスが高い反転入力の場合は同じパラメータでも影響が出ません。
0 件のコメント:
コメントを投稿