Nucleo-F446 による遮断周波数可変 LPF/HPF .DA変換器にデータを送る際は 4 倍にアップ・サンプリング.

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_MultirateSWI

Committer:
MikamiUitOpen
Date:
Sun Jun 30 02:21:43 2019 +0000
Revision:
8:da8bdc49f7ad
Parent:
6:02743f6a1595
8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:89d173001e82 1 //----------------------------------------------------------------------
MikamiUitOpen 0:89d173001e82 2 // 遮断周波数可変 IIR フィルタ(LPF, HPF)
MikamiUitOpen 0:89d173001e82 3 //
MikamiUitOpen 2:03973d4684cb 4 // PC 側のプログラム: F446_LPF_HPF_Variable
MikamiUitOpen 0:89d173001e82 5 // 周波数特性が PC の画面に表示され,その上のカーソルをマウスでドラッグすることで,
MikamiUitOpen 0:89d173001e82 6 // 遮断周波数を変えられる
MikamiUitOpen 0:89d173001e82 7 //
MikamiUitOpen 8:da8bdc49f7ad 8 // 2019/06/30, Copyright (c) 2019 MIKAMI, Naoki
MikamiUitOpen 0:89d173001e82 9 //----------------------------------------------------------------------
MikamiUitOpen 0:89d173001e82 10
MikamiUitOpen 0:89d173001e82 11 #include "main.hpp"
MikamiUitOpen 0:89d173001e82 12 using namespace Mikami;
MikamiUitOpen 0:89d173001e82 13
MikamiUitOpen 0:89d173001e82 14 // 出力標本化周波数を4倍にするオブジェクト
MikamiUitOpen 6:02743f6a1595 15 F446_MultirateSWI myAdDa_(ORDER_SM_, HK_SM_, G0_SM_);
MikamiUitOpen 0:89d173001e82 16 // Serial クラスの受信割込み用オブジェクト
MikamiUitOpen 2:03973d4684cb 17 SerialRxTxIntr rx_;
MikamiUitOpen 6:02743f6a1595 18
MikamiUitOpen 8:da8bdc49f7ad 19 // 10 次の IIR フィルタ
MikamiUitOpen 6:02743f6a1595 20 const int ORDER_ = 10;
MikamiUitOpen 6:02743f6a1595 21 Biquad myBiquad_[ORDER_/2];
MikamiUitOpen 6:02743f6a1595 22 IirCascade iir8_(ORDER_, myBiquad_); // IIR 縦続形のオブジェクト
MikamiUitOpen 6:02743f6a1595 23
MikamiUitOpen 6:02743f6a1595 24 bool on_ = true; // フィルタ処理の有効/無効を決める変数
MikamiUitOpen 0:89d173001e82 25
MikamiUitOpen 6:02743f6a1595 26 // LPF/HPF の処理(割り込みサービス・ルーチン)
MikamiUitOpen 6:02743f6a1595 27 void LpfHpf()
MikamiUitOpen 6:02743f6a1595 28 {
MikamiUitOpen 6:02743f6a1595 29 float xn = myAdDa_.Input(); // 入力
MikamiUitOpen 6:02743f6a1595 30 float yn = iir8_.Execute(xn); // IIR フィルタの実行
MikamiUitOpen 6:02743f6a1595 31 myAdDa_.Output(on_ ? yn : xn); // 出力
MikamiUitOpen 6:02743f6a1595 32 }
MikamiUitOpen 6:02743f6a1595 33
MikamiUitOpen 0:89d173001e82 34 int main()
MikamiUitOpen 0:89d173001e82 35 {
MikamiUitOpen 6:02743f6a1595 36 // 次の割り込み優先順位の設定を忘れないこと
MikamiUitOpen 6:02743f6a1595 37 NVIC_SetPriority(USART2_IRQn, 2); // USART2 割り込み:SWI の次に優先
MikamiUitOpen 0:89d173001e82 38
MikamiUitOpen 6:02743f6a1595 39 BilinearDesign design(ORDER_, FS_); // フィルタ設計用オブジェクト生成
MikamiUitOpen 6:02743f6a1595 40 Biquad::Coefs coefs[ORDER_/2]; // 設計された係数の格納用
MikamiUitOpen 6:02743f6a1595 41 float g0; // 利得定数
MikamiUitOpen 0:89d173001e82 42 float fc = 1000.0f; // 最初に実行される LPF の遮断周波数
MikamiUitOpen 0:89d173001e82 43 design.Execute(fc, BilinearDesign::LPF, coefs, g0); // LPF
MikamiUitOpen 6:02743f6a1595 44
MikamiUitOpen 6:02743f6a1595 45 iir8_.SetCoefs(ORDER_, coefs, g0); // 最初に実行される LPF の係数を設定
MikamiUitOpen 6:02743f6a1595 46 float fcOld = fc; // 更新する前の遮断周波数
MikamiUitOpen 0:89d173001e82 47
MikamiUitOpen 6:02743f6a1595 48 myAdDa_.Start(FS_, &LpfHpf); // 標本化を開始する
MikamiUitOpen 6:02743f6a1595 49
MikamiUitOpen 0:89d173001e82 50 while (true)
MikamiUitOpen 0:89d173001e82 51 {
MikamiUitOpen 0:89d173001e82 52 // PC からの指令に対応する処理
MikamiUitOpen 0:89d173001e82 53 if (rx_.IsEol()) // 受信バッファのデータが有効になった場合の処理
MikamiUitOpen 0:89d173001e82 54 {
MikamiUitOpen 0:89d173001e82 55 string str = rx_.GetBuffer();
MikamiUitOpen 5:5b2ebdd5698c 56 if (str == "VrFc")
MikamiUitOpen 5:5b2ebdd5698c 57 rx_.Tx("ACK\n"); // "ACK" を送り返す
MikamiUitOpen 5:5b2ebdd5698c 58 else if (str == "ACTIVE")
MikamiUitOpen 6:02743f6a1595 59 on_ = true; // フィルタ処理を有効にする
MikamiUitOpen 5:5b2ebdd5698c 60 else if (str == "THROUGH")
MikamiUitOpen 6:02743f6a1595 61 on_ = false; // フィルタ処理を無効にする
MikamiUitOpen 6:02743f6a1595 62 else // "VrFc", "ACTIVE", "THROUGH" 以外は
MikamiUitOpen 6:02743f6a1595 63 { // int 型の数値に対応する文字列として処理を行う
MikamiUitOpen 0:89d173001e82 64 // PC から送信された遮断周波数を fc に保存
MikamiUitOpen 0:89d173001e82 65 fc = atoi(str.c_str());
MikamiUitOpen 0:89d173001e82 66 // フィルタの係数設計
MikamiUitOpen 0:89d173001e82 67 if (fc > 0) // LPF の係数を設計
MikamiUitOpen 0:89d173001e82 68 design.Execute(fc, BilinearDesign::LPF, coefs, g0);
MikamiUitOpen 0:89d173001e82 69 else // HPF の係数を設計
MikamiUitOpen 0:89d173001e82 70 design.Execute(-fc, BilinearDesign::HPF, coefs, g0);
MikamiUitOpen 0:89d173001e82 71
MikamiUitOpen 0:89d173001e82 72 // 設計されたフィルタ係数の設定
MikamiUitOpen 6:02743f6a1595 73 iir8_.SetCoefs(ORDER_, coefs, g0);
MikamiUitOpen 0:89d173001e82 74
MikamiUitOpen 0:89d173001e82 75 if (fc*fcOld < 0.0f) // LPF と HPF が切り替わった場合
MikamiUitOpen 6:02743f6a1595 76 iir8_.Clear(); // フィルタの遅延器をクリア
MikamiUitOpen 0:89d173001e82 77 fcOld = fc;
MikamiUitOpen 0:89d173001e82 78 }
MikamiUitOpen 0:89d173001e82 79 }
MikamiUitOpen 0:89d173001e82 80 }
MikamiUitOpen 0:89d173001e82 81 }
MikamiUitOpen 5:5b2ebdd5698c 82