オシロスコープ
Dependencies: Array_Matrix mbed SerialTxRxIntr DSP_ADDA_Dual
main.cpp@0:595c23d6949a, 2020-10-17 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Sat Oct 17 10:14:31 2020 +0000
- Revision:
- 0:595c23d6949a
- Child:
- 1:ed6daf25a058
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:595c23d6949a | 1 | //--------------------------------------------------------------------- |
MikamiUitOpen | 0:595c23d6949a | 2 | // オシロスコープ (Nucleo-F446RE 用) |
MikamiUitOpen | 0:595c23d6949a | 3 | // |
MikamiUitOpen | 0:595c23d6949a | 4 | // ● ST-Link Firmware の V2.J31.M21 で動作確認 |
MikamiUitOpen | 0:595c23d6949a | 5 | // ● ST-Link Firmware のアップグレードには stsw-link07.zip |
MikamiUitOpen | 0:595c23d6949a | 6 | // に含まれている "ST-LinkUpgrade.exe" を使う |
MikamiUitOpen | 0:595c23d6949a | 7 | // |
MikamiUitOpen | 0:595c23d6949a | 8 | // ● PC 側のプログラム: "F446_Oscilloscope" |
MikamiUitOpen | 0:595c23d6949a | 9 | // ● ボーレート: 460800 baud |
MikamiUitOpen | 0:595c23d6949a | 10 | // ● 受信データの文字列の終了マーク: "\r" |
MikamiUitOpen | 0:595c23d6949a | 11 | // |
MikamiUitOpen | 0:595c23d6949a | 12 | // ● 入力 A0: チャンネル1,A1 チャンネル2 |
MikamiUitOpen | 0:595c23d6949a | 13 | // |
MikamiUitOpen | 0:595c23d6949a | 14 | // 2020/10/17, Copyright (c) 2020 MIKAMI, Naoki |
MikamiUitOpen | 0:595c23d6949a | 15 | //--------------------------------------------------------------------- |
MikamiUitOpen | 0:595c23d6949a | 16 | |
MikamiUitOpen | 0:595c23d6949a | 17 | #include "mbed.h" |
MikamiUitOpen | 0:595c23d6949a | 18 | #include <string> |
MikamiUitOpen | 0:595c23d6949a | 19 | #include "Array.hpp" |
MikamiUitOpen | 0:595c23d6949a | 20 | #include "DSP_AdcDualIntr.hpp" |
MikamiUitOpen | 0:595c23d6949a | 21 | #include "InputBuffer.hpp" |
MikamiUitOpen | 0:595c23d6949a | 22 | #include "Xfer.hpp" |
MikamiUitOpen | 0:595c23d6949a | 23 | using namespace Mikami; |
MikamiUitOpen | 0:595c23d6949a | 24 | |
MikamiUitOpen | 0:595c23d6949a | 25 | #ifndef __STM32F446xx_H |
MikamiUitOpen | 0:595c23d6949a | 26 | #error "Use Nucleo-F446RE" |
MikamiUitOpen | 0:595c23d6949a | 27 | #endif |
MikamiUitOpen | 0:595c23d6949a | 28 | |
MikamiUitOpen | 0:595c23d6949a | 29 | const int N_FRAME_ = 1000; // 1フレーム当たり標本化するデータ数 |
MikamiUitOpen | 0:595c23d6949a | 30 | |
MikamiUitOpen | 0:595c23d6949a | 31 | DspAdcDualIntr myAdc_(1000, A0, A1); // 起動時の標本化周波数: 1 MHz |
MikamiUitOpen | 0:595c23d6949a | 32 | InputBuffer<float> buf_(N_FRAME_); // AD の結果を保存するバッファ |
MikamiUitOpen | 0:595c23d6949a | 33 | |
MikamiUitOpen | 0:595c23d6949a | 34 | // ADC 変換終了割り込みに対する割り込みサービス・ルーチン |
MikamiUitOpen | 0:595c23d6949a | 35 | void AdcIsr() |
MikamiUitOpen | 0:595c23d6949a | 36 | { |
MikamiUitOpen | 0:595c23d6949a | 37 | float sn1, sn2; |
MikamiUitOpen | 0:595c23d6949a | 38 | myAdc_.Read(sn1, sn2); |
MikamiUitOpen | 0:595c23d6949a | 39 | buf_.Store(sn1, sn2); // バッファへ格納 |
MikamiUitOpen | 0:595c23d6949a | 40 | if (buf_.IsFullNext()) // バッファが満杯になったら ADC 割り込みを禁止する |
MikamiUitOpen | 0:595c23d6949a | 41 | myAdc_.DisableAdcIntr(); |
MikamiUitOpen | 0:595c23d6949a | 42 | } |
MikamiUitOpen | 0:595c23d6949a | 43 | |
MikamiUitOpen | 0:595c23d6949a | 44 | int main() |
MikamiUitOpen | 0:595c23d6949a | 45 | { |
MikamiUitOpen | 0:595c23d6949a | 46 | SerialRxTxIntr rxTx(32, 115200*4); // PC との通信用 |
MikamiUitOpen | 0:595c23d6949a | 47 | Xfer tx(rxTx, 2*N_FRAME_); // PC に転送するためのオブジェクトの生成 |
MikamiUitOpen | 0:595c23d6949a | 48 | Array<float> sn(2*N_FRAME_); // 転送するデータ |
MikamiUitOpen | 0:595c23d6949a | 49 | |
MikamiUitOpen | 0:595c23d6949a | 50 | NVIC_SetPriority(ADC_IRQn, 0); // AD変換終了割り込みの優先度が最高 |
MikamiUitOpen | 0:595c23d6949a | 51 | NVIC_SetPriority(USART2_IRQn, 1); |
MikamiUitOpen | 0:595c23d6949a | 52 | |
MikamiUitOpen | 0:595c23d6949a | 53 | bool ready = false; // データの変換終了で true |
MikamiUitOpen | 0:595c23d6949a | 54 | bool okGo = false; // "GO" を受信したら true |
MikamiUitOpen | 0:595c23d6949a | 55 | |
MikamiUitOpen | 0:595c23d6949a | 56 | myAdc_.SetIntrVec(&AdcIsr); // AD変換終了割り込みの割り当て |
MikamiUitOpen | 0:595c23d6949a | 57 | while (true) |
MikamiUitOpen | 0:595c23d6949a | 58 | { |
MikamiUitOpen | 0:595c23d6949a | 59 | // PC からのコマンドの解析 |
MikamiUitOpen | 0:595c23d6949a | 60 | if (rxTx.IsEol()) // 受信バッファのデータが有効になった場合の処理 |
MikamiUitOpen | 0:595c23d6949a | 61 | { |
MikamiUitOpen | 0:595c23d6949a | 62 | string str = rxTx.GetBuffer(); |
MikamiUitOpen | 0:595c23d6949a | 63 | if (str == "Oscilloscope") |
MikamiUitOpen | 0:595c23d6949a | 64 | rxTx.TxString("ACK\n"); // PC からの "Oscilloscope" 受信に対して |
MikamiUitOpen | 0:595c23d6949a | 65 | // "ACK" を送信する |
MikamiUitOpen | 0:595c23d6949a | 66 | else if (str.substr(0, 2) == "GO") |
MikamiUitOpen | 0:595c23d6949a | 67 | { |
MikamiUitOpen | 0:595c23d6949a | 68 | // str の内容 |
MikamiUitOpen | 0:595c23d6949a | 69 | // [0] 'G' |
MikamiUitOpen | 0:595c23d6949a | 70 | // [1] 'O' |
MikamiUitOpen | 0:595c23d6949a | 71 | // [2..5] 標本化周波数 |
MikamiUitOpen | 0:595c23d6949a | 72 | |
MikamiUitOpen | 0:595c23d6949a | 73 | int fs = atoi(str.substr(2, 4).c_str()); // 標本化周波数 |
MikamiUitOpen | 0:595c23d6949a | 74 | myAdc_.SetFs(fs); // 標本化周波数再設定 |
MikamiUitOpen | 0:595c23d6949a | 75 | |
MikamiUitOpen | 0:595c23d6949a | 76 | okGo = true; // データの転送要求あり |
MikamiUitOpen | 0:595c23d6949a | 77 | } |
MikamiUitOpen | 0:595c23d6949a | 78 | } |
MikamiUitOpen | 0:595c23d6949a | 79 | |
MikamiUitOpen | 0:595c23d6949a | 80 | if (buf_.IsFull()) // 入力データが満杯の場合,以下の処理を行う |
MikamiUitOpen | 0:595c23d6949a | 81 | { |
MikamiUitOpen | 0:595c23d6949a | 82 | for (int n=0; n<N_FRAME_; n++) |
MikamiUitOpen | 0:595c23d6949a | 83 | { |
MikamiUitOpen | 0:595c23d6949a | 84 | sn[n] = buf_.Get(0, n); |
MikamiUitOpen | 0:595c23d6949a | 85 | sn[n+N_FRAME_] = buf_.Get(1, n); |
MikamiUitOpen | 0:595c23d6949a | 86 | } |
MikamiUitOpen | 0:595c23d6949a | 87 | tx.Convert(sn); |
MikamiUitOpen | 0:595c23d6949a | 88 | ready = true; // データの変換終了 |
MikamiUitOpen | 0:595c23d6949a | 89 | } |
MikamiUitOpen | 0:595c23d6949a | 90 | |
MikamiUitOpen | 0:595c23d6949a | 91 | // 転送要求があり,データの変換が終了している場合に,データを PC へ転送する |
MikamiUitOpen | 0:595c23d6949a | 92 | if (okGo && ready) |
MikamiUitOpen | 0:595c23d6949a | 93 | { |
MikamiUitOpen | 0:595c23d6949a | 94 | tx.ToPC(); // データを PC へ転送 |
MikamiUitOpen | 0:595c23d6949a | 95 | ready = false; |
MikamiUitOpen | 0:595c23d6949a | 96 | okGo = false; |
MikamiUitOpen | 0:595c23d6949a | 97 | |
MikamiUitOpen | 0:595c23d6949a | 98 | myAdc_.EnableAdcIntr(); // ADC 割り込みを有効にする |
MikamiUitOpen | 0:595c23d6949a | 99 | } |
MikamiUitOpen | 0:595c23d6949a | 100 | } |
MikamiUitOpen | 0:595c23d6949a | 101 | } |