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

Dependencies:   mbed Array_Matrix BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG

F764_Adc/MyFunctions.cpp

Committer:
MikamiUitOpen
Date:
2018-03-12
Revision:
2:dd48e1e59daa
Parent:
0:ab7a35d87173

File content as of revision 2:dd48e1e59daa:

//-----------------------------------------------------
//  内蔵 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_];
    }
}