PC から,リアルタイム信号処理を行っている Nucleo-F446 を制御する例.

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

Revision:
0:5325ec2b5b02
Child:
1:54515e9b1796
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jul 09 04:17:46 2018 +0000
@@ -0,0 +1,74 @@
+//----------------------------------------------------------------------
+//  NUCLEO-F446RE で アナログ信号の入出力の際に,出力の標本化周波数を,入力の
+//  標本化周波数の4倍にするクラス F446_Multirate を使い,PC からの指令でパラ
+//  メータを変更する例
+//
+//  処理の内容:AD 変換器からの入力に倍率を乗算し DA 変換器に出力する
+//            倍率は PC からの指令で変更する
+//            PC からの指令: 0.00 ~ 1.00 倍
+//            出力は PC からの指令により On/Off の切り替えが可能
+//
+//            "ENQ” を除く PC からの指令については,そのまま PC へ送る
+//
+//  PC 側のプログラム
+//      F446_AD_DA_Ctrl
+//      端末エミュレータでも使用可能
+//
+//  2018/07/09, Copyright (c) 2018 MIKAMI, Naoki
+//----------------------------------------------------------------------
+
+#include "F446_Multirate.hpp"
+#include "SerialRxTxIntr.hpp"
+#include  <cctype>
+#pragma diag_suppress 870   // マルチバイト文字使用の警告抑制のため
+
+using namespace Mikami;
+                        
+const int FS_ = 10000;  // 入力の標本化周波数: 10 kHz
+F446_Multirate myAdDa_; // 出力標本化周波数を4倍にするオブジェクト
+SerialRxTxIntr rxTx_;   // Serial クラスの受送信割込み用オブジェクト
+
+int main()
+{
+    printf("\r\n端末エミュレータでも使用可能\r\n");    
+
+    // 以下の割り込み優先順位の設定を忘れないこと
+    NVIC_SetPriority(ADC_IRQn, 0);      // ADC 終了割り込み:最優先
+    NVIC_SetPriority(USART2_IRQn, 1);   // USART2 割り込み:次に優先
+    
+    float volume = 0.5f;    // 音量を決める変数
+    bool sw = true;
+
+    myAdDa_.Start(FS_);     // 標本化を開始する
+    while (true)
+    {
+        //------------------------------------------------------------
+        // ここにディジタルフィルタ等の処理を記述する
+        float xn = myAdDa_.Input(); // 入力
+        float yn = sw ? volume*xn : 0;
+        myAdDa_.Output(yn);         // 出力
+        //------------------------------------------------------------
+
+        //------------------------------------------------------------
+        // PC からの指令に対応する処理
+        if (rxTx_.IsEol())          // 受信バッファのデータが有効になった場合の処理
+        {
+            string str = rxTx_.GetBuffer();
+            if (str.find("ENQ") != string::npos)
+                rxTx_.Tx("ACK");    // PC からの "ENQ" に対して "ACK" を送信する
+            else    // "ENQ" 以外の処理
+            {
+                if (isalpha(str[0]))    // 先頭が A ~ Z, a ~ z の場合
+                {
+                    if (str.find("ON") != string::npos)  sw = true;
+                    if (str.find("OFF") != string::npos) sw = false;  
+                }
+                else                    // 先頭が A ~ Z, a ~ z 以外の場合
+                    // float 型のデータとみなして数値化する
+                    volume =  atof(str.c_str());
+            }
+        }
+        // PC からの指令に対応する処理はここまで
+        //------------------------------------------------------------
+    }
+}