質問: ESP32でシリアル信号を拾い、その数値をMPC4922経由で電圧制御をしております。 この部分に関しては想定通りの動作はしているのですが、「ドン」と入力されたときにリニアに反応しすぎてしまいまいた。 その部分を緩和するためにRC時定数回路を通す事で緩和できる事までは確認できました。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/8df90daaaba6944de90342bbc886e3af.png) これをどうにか計算式で出来ないかと思い色々と調べてはいるのですが到達できません。 タイマーを使って制御するという事も耳にはしたのですが未だ見つからずです。 直接関係はないと思いますがDAC出力のサブルーチンです。 ``` void dacOut(byte port, int value) { digitalWrite(MOSI, HIGH) ; digitalWrite(SS, LOW) ; SPI.transfer((value >> 8) | port) ; SPI.transfer(value & 0xff) ; digitalWrite(SS, HIGH) ; digitalWrite(MOSI, LOW) ; } ``` 恐らくメインルーチンで処理しないとダメだとは思いながらも・・・ ご存じの方がいらっしゃいましたらご教授下さい。 宜しくお願いいたします。 機能的には断続するMIDI信号を電圧出力する装置を構築しております。
回答: 一定間隔でサンプリングしているとすれば、 y_{n} =a * x_{n} + (1 - a) * y_{n-1} RC 1次ローパス回路で微分方程式を立てると 入力電圧Vi出力電圧をVoとすれば R*C*d/dt(Vo) = Vi - Vo 微分を離散化して (RC/Δt)*(Vo(t+Δt) - Vo(t)) = Vi(t) - Vo(t) (Δt/RC) = aとして整理すると Vo(t+Δt) = a*Vi(t) + (1-a)*Vo(t) y_{n-1} = Vo(n*Δt) x_{n} = Vi(n*Δt) とすれば y_{n} =a * x_{n} + (1 - a) * y_{n-1}