Nucleo-F446RE 内蔵の AD/DA を使うためのライブラリ.DA からの出力は,標本化周波数の4倍のレートで行う.AD の読み込みにはソフトウェア割り込みを使用. このライブラリを登録した際のプログラム: Demo_F446_AD_DA_MultirateSWI. Library for built-in ADC and DAC in Nucleo-F446RE using software interrupt for reading ADC. Sampling rate for DAC is four times of that for ADC.
Dependents: F446_UpSampling_LPF_HPF_Variable Demo_F446_AD_DA_MultirateSWI
F446_MultirateSWI.hpp@2:c8aa7ae0012c, 2020-02-09 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sun Feb 09 02:18:32 2020 +0000
- Revision:
- 2:c8aa7ae0012c
- Parent:
- 0:3e5b7187753d
3
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:3e5b7187753d | 1 | //----------------------------------------------------------- |
MikamiUitOpen | 0:3e5b7187753d | 2 | // 出力を 4 倍にアップサンプリングするクラス(ヘッダ) |
MikamiUitOpen | 0:3e5b7187753d | 3 | // Nucleo-F446RE 専用 |
MikamiUitOpen | 0:3e5b7187753d | 4 | // 補間処理で使うフィルタとして,縦続形構成の IIR フィルタを使用 |
MikamiUitOpen | 0:3e5b7187753d | 5 | // |
MikamiUitOpen | 0:3e5b7187753d | 6 | // 入力端子: A0 (PA_0) -- デフォルト |
MikamiUitOpen | 0:3e5b7187753d | 7 | // A1 (PA_1) -- Start() で指定可能 |
MikamiUitOpen | 0:3e5b7187753d | 8 | // 出力端子: A2 (PA_4) |
MikamiUitOpen | 0:3e5b7187753d | 9 | // |
MikamiUitOpen | 0:3e5b7187753d | 10 | // 使用している割り込みと優先順位 |
MikamiUitOpen | 0:3e5b7187753d | 11 | // ADC_IRQn 優先順位: 0, AD 変換終了割り込み |
MikamiUitOpen | 0:3e5b7187753d | 12 | // EXTI4_IRQn 優先順位: 1, ソフトウェア割り込みとして使用 |
MikamiUitOpen | 0:3e5b7187753d | 13 | // |
MikamiUitOpen | 0:3e5b7187753d | 14 | // 2018/10/29, Copyright (c) 2018 MIKAMI, Naoki |
MikamiUitOpen | 0:3e5b7187753d | 15 | //----------------------------------------------------------- |
MikamiUitOpen | 0:3e5b7187753d | 16 | |
MikamiUitOpen | 0:3e5b7187753d | 17 | #include "mbed.h" |
MikamiUitOpen | 0:3e5b7187753d | 18 | #include "F446_ADC.hpp" |
MikamiUitOpen | 0:3e5b7187753d | 19 | #include "F446_DAC.hpp" |
MikamiUitOpen | 0:3e5b7187753d | 20 | #include "IIR_Cascade.hpp" |
MikamiUitOpen | 0:3e5b7187753d | 21 | |
MikamiUitOpen | 0:3e5b7187753d | 22 | #ifndef F446_MULTIRATE_SWI_HPP |
MikamiUitOpen | 0:3e5b7187753d | 23 | #define F446_MULTIRATE_SWI_HPP |
MikamiUitOpen | 0:3e5b7187753d | 24 | |
MikamiUitOpen | 0:3e5b7187753d | 25 | namespace Mikami |
MikamiUitOpen | 0:3e5b7187753d | 26 | { |
MikamiUitOpen | 0:3e5b7187753d | 27 | class F446_MultirateSWI |
MikamiUitOpen | 0:3e5b7187753d | 28 | { |
MikamiUitOpen | 0:3e5b7187753d | 29 | public: |
MikamiUitOpen | 0:3e5b7187753d | 30 | // コンストラクタ |
MikamiUitOpen | 0:3e5b7187753d | 31 | // コンストラクタの引数を与えない場合はデフォルトのフィルタを使用 |
MikamiUitOpen | 0:3e5b7187753d | 32 | // order = 0 にすると,補間フィルタなしの状態になる |
MikamiUitOpen | 0:3e5b7187753d | 33 | F446_MultirateSWI(int order = -1, const Biquad hk[] = NULL, |
MikamiUitOpen | 0:3e5b7187753d | 34 | float g0 = 1); |
MikamiUitOpen | 0:3e5b7187753d | 35 | |
MikamiUitOpen | 0:3e5b7187753d | 36 | virtual ~F446_MultirateSWI() |
MikamiUitOpen | 0:3e5b7187753d | 37 | { |
MikamiUitOpen | 0:3e5b7187753d | 38 | delete adc_; |
MikamiUitOpen | 0:3e5b7187753d | 39 | delete interpolator_; |
MikamiUitOpen | 0:3e5b7187753d | 40 | } |
MikamiUitOpen | 0:3e5b7187753d | 41 | |
MikamiUitOpen | 0:3e5b7187753d | 42 | // 標本化の実行開始 |
MikamiUitOpen | 0:3e5b7187753d | 43 | // frequency 入力の標本化周波数 |
MikamiUitOpen | 0:3e5b7187753d | 44 | // Func 信号処理を行う割り込みサービス・ルーチン |
MikamiUitOpen | 0:3e5b7187753d | 45 | // pin 入力ピン(デフォルトは A0.A1 の指定も可) |
MikamiUitOpen | 0:3e5b7187753d | 46 | void Start(int frequency, void (*Func)(), PinName pin = A0); |
MikamiUitOpen | 0:3e5b7187753d | 47 | |
MikamiUitOpen | 0:3e5b7187753d | 48 | // AD変換の結果を取り出す |
MikamiUitOpen | 0:3e5b7187753d | 49 | float Input() { return xn_; } |
MikamiUitOpen | 0:3e5b7187753d | 50 | |
MikamiUitOpen | 0:3e5b7187753d | 51 | // 補間用フィルタを実行し,処理結果を出力用バッファへ書き込む |
MikamiUitOpen | 0:3e5b7187753d | 52 | void Output(float yn); |
MikamiUitOpen | 0:3e5b7187753d | 53 | |
MikamiUitOpen | 0:3e5b7187753d | 54 | private: |
MikamiUitOpen | 0:3e5b7187753d | 55 | static const int FACTOR_ = 4; // アップサンプリング倍率:4 倍 |
MikamiUitOpen | 0:3e5b7187753d | 56 | // この倍率は 2 のべき乗にすること |
MikamiUitOpen | 0:3e5b7187753d | 57 | static const int MASK_FACTOR_ = FACTOR_ - 1; |
MikamiUitOpen | 0:3e5b7187753d | 58 | static const int MASK_BUF_ = 2*FACTOR_ - 1; |
MikamiUitOpen | 0:3e5b7187753d | 59 | |
MikamiUitOpen | 0:3e5b7187753d | 60 | static AdcF446 *adc_; // AD変換器のオブジェクトのポインタ |
MikamiUitOpen | 0:3e5b7187753d | 61 | static DacF446 dac_; // DA変換器のオブジェクト |
MikamiUitOpen | 0:3e5b7187753d | 62 | |
MikamiUitOpen | 0:3e5b7187753d | 63 | static Array<float> buf_; // DA変換器に出力するデータ用バッファ |
MikamiUitOpen | 0:3e5b7187753d | 64 | int indexW_; // buf_ へ書き込む際のインデックス |
MikamiUitOpen | 0:3e5b7187753d | 65 | static int indexR_; // buf_ から読み出す際のインデックス |
MikamiUitOpen | 0:3e5b7187753d | 66 | static float xn_; // AD変換器から入力されたデータ |
MikamiUitOpen | 0:3e5b7187753d | 67 | |
MikamiUitOpen | 0:3e5b7187753d | 68 | // 補間用フィルタ用のメンバ |
MikamiUitOpen | 0:3e5b7187753d | 69 | static const Biquad HK_[]; // biquad 部の係数 |
MikamiUitOpen | 0:3e5b7187753d | 70 | static const float G0_; // 利得定数 |
MikamiUitOpen | 0:3e5b7187753d | 71 | IirCascade *interpolator_; // 補間用フィルタのポインタ |
MikamiUitOpen | 0:3e5b7187753d | 72 | |
MikamiUitOpen | 0:3e5b7187753d | 73 | // 引数を 0 ~ (アップサンプリング倍率-1) の間でカウントアップ |
MikamiUitOpen | 0:3e5b7187753d | 74 | static inline int ModCounter(int &index) |
MikamiUitOpen | 0:3e5b7187753d | 75 | { |
MikamiUitOpen | 0:3e5b7187753d | 76 | index = ++index & MASK_BUF_; |
MikamiUitOpen | 0:3e5b7187753d | 77 | return index; |
MikamiUitOpen | 0:3e5b7187753d | 78 | } |
MikamiUitOpen | 0:3e5b7187753d | 79 | |
MikamiUitOpen | 0:3e5b7187753d | 80 | // ADC 変換終了割り込みに対する割り込みサービス・ルーチン |
MikamiUitOpen | 0:3e5b7187753d | 81 | static void AdcIsr(); |
MikamiUitOpen | 0:3e5b7187753d | 82 | }; |
MikamiUitOpen | 0:3e5b7187753d | 83 | } |
MikamiUitOpen | 0:3e5b7187753d | 84 | #endif // F446_MULTIRATE_SWI_HPP |