Nucleo-F446RE 内蔵の AD/DA を使うためのライブラリ.DA からの出力は,標本化周波数の4倍のレートで行う.出力の補間フィルタには直線位相の FIR フィルタを使用.  このライブラリを登録した際のプログラム: Demo_F446_AD_DA_MultirateLinearPhase. Library for built-in ADC and DAC in Nucleo-F446RE. Sampling rate for DAC is four times of that for ADC. Interpolation filter for output is linear-phase FIR filter.

Dependencies:   Array_Matrix

Dependents:   Demo_F446_AD_DA_MultirateLinearPhase

Committer:
MikamiUitOpen
Date:
Tue Jul 03 01:29:13 2018 +0000
Revision:
0:ad30ac2b412b
1

Who changed what in which revision?

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