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.

Dependencies:   Array_Matrix

Dependents:   F446_UpSampling_LPF_HPF_Variable Demo_F446_AD_DA_MultirateSWI

Committer:
MikamiUitOpen
Date:
Sun Feb 09 02:18:32 2020 +0000
Revision:
2:c8aa7ae0012c
Parent:
0:3e5b7187753d
3

Who changed what in which revision?

UserRevisionLine numberNew 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