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

Dependencies:   mbed Array_Matrix BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MyFunctions.cpp Source File

MyFunctions.cpp

00001 //-----------------------------------------------------
00002 //  内蔵 ADC を使うための関数等
00003 //
00004 //  2017/10/07, Copyright (c) 2017 MIKAMI, Naoki
00005 //-----------------------------------------------------
00006 
00007 #include "MyFunctions.hpp"
00008 using namespace Mikami;
00009 
00010 extern AdcDual_Intr adc_;   // 内蔵 ADC 用(割り込みを使用)
00011 
00012 Array<int16_t> buffer1L_, buffer1R_, buffer2L_, buffer2R_;
00013 
00014 int32_t nData_;                 // バッファサイズ
00015 int16_t *inBufL_, *inBufR_;     // 現在使用中の入力バッファに対応
00016 int16_t *outBufL_, *outBufR_;   // 現在使用中の出力バッファに対応
00017 int     countIn_, countOut_;    // 入力データ数のカウント用
00018 int     indexIn_, indexOut_;    // バッファの切り替え用
00019 int16_t *pingPongL_[2], *pingPongR_[2]; // 2組のバッファに対応するポインタを格納
00020 
00021 __IO bool fullIn_;              // 入力バッファが満杯のとき true
00022 
00023 // バッファの切り替えで使うインデックスの変更
00024 void SwitchBuf(int &index) { index = ++index & 0x01; }
00025 
00026 // ADC のデータをブロック単位で扱うための初期化
00027 void AdcInitialize(int32_t size)
00028 {
00029     nData_ = size;
00030 
00031     buffer1L_.SetSize(nData_);
00032     buffer1R_.SetSize(nData_);
00033     buffer2L_.SetSize(nData_);
00034     buffer2R_.SetSize(nData_);
00035 
00036     countIn_ = countOut_ = 0;
00037     indexIn_ = indexOut_ = 0;    // バッファの切り替え用
00038 
00039     pingPongL_[0] = buffer1L_;
00040     pingPongL_[1] = buffer2L_;
00041     pingPongR_[0] = buffer1R_;
00042     pingPongR_[1] = buffer2R_;
00043             
00044     inBufL_ = pingPongL_[indexIn_];
00045     inBufR_ = pingPongR_[indexIn_];
00046     outBufL_ = pingPongL_[indexOut_];
00047     outBufR_ = pingPongR_[indexOut_];
00048 
00049     fullIn_ = false;
00050     adc_.SetIntrVec(&AdcIsr);   // ADC の割り込みベクタに ISR を割り当て
00051     adc_.EnableAdcIntr();       // ADC 終了割込みを有効にする
00052 }
00053 
00054 // ADC 終了割り込みに対する ISR (割り込みサービスルーチン)
00055 void AdcIsr()
00056 {
00057     uint16_t sn1, sn2;
00058 
00059     adc_.Read(sn1, sn2);
00060     inBufL_[countIn_] = sn1 - 2048;
00061     inBufR_[countIn_++] = sn2 - 2048;
00062 
00063     if (countIn_ == nData_)
00064     {
00065         fullIn_ = true;
00066         countIn_ = 0;           // 入力バッファの先頭を指す
00067         SwitchBuf(indexIn_);    // 入力バッファのインデックスを切り替える
00068         inBufL_ = pingPongL_[indexIn_];
00069         inBufR_ = pingPongR_[indexIn_];
00070     }
00071 }
00072 
00073 // 入力バッファが満杯かどうか調べる,満杯であれば true を返す
00074 bool IsAdcBufferFull()
00075 {
00076     if (!fullIn_) return false;
00077 
00078     fullIn_ = false;
00079     return true;
00080 }
00081 
00082 // AD 変換されたデータを取り出す
00083 void GetSignal(int16_t &sn1, int16_t &sn2)
00084 {
00085     sn1 = outBufL_[countOut_];
00086     sn2 = outBufR_[countOut_++];
00087 
00088     if (countOut_ == nData_)
00089     {
00090         countOut_ = 0;
00091         SwitchBuf(indexOut_);
00092         outBufL_ = pingPongL_[indexOut_];
00093         outBufR_ = pingPongR_[indexOut_];
00094     }
00095 }