CQエレクトロニクス・セミナ「実習・マイコンを動かしながら学ぶディジタル・フィルタ」で使うプログラムを,入力として STM32F746 の内蔵 ADC を使うように変更したもの. http://seminar.cqpub.co.jp/ccm/ES18-0020
Dependencies: mbed Array_Matrix BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG
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 }
Generated on Sun Jul 17 2022 01:09:34 by 1.7.2