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.
Dependents: F446_UpSampling_GraphicEqualizer F446_UpSampling_ReverbSystem F446_UpSampling_FrqShifter_Weaver Demo_F446_AD_DA_Multirate ... more
F446_Multirate.hpp@2:b55ae17ffd92, 2018-05-19 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sat May 19 04:37:02 2018 +0000
- Revision:
- 2:b55ae17ffd92
- Parent:
- 0:2447a7d225b1
- Child:
- 3:285cebe5823c
3
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:2447a7d225b1 | 1 | //--------------------------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 2 | // 出力を 4 倍にアップサンプリングするクラス(ヘッダ) |
MikamiUitOpen | 0:2447a7d225b1 | 3 | // Nucleo-F446RE 専用 |
MikamiUitOpen | 0:2447a7d225b1 | 4 | // |
MikamiUitOpen | 0:2447a7d225b1 | 5 | // 入力端子: A0 (PA_0) |
MikamiUitOpen | 0:2447a7d225b1 | 6 | // 出力端子: A2 (PA_4) |
MikamiUitOpen | 0:2447a7d225b1 | 7 | // |
MikamiUitOpen | 2:b55ae17ffd92 | 8 | // 2018/05/19, Copyright (c) 2018 MIKAMI, Naoki |
MikamiUitOpen | 0:2447a7d225b1 | 9 | //--------------------------------------------------- |
MikamiUitOpen | 0:2447a7d225b1 | 10 | |
MikamiUitOpen | 0:2447a7d225b1 | 11 | #include "mbed.h" |
MikamiUitOpen | 0:2447a7d225b1 | 12 | #include "F446_ADC.hpp" |
MikamiUitOpen | 0:2447a7d225b1 | 13 | #include "F446_DAC.hpp" |
MikamiUitOpen | 0:2447a7d225b1 | 14 | #include "IIR_Cascade.hpp" |
MikamiUitOpen | 0:2447a7d225b1 | 15 | |
MikamiUitOpen | 0:2447a7d225b1 | 16 | #ifndef F446_MULTIRATE_HPP |
MikamiUitOpen | 0:2447a7d225b1 | 17 | #define F446_MULTIRATE_HPP |
MikamiUitOpen | 0:2447a7d225b1 | 18 | |
MikamiUitOpen | 0:2447a7d225b1 | 19 | namespace Mikami |
MikamiUitOpen | 0:2447a7d225b1 | 20 | { |
MikamiUitOpen | 0:2447a7d225b1 | 21 | class F446_Multirate |
MikamiUitOpen | 0:2447a7d225b1 | 22 | { |
MikamiUitOpen | 0:2447a7d225b1 | 23 | public: |
MikamiUitOpen | 0:2447a7d225b1 | 24 | // コンストラクタ |
MikamiUitOpen | 0:2447a7d225b1 | 25 | F446_Multirate(); |
MikamiUitOpen | 0:2447a7d225b1 | 26 | |
MikamiUitOpen | 0:2447a7d225b1 | 27 | virtual ~F446_Multirate() |
MikamiUitOpen | 0:2447a7d225b1 | 28 | { |
MikamiUitOpen | 0:2447a7d225b1 | 29 | delete adc_; |
MikamiUitOpen | 0:2447a7d225b1 | 30 | delete interpolator_; |
MikamiUitOpen | 0:2447a7d225b1 | 31 | } |
MikamiUitOpen | 0:2447a7d225b1 | 32 | |
MikamiUitOpen | 2:b55ae17ffd92 | 33 | // 標本化の実行開始 |
MikamiUitOpen | 0:2447a7d225b1 | 34 | // frequency: 入力の標本化周波数 |
MikamiUitOpen | 2:b55ae17ffd92 | 35 | void Start(int frequency); |
MikamiUitOpen | 0:2447a7d225b1 | 36 | |
MikamiUitOpen | 0:2447a7d225b1 | 37 | // AD変換の結果を取り出す |
MikamiUitOpen | 0:2447a7d225b1 | 38 | float Input(); |
MikamiUitOpen | 0:2447a7d225b1 | 39 | |
MikamiUitOpen | 0:2447a7d225b1 | 40 | // 補間用フィルタを実行し,処理結果を出力用バッファへ書き込む |
MikamiUitOpen | 0:2447a7d225b1 | 41 | void Output(float yn); |
MikamiUitOpen | 0:2447a7d225b1 | 42 | |
MikamiUitOpen | 0:2447a7d225b1 | 43 | private: |
MikamiUitOpen | 0:2447a7d225b1 | 44 | static const int FACTOR_ = 4; // アップサンプリング倍率:4 倍 |
MikamiUitOpen | 0:2447a7d225b1 | 45 | // この倍率は 2 のべき乗にすること |
MikamiUitOpen | 0:2447a7d225b1 | 46 | static const int MASK_FACTOR_ = FACTOR_ - 1; |
MikamiUitOpen | 0:2447a7d225b1 | 47 | static const int MASK_BUF_ = 2*FACTOR_ - 1; |
MikamiUitOpen | 0:2447a7d225b1 | 48 | |
MikamiUitOpen | 0:2447a7d225b1 | 49 | IirCascade *interpolator_; // 補間用フィルタのポインタ |
MikamiUitOpen | 0:2447a7d225b1 | 50 | static AdcF446 *adc_; // AD変換器のオブジェクトのポインタ |
MikamiUitOpen | 0:2447a7d225b1 | 51 | static DacF446 dac_; // DA変換器のオブジェクト |
MikamiUitOpen | 0:2447a7d225b1 | 52 | |
MikamiUitOpen | 0:2447a7d225b1 | 53 | static Array<float> buf_; // DA変換器に出力するデータ用バッファ |
MikamiUitOpen | 0:2447a7d225b1 | 54 | int indexW_; // buf_ へ書き込む際のインデックス |
MikamiUitOpen | 0:2447a7d225b1 | 55 | static int indexR_; // buf_ から読み出す際のインデックス |
MikamiUitOpen | 0:2447a7d225b1 | 56 | static float xn_; // AD変換器から入力されたデータ |
MikamiUitOpen | 0:2447a7d225b1 | 57 | static __IO bool okIn_; // AD変換されたデータが使える場合に true となる |
MikamiUitOpen | 0:2447a7d225b1 | 58 | |
MikamiUitOpen | 0:2447a7d225b1 | 59 | // 引数を 0 ~ (アップサンプリング倍率-1) の間でカウントアップ |
MikamiUitOpen | 0:2447a7d225b1 | 60 | static inline int ModCounter(int &index) |
MikamiUitOpen | 0:2447a7d225b1 | 61 | { |
MikamiUitOpen | 0:2447a7d225b1 | 62 | index = ++index & MASK_BUF_; |
MikamiUitOpen | 0:2447a7d225b1 | 63 | return index; |
MikamiUitOpen | 0:2447a7d225b1 | 64 | } |
MikamiUitOpen | 0:2447a7d225b1 | 65 | // ADC 変換終了割り込みに対する割り込みサービス・ルーチン |
MikamiUitOpen | 0:2447a7d225b1 | 66 | static void AdcIsr(); |
MikamiUitOpen | 0:2447a7d225b1 | 67 | }; |
MikamiUitOpen | 0:2447a7d225b1 | 68 | } |
MikamiUitOpen | 0:2447a7d225b1 | 69 | #endif // F446_MULTIRATE_HPP |