オシロスコープ

Dependencies:   Array_Matrix mbed SerialTxRxIntr DSP_ADDA_Dual

Committer:
MikamiUitOpen
Date:
Sat Oct 17 10:14:31 2020 +0000
Revision:
0:595c23d6949a
Child:
1:ed6daf25a058
1

Who changed what in which revision?

UserRevisionLine numberNew 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 }