PC から,リアルタイム信号処理を行っている Nucleo-F446 を制御する例.
Dependencies: mbed SerialTxRxIntr F446_AD_DA_Multirate
Diff: main.cpp
- 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 からの指令に対応する処理はここまで + //------------------------------------------------------------ + } +}