Nucleo-F446RE 内蔵の AD/DA を使うためのライブラリ.DA からの出力は,標本化周波数の4倍のレートで行う.  このライブラリを登録した際のプログラム: Demo_F446_AD_DA_Multirate. Library for built-in ADC and DAC in Nucleo-F446RE. Sampling rate for DAC is four times of that for ADC.

Dependencies:   Array_Matrix

Dependents:   F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver Demo_F446_AD_DA_Multirate ... more

Committer:
MikamiUitOpen
Date:
Thu Oct 11 11:42:48 2018 +0000
Revision:
7:6275fe158ae8
Parent:
6:a14d7f0bc3f5
8

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 5:4800dd3838d6 1 //-----------------------------------------------------------
MikamiUitOpen 0:2447a7d225b1 2 // 出力を 4 倍にアップサンプリングするクラス(ヘッダ)
MikamiUitOpen 0:2447a7d225b1 3 // Nucleo-F446RE 専用
MikamiUitOpen 5:4800dd3838d6 4 // 補間処理で使うフィルタとして,縦続形構成の IIR フィルタを使用
MikamiUitOpen 0:2447a7d225b1 5 //
MikamiUitOpen 4:c853feefa216 6 // 入力端子: A0 (PA_0) -- デフォルト
MikamiUitOpen 4:c853feefa216 7 // A1 (PA_1) -- Start() で指定可能
MikamiUitOpen 0:2447a7d225b1 8 // 出力端子: A2 (PA_4)
MikamiUitOpen 0:2447a7d225b1 9 //
MikamiUitOpen 6:a14d7f0bc3f5 10 // <注意>
MikamiUitOpen 6:a14d7f0bc3f5 11 // ● 重い信号処理を実行する場合は正常に動かない場合がある.
MikamiUitOpen 6:a14d7f0bc3f5 12 // ● メンバ関数 Start() を実行した後に,printf() のような重い
MikamiUitOpen 6:a14d7f0bc3f5 13 // 処理を実行すると正常に動かないことがある.
MikamiUitOpen 6:a14d7f0bc3f5 14 //
MikamiUitOpen 7:6275fe158ae8 15 // 2018/10/11, Copyright (c) 2018 MIKAMI, Naoki
MikamiUitOpen 5:4800dd3838d6 16 //-----------------------------------------------------------
MikamiUitOpen 0:2447a7d225b1 17
MikamiUitOpen 0:2447a7d225b1 18 #include "mbed.h"
MikamiUitOpen 0:2447a7d225b1 19 #include "F446_ADC.hpp"
MikamiUitOpen 0:2447a7d225b1 20 #include "F446_DAC.hpp"
MikamiUitOpen 0:2447a7d225b1 21 #include "IIR_Cascade.hpp"
MikamiUitOpen 0:2447a7d225b1 22
MikamiUitOpen 0:2447a7d225b1 23 #ifndef F446_MULTIRATE_HPP
MikamiUitOpen 0:2447a7d225b1 24 #define F446_MULTIRATE_HPP
MikamiUitOpen 0:2447a7d225b1 25
MikamiUitOpen 0:2447a7d225b1 26 namespace Mikami
MikamiUitOpen 0:2447a7d225b1 27 {
MikamiUitOpen 0:2447a7d225b1 28 class F446_Multirate
MikamiUitOpen 0:2447a7d225b1 29 {
MikamiUitOpen 0:2447a7d225b1 30 public:
MikamiUitOpen 0:2447a7d225b1 31 // コンストラクタ
MikamiUitOpen 3:285cebe5823c 32 // コンストラクタの引数を与えない場合はデフォルトのフィルタを使用
MikamiUitOpen 3:285cebe5823c 33 // order = 0 にすると,補間フィルタなしの状態になる
MikamiUitOpen 7:6275fe158ae8 34 F446_Multirate(int order = -1, const Biquad hk[] = NULL,
MikamiUitOpen 3:285cebe5823c 35 float g0 = 1);
MikamiUitOpen 0:2447a7d225b1 36
MikamiUitOpen 0:2447a7d225b1 37 virtual ~F446_Multirate()
MikamiUitOpen 0:2447a7d225b1 38 {
MikamiUitOpen 0:2447a7d225b1 39 delete adc_;
MikamiUitOpen 0:2447a7d225b1 40 delete interpolator_;
MikamiUitOpen 0:2447a7d225b1 41 }
MikamiUitOpen 0:2447a7d225b1 42
MikamiUitOpen 2:b55ae17ffd92 43 // 標本化の実行開始
MikamiUitOpen 4:c853feefa216 44 // frequency 入力の標本化周波数
MikamiUitOpen 4:c853feefa216 45 // pin 入力ピン(デフォルトは A0.A1 の指定も可)
MikamiUitOpen 4:c853feefa216 46 void Start(int frequency, PinName pin = A0);
MikamiUitOpen 0:2447a7d225b1 47
MikamiUitOpen 0:2447a7d225b1 48 // AD変換の結果を取り出す
MikamiUitOpen 0:2447a7d225b1 49 float Input();
MikamiUitOpen 0:2447a7d225b1 50
MikamiUitOpen 0:2447a7d225b1 51 // 補間用フィルタを実行し,処理結果を出力用バッファへ書き込む
MikamiUitOpen 0:2447a7d225b1 52 void Output(float yn);
MikamiUitOpen 0:2447a7d225b1 53
MikamiUitOpen 0:2447a7d225b1 54 private:
MikamiUitOpen 0:2447a7d225b1 55 static const int FACTOR_ = 4; // アップサンプリング倍率:4 倍
MikamiUitOpen 0:2447a7d225b1 56 // この倍率は 2 のべき乗にすること
MikamiUitOpen 0:2447a7d225b1 57 static const int MASK_FACTOR_ = FACTOR_ - 1;
MikamiUitOpen 0:2447a7d225b1 58 static const int MASK_BUF_ = 2*FACTOR_ - 1;
MikamiUitOpen 0:2447a7d225b1 59
MikamiUitOpen 0:2447a7d225b1 60 static AdcF446 *adc_; // AD変換器のオブジェクトのポインタ
MikamiUitOpen 0:2447a7d225b1 61 static DacF446 dac_; // DA変換器のオブジェクト
MikamiUitOpen 0:2447a7d225b1 62
MikamiUitOpen 0:2447a7d225b1 63 static Array<float> buf_; // DA変換器に出力するデータ用バッファ
MikamiUitOpen 0:2447a7d225b1 64 int indexW_; // buf_ へ書き込む際のインデックス
MikamiUitOpen 0:2447a7d225b1 65 static int indexR_; // buf_ から読み出す際のインデックス
MikamiUitOpen 0:2447a7d225b1 66 static float xn_; // AD変換器から入力されたデータ
MikamiUitOpen 0:2447a7d225b1 67 static __IO bool okIn_; // AD変換されたデータが使える場合に true となる
MikamiUitOpen 0:2447a7d225b1 68
MikamiUitOpen 3:285cebe5823c 69 // 補間用フィルタ用のメンバ
MikamiUitOpen 7:6275fe158ae8 70 static const Biquad HK_[]; // biquad 部の係数
MikamiUitOpen 7:6275fe158ae8 71 static const float G0_; // 利得定数
MikamiUitOpen 7:6275fe158ae8 72 IirCascade *interpolator_; // 補間用フィルタのポインタ
MikamiUitOpen 3:285cebe5823c 73
MikamiUitOpen 0:2447a7d225b1 74 // 引数を 0 ~ (アップサンプリング倍率-1) の間でカウントアップ
MikamiUitOpen 0:2447a7d225b1 75 static inline int ModCounter(int &index)
MikamiUitOpen 0:2447a7d225b1 76 {
MikamiUitOpen 0:2447a7d225b1 77 index = ++index & MASK_BUF_;
MikamiUitOpen 0:2447a7d225b1 78 return index;
MikamiUitOpen 0:2447a7d225b1 79 }
MikamiUitOpen 0:2447a7d225b1 80 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン
MikamiUitOpen 0:2447a7d225b1 81 static void AdcIsr();
MikamiUitOpen 0:2447a7d225b1 82 };
MikamiUitOpen 0:2447a7d225b1 83 }
MikamiUitOpen 0:2447a7d225b1 84 #endif // F446_MULTIRATE_HPP