CQエレクトロニクス・セミナ「実習・マイコンを動かしながら学ぶディジタル・フィルタ」で使うプログラムを,入力として STM32F746 の内蔵 ADC を使うように変更したもの. http://seminar.cqpub.co.jp/ccm/ES18-0020

Dependencies:   mbed Array_Matrix BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

Revision:
0:ab7a35d87173
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/F764_Adc/MyFunctions.cpp	Sat Oct 07 03:28:40 2017 +0000
@@ -0,0 +1,95 @@
+//-----------------------------------------------------
+//  内蔵 ADC を使うための関数等
+//
+//  2017/10/07, Copyright (c) 2017 MIKAMI, Naoki
+//-----------------------------------------------------
+
+#include "MyFunctions.hpp"
+using namespace Mikami;
+
+extern AdcDual_Intr adc_;   // 内蔵 ADC 用(割り込みを使用)
+
+Array<int16_t> buffer1L_, buffer1R_, buffer2L_, buffer2R_;
+
+int32_t nData_;                 // バッファサイズ
+int16_t *inBufL_, *inBufR_;     // 現在使用中の入力バッファに対応
+int16_t *outBufL_, *outBufR_;   // 現在使用中の出力バッファに対応
+int     countIn_, countOut_;    // 入力データ数のカウント用
+int     indexIn_, indexOut_;    // バッファの切り替え用
+int16_t *pingPongL_[2], *pingPongR_[2]; // 2組のバッファに対応するポインタを格納
+
+__IO bool fullIn_;              // 入力バッファが満杯のとき true
+
+// バッファの切り替えで使うインデックスの変更
+void SwitchBuf(int &index) { index = ++index & 0x01; }
+
+// ADC のデータをブロック単位で扱うための初期化
+void AdcInitialize(int32_t size)
+{
+    nData_ = size;
+
+    buffer1L_.SetSize(nData_);
+    buffer1R_.SetSize(nData_);
+    buffer2L_.SetSize(nData_);
+    buffer2R_.SetSize(nData_);
+
+    countIn_ = countOut_ = 0;
+    indexIn_ = indexOut_ = 0;    // バッファの切り替え用
+
+    pingPongL_[0] = buffer1L_;
+    pingPongL_[1] = buffer2L_;
+    pingPongR_[0] = buffer1R_;
+    pingPongR_[1] = buffer2R_;
+            
+    inBufL_ = pingPongL_[indexIn_];
+    inBufR_ = pingPongR_[indexIn_];
+    outBufL_ = pingPongL_[indexOut_];
+    outBufR_ = pingPongR_[indexOut_];
+
+    fullIn_ = false;
+    adc_.SetIntrVec(&AdcIsr);   // ADC の割り込みベクタに ISR を割り当て
+    adc_.EnableAdcIntr();       // ADC 終了割込みを有効にする
+}
+
+// ADC 終了割り込みに対する ISR (割り込みサービスルーチン)
+void AdcIsr()
+{
+    uint16_t sn1, sn2;
+
+    adc_.Read(sn1, sn2);
+    inBufL_[countIn_] = sn1 - 2048;
+    inBufR_[countIn_++] = sn2 - 2048;
+
+    if (countIn_ == nData_)
+    {
+        fullIn_ = true;
+        countIn_ = 0;           // 入力バッファの先頭を指す
+        SwitchBuf(indexIn_);    // 入力バッファのインデックスを切り替える
+        inBufL_ = pingPongL_[indexIn_];
+        inBufR_ = pingPongR_[indexIn_];
+    }
+}
+
+// 入力バッファが満杯かどうか調べる,満杯であれば true を返す
+bool IsAdcBufferFull()
+{
+    if (!fullIn_) return false;
+
+    fullIn_ = false;
+    return true;
+}
+
+// AD 変換されたデータを取り出す
+void GetSignal(int16_t &sn1, int16_t &sn2)
+{
+    sn1 = outBufL_[countOut_];
+    sn2 = outBufR_[countOut_++];
+
+    if (countOut_ == nData_)
+    {
+        countOut_ = 0;
+        SwitchBuf(indexOut_);
+        outBufL_ = pingPongL_[indexOut_];
+        outBufR_ = pingPongR_[indexOut_];
+    }
+}