質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

RC時定数回路と同じ処理を計算式で

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 986

score 13

ESP32でシリアル信号を拾い、その数値をMPC4922経由で電圧制御をしております。
この部分に関しては想定通りの動作はしているのですが、「ドン」と入力されたときにリニアに反応しすぎてしまいまいた。

その部分を緩和するためにRC時定数回路を通す事で緩和できる事までは確認できました。

イメージ説明
http://tinyurl.com/y7en5xyf

これをどうにか計算式で出来ないかと思い色々と調べてはいるのですが到達できません。
タイマーを使って制御するという事も耳にはしたのですが未だ見つからずです。

直接関係はないと思いますが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信号を電圧出力する装置を構築しております。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/01/30 16:15

    時定数回路でなにをしたいんでしょうか。
    なにを聞きたいのかイマイチわかりません

    キャンセル

  • KojiYamamoto

    2019/01/30 16:19

    書き方悪くてすいません。

    RC回路と同じ挙動をプログラムで実装したいのです。
    言葉でしか表現できませんが「ドン」と入力された信号を「じわー」っと出力したいのです。
    伝わりますかね?

    キャンセル

回答 2

checkベストアンサー

+2

定期的にDAC出力を行うことを前提として、

//ratioは反応の速さ(1~100)
void dacFilterdOut(int port, int targetVal, int ratio){
  static currentVal;
  currentVal+=(targetVal-currentVal)*ratio/100;//ESP32のint4バイト...だよね。int2バイトだと容易にオーバーフローしちゃうけど
  dacOut(port,currentVal);
}


を噛ませてやれば、例えばratioに60を与えると
0,1000,1000,1000,1000,1000,1000,....
に対して
0,600,840,936,974,989,995,998,999,999,...
とそんなような出力が得られますがいかが。小細工しないと1000には永遠に届かなかったりするけれど。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/05 13:47

    コメントありがとうございます。

    これが一番実現出来そうな感じがします。

    キャンセル

+2

一定間隔でサンプリングしているとすれば、

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}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/30 19:31 編集

    微分方程式がわからなければ解の指数関数
    V*(1-e^-kt)だけ使えば良いと思います

    キャンセル

  • 2019/02/05 13:49

    ごめんなさい。
    自分で計算式と書いているのにも関わらずその計算式をプログラムに展開する事が出来そうもないです。

    お手間をかけてしまい申し訳ございません。

    キャンセル

  • 2019/02/05 13:54

    一応補足しておくと、
    私の回答と全く同じことをわかりやすく結論だけ書くとthkanaさんの回答になります

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る