オシロスコープ. このプログラムの説明は,CQ出版社「トランジスタ技術」の2021年10月号から開始された連載記事「STM32マイコンではじめるPC計測」の中にあります.このプログラムといっしょに使うPC側のプログラムについても同誌を参照してください.

Dependencies:   Array_Matrix mbed SerialTxRxIntr DSP_ADDA_Dual

Committer:
MikamiUitOpen
Date:
Thu Sep 09 08:47:03 2021 +0000
Revision:
0:4440ad009afe
1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:4440ad009afe 1 //---------------------------------------------------------------------
MikamiUitOpen 0:4440ad009afe 2 // オシロスコープ (Nucleo-F446RE 用)
MikamiUitOpen 0:4440ad009afe 3 // ● 入力 A0: チャンネル1,A1 チャンネル2
MikamiUitOpen 0:4440ad009afe 4 //
MikamiUitOpen 0:4440ad009afe 5 // 2021/07/19, Copyright (c) 2021 MIKAMI, Naoki
MikamiUitOpen 0:4440ad009afe 6 //---------------------------------------------------------------------
MikamiUitOpen 0:4440ad009afe 7
MikamiUitOpen 0:4440ad009afe 8 #include <string>
MikamiUitOpen 0:4440ad009afe 9 #include "DSP_AdcDualIntr.hpp"
MikamiUitOpen 0:4440ad009afe 10 #include "InputBuffer.hpp"
MikamiUitOpen 0:4440ad009afe 11 #include "XferWaveform.hpp"
MikamiUitOpen 0:4440ad009afe 12 using namespace Mikami;
MikamiUitOpen 0:4440ad009afe 13
MikamiUitOpen 0:4440ad009afe 14 #ifndef __STM32F446xx_H
MikamiUitOpen 0:4440ad009afe 15 #error "Use Nucleo-F446RE"
MikamiUitOpen 0:4440ad009afe 16 #endif
MikamiUitOpen 0:4440ad009afe 17
MikamiUitOpen 0:4440ad009afe 18 const int N_FRAME_ = 1000; // 1フレーム当たり標本化するデータ数
MikamiUitOpen 0:4440ad009afe 19
MikamiUitOpen 0:4440ad009afe 20 DspAdcDualIntr myAdc_(100, A0, A1);
MikamiUitOpen 0:4440ad009afe 21 InputBuffer buf_(N_FRAME_); // AD の結果を保存するバッファ
MikamiUitOpen 0:4440ad009afe 22
MikamiUitOpen 0:4440ad009afe 23 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン
MikamiUitOpen 0:4440ad009afe 24 void AdcIsr()
MikamiUitOpen 0:4440ad009afe 25 {
MikamiUitOpen 0:4440ad009afe 26 float sn1, sn2;
MikamiUitOpen 0:4440ad009afe 27 myAdc_.Read(sn1, sn2);
MikamiUitOpen 0:4440ad009afe 28 buf_.Store(sn1, sn2); // バッファへ格納
MikamiUitOpen 0:4440ad009afe 29 if (buf_.IsFullNext()) // バッファが満杯になったら ADC 割り込みを禁止する
MikamiUitOpen 0:4440ad009afe 30 myAdc_.DisableIntr();
MikamiUitOpen 0:4440ad009afe 31 }
MikamiUitOpen 0:4440ad009afe 32
MikamiUitOpen 0:4440ad009afe 33 int main()
MikamiUitOpen 0:4440ad009afe 34 {
MikamiUitOpen 0:4440ad009afe 35 SerialRxTxIntr rxTx; // PC との通信用,最初は 9600 baud
MikamiUitOpen 0:4440ad009afe 36 XferWaveform tx(rxTx, 2*N_FRAME_); // PC に転送するためのオブジェクトの生成
MikamiUitOpen 0:4440ad009afe 37
MikamiUitOpen 0:4440ad009afe 38 myAdc_.SetIntrVec(&AdcIsr); // AD変換終了割り込みの割り当て
MikamiUitOpen 0:4440ad009afe 39 myAdc_.DisableIntr();
MikamiUitOpen 0:4440ad009afe 40 while (true)
MikamiUitOpen 0:4440ad009afe 41 {
MikamiUitOpen 0:4440ad009afe 42 // PC からのコマンドの解析
MikamiUitOpen 0:4440ad009afe 43 if (rxTx.IsEol()) // 受信バッファのデータが有効になった場合の処理
MikamiUitOpen 0:4440ad009afe 44 {
MikamiUitOpen 0:4440ad009afe 45 string str = rxTx.GetBuffer();
MikamiUitOpen 0:4440ad009afe 46 if (str == "Oscilloscope")
MikamiUitOpen 0:4440ad009afe 47 {
MikamiUitOpen 0:4440ad009afe 48 rxTx.TxString("ACK\n"); // PC からの "Oscilloscope" 受信に対して"ACK" を送信
MikamiUitOpen 0:4440ad009afe 49 wait_ms(10);
MikamiUitOpen 0:4440ad009afe 50 rxTx.Baud(460800); // 以降は 460,800 baud
MikamiUitOpen 0:4440ad009afe 51 }
MikamiUitOpen 0:4440ad009afe 52 else if (str.substr(0, 2) == "GO")
MikamiUitOpen 0:4440ad009afe 53 {
MikamiUitOpen 0:4440ad009afe 54 // str の [2..5] の内容:標本化周波数
MikamiUitOpen 0:4440ad009afe 55 int fs = atoi(str.substr(2, 4).c_str()); // 標本化周波数
MikamiUitOpen 0:4440ad009afe 56 myAdc_.SetFs(fs); // 標本化周波数再設定
MikamiUitOpen 0:4440ad009afe 57 myAdc_.EnableIntr(); // ADC 割り込みを有効にする
MikamiUitOpen 0:4440ad009afe 58 }
MikamiUitOpen 0:4440ad009afe 59 }
MikamiUitOpen 0:4440ad009afe 60
MikamiUitOpen 0:4440ad009afe 61 if (buf_.IsFull())
MikamiUitOpen 0:4440ad009afe 62 tx.ToPC(buf_.Get()); // データを PC へ転送
MikamiUitOpen 0:4440ad009afe 63 }
MikamiUitOpen 0:4440ad009afe 64 }