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

Dependencies:   mbed Array_Matrix BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

Committer:
MikamiUitOpen
Date:
Mon Mar 12 05:10:31 2018 +0000
Revision:
2:dd48e1e59daa
Parent:
0:ab7a35d87173
3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:ab7a35d87173 1 //-----------------------------------------------------
MikamiUitOpen 0:ab7a35d87173 2 // 内蔵 ADC を使うための関数等
MikamiUitOpen 0:ab7a35d87173 3 //
MikamiUitOpen 0:ab7a35d87173 4 // 2017/10/07, Copyright (c) 2017 MIKAMI, Naoki
MikamiUitOpen 0:ab7a35d87173 5 //-----------------------------------------------------
MikamiUitOpen 0:ab7a35d87173 6
MikamiUitOpen 0:ab7a35d87173 7 #include "MyFunctions.hpp"
MikamiUitOpen 0:ab7a35d87173 8 using namespace Mikami;
MikamiUitOpen 0:ab7a35d87173 9
MikamiUitOpen 0:ab7a35d87173 10 extern AdcDual_Intr adc_; // 内蔵 ADC 用(割り込みを使用)
MikamiUitOpen 0:ab7a35d87173 11
MikamiUitOpen 0:ab7a35d87173 12 Array<int16_t> buffer1L_, buffer1R_, buffer2L_, buffer2R_;
MikamiUitOpen 0:ab7a35d87173 13
MikamiUitOpen 0:ab7a35d87173 14 int32_t nData_; // バッファサイズ
MikamiUitOpen 0:ab7a35d87173 15 int16_t *inBufL_, *inBufR_; // 現在使用中の入力バッファに対応
MikamiUitOpen 0:ab7a35d87173 16 int16_t *outBufL_, *outBufR_; // 現在使用中の出力バッファに対応
MikamiUitOpen 0:ab7a35d87173 17 int countIn_, countOut_; // 入力データ数のカウント用
MikamiUitOpen 0:ab7a35d87173 18 int indexIn_, indexOut_; // バッファの切り替え用
MikamiUitOpen 0:ab7a35d87173 19 int16_t *pingPongL_[2], *pingPongR_[2]; // 2組のバッファに対応するポインタを格納
MikamiUitOpen 0:ab7a35d87173 20
MikamiUitOpen 0:ab7a35d87173 21 __IO bool fullIn_; // 入力バッファが満杯のとき true
MikamiUitOpen 0:ab7a35d87173 22
MikamiUitOpen 0:ab7a35d87173 23 // バッファの切り替えで使うインデックスの変更
MikamiUitOpen 0:ab7a35d87173 24 void SwitchBuf(int &index) { index = ++index & 0x01; }
MikamiUitOpen 0:ab7a35d87173 25
MikamiUitOpen 0:ab7a35d87173 26 // ADC のデータをブロック単位で扱うための初期化
MikamiUitOpen 0:ab7a35d87173 27 void AdcInitialize(int32_t size)
MikamiUitOpen 0:ab7a35d87173 28 {
MikamiUitOpen 0:ab7a35d87173 29 nData_ = size;
MikamiUitOpen 0:ab7a35d87173 30
MikamiUitOpen 0:ab7a35d87173 31 buffer1L_.SetSize(nData_);
MikamiUitOpen 0:ab7a35d87173 32 buffer1R_.SetSize(nData_);
MikamiUitOpen 0:ab7a35d87173 33 buffer2L_.SetSize(nData_);
MikamiUitOpen 0:ab7a35d87173 34 buffer2R_.SetSize(nData_);
MikamiUitOpen 0:ab7a35d87173 35
MikamiUitOpen 0:ab7a35d87173 36 countIn_ = countOut_ = 0;
MikamiUitOpen 0:ab7a35d87173 37 indexIn_ = indexOut_ = 0; // バッファの切り替え用
MikamiUitOpen 0:ab7a35d87173 38
MikamiUitOpen 0:ab7a35d87173 39 pingPongL_[0] = buffer1L_;
MikamiUitOpen 0:ab7a35d87173 40 pingPongL_[1] = buffer2L_;
MikamiUitOpen 0:ab7a35d87173 41 pingPongR_[0] = buffer1R_;
MikamiUitOpen 0:ab7a35d87173 42 pingPongR_[1] = buffer2R_;
MikamiUitOpen 0:ab7a35d87173 43
MikamiUitOpen 0:ab7a35d87173 44 inBufL_ = pingPongL_[indexIn_];
MikamiUitOpen 0:ab7a35d87173 45 inBufR_ = pingPongR_[indexIn_];
MikamiUitOpen 0:ab7a35d87173 46 outBufL_ = pingPongL_[indexOut_];
MikamiUitOpen 0:ab7a35d87173 47 outBufR_ = pingPongR_[indexOut_];
MikamiUitOpen 0:ab7a35d87173 48
MikamiUitOpen 0:ab7a35d87173 49 fullIn_ = false;
MikamiUitOpen 0:ab7a35d87173 50 adc_.SetIntrVec(&AdcIsr); // ADC の割り込みベクタに ISR を割り当て
MikamiUitOpen 0:ab7a35d87173 51 adc_.EnableAdcIntr(); // ADC 終了割込みを有効にする
MikamiUitOpen 0:ab7a35d87173 52 }
MikamiUitOpen 0:ab7a35d87173 53
MikamiUitOpen 0:ab7a35d87173 54 // ADC 終了割り込みに対する ISR (割り込みサービスルーチン)
MikamiUitOpen 0:ab7a35d87173 55 void AdcIsr()
MikamiUitOpen 0:ab7a35d87173 56 {
MikamiUitOpen 0:ab7a35d87173 57 uint16_t sn1, sn2;
MikamiUitOpen 0:ab7a35d87173 58
MikamiUitOpen 0:ab7a35d87173 59 adc_.Read(sn1, sn2);
MikamiUitOpen 0:ab7a35d87173 60 inBufL_[countIn_] = sn1 - 2048;
MikamiUitOpen 0:ab7a35d87173 61 inBufR_[countIn_++] = sn2 - 2048;
MikamiUitOpen 0:ab7a35d87173 62
MikamiUitOpen 0:ab7a35d87173 63 if (countIn_ == nData_)
MikamiUitOpen 0:ab7a35d87173 64 {
MikamiUitOpen 0:ab7a35d87173 65 fullIn_ = true;
MikamiUitOpen 0:ab7a35d87173 66 countIn_ = 0; // 入力バッファの先頭を指す
MikamiUitOpen 0:ab7a35d87173 67 SwitchBuf(indexIn_); // 入力バッファのインデックスを切り替える
MikamiUitOpen 0:ab7a35d87173 68 inBufL_ = pingPongL_[indexIn_];
MikamiUitOpen 0:ab7a35d87173 69 inBufR_ = pingPongR_[indexIn_];
MikamiUitOpen 0:ab7a35d87173 70 }
MikamiUitOpen 0:ab7a35d87173 71 }
MikamiUitOpen 0:ab7a35d87173 72
MikamiUitOpen 0:ab7a35d87173 73 // 入力バッファが満杯かどうか調べる,満杯であれば true を返す
MikamiUitOpen 0:ab7a35d87173 74 bool IsAdcBufferFull()
MikamiUitOpen 0:ab7a35d87173 75 {
MikamiUitOpen 0:ab7a35d87173 76 if (!fullIn_) return false;
MikamiUitOpen 0:ab7a35d87173 77
MikamiUitOpen 0:ab7a35d87173 78 fullIn_ = false;
MikamiUitOpen 0:ab7a35d87173 79 return true;
MikamiUitOpen 0:ab7a35d87173 80 }
MikamiUitOpen 0:ab7a35d87173 81
MikamiUitOpen 0:ab7a35d87173 82 // AD 変換されたデータを取り出す
MikamiUitOpen 0:ab7a35d87173 83 void GetSignal(int16_t &sn1, int16_t &sn2)
MikamiUitOpen 0:ab7a35d87173 84 {
MikamiUitOpen 0:ab7a35d87173 85 sn1 = outBufL_[countOut_];
MikamiUitOpen 0:ab7a35d87173 86 sn2 = outBufR_[countOut_++];
MikamiUitOpen 0:ab7a35d87173 87
MikamiUitOpen 0:ab7a35d87173 88 if (countOut_ == nData_)
MikamiUitOpen 0:ab7a35d87173 89 {
MikamiUitOpen 0:ab7a35d87173 90 countOut_ = 0;
MikamiUitOpen 0:ab7a35d87173 91 SwitchBuf(indexOut_);
MikamiUitOpen 0:ab7a35d87173 92 outBufL_ = pingPongL_[indexOut_];
MikamiUitOpen 0:ab7a35d87173 93 outBufR_ = pingPongR_[indexOut_];
MikamiUitOpen 0:ab7a35d87173 94 }
MikamiUitOpen 0:ab7a35d87173 95 }