PC から,リアルタイム信号処理を行っている Nucleo-F446 を制御する例.
Dependencies: mbed SerialTxRxIntr F446_AD_DA_Multirate
main.cpp@1:54515e9b1796, 2018-07-09 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Jul 09 08:58:55 2018 +0000
- Revision:
- 1:54515e9b1796
- Parent:
- 0:5325ec2b5b02
- Child:
- 2:1aff436cba4a
2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MikamiUitOpen | 0:5325ec2b5b02 | 1 | //---------------------------------------------------------------------- |
MikamiUitOpen | 0:5325ec2b5b02 | 2 | // NUCLEO-F446RE で アナログ信号の入出力の際に,出力の標本化周波数を,入力の |
MikamiUitOpen | 0:5325ec2b5b02 | 3 | // 標本化周波数の4倍にするクラス F446_Multirate を使い,PC からの指令でパラ |
MikamiUitOpen | 0:5325ec2b5b02 | 4 | // メータを変更する例 |
MikamiUitOpen | 0:5325ec2b5b02 | 5 | // |
MikamiUitOpen | 0:5325ec2b5b02 | 6 | // 処理の内容:AD 変換器からの入力に倍率を乗算し DA 変換器に出力する |
MikamiUitOpen | 0:5325ec2b5b02 | 7 | // 倍率は PC からの指令で変更する |
MikamiUitOpen | 0:5325ec2b5b02 | 8 | // PC からの指令: 0.00 ~ 1.00 倍 |
MikamiUitOpen | 0:5325ec2b5b02 | 9 | // 出力は PC からの指令により On/Off の切り替えが可能 |
MikamiUitOpen | 0:5325ec2b5b02 | 10 | // |
MikamiUitOpen | 0:5325ec2b5b02 | 11 | // "ENQ” を除く PC からの指令については,そのまま PC へ送る |
MikamiUitOpen | 0:5325ec2b5b02 | 12 | // |
MikamiUitOpen | 0:5325ec2b5b02 | 13 | // PC 側のプログラム |
MikamiUitOpen | 0:5325ec2b5b02 | 14 | // F446_AD_DA_Ctrl |
MikamiUitOpen | 0:5325ec2b5b02 | 15 | // 端末エミュレータでも使用可能 |
MikamiUitOpen | 0:5325ec2b5b02 | 16 | // |
MikamiUitOpen | 0:5325ec2b5b02 | 17 | // 2018/07/09, Copyright (c) 2018 MIKAMI, Naoki |
MikamiUitOpen | 0:5325ec2b5b02 | 18 | //---------------------------------------------------------------------- |
MikamiUitOpen | 0:5325ec2b5b02 | 19 | |
MikamiUitOpen | 0:5325ec2b5b02 | 20 | #include "F446_Multirate.hpp" |
MikamiUitOpen | 0:5325ec2b5b02 | 21 | #include "SerialRxTxIntr.hpp" |
MikamiUitOpen | 0:5325ec2b5b02 | 22 | #include <cctype> |
MikamiUitOpen | 0:5325ec2b5b02 | 23 | #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため |
MikamiUitOpen | 0:5325ec2b5b02 | 24 | |
MikamiUitOpen | 0:5325ec2b5b02 | 25 | using namespace Mikami; |
MikamiUitOpen | 0:5325ec2b5b02 | 26 | |
MikamiUitOpen | 0:5325ec2b5b02 | 27 | const int FS_ = 10000; // 入力の標本化周波数: 10 kHz |
MikamiUitOpen | 0:5325ec2b5b02 | 28 | F446_Multirate myAdDa_; // 出力標本化周波数を4倍にするオブジェクト |
MikamiUitOpen | 0:5325ec2b5b02 | 29 | SerialRxTxIntr rxTx_; // Serial クラスの受送信割込み用オブジェクト |
MikamiUitOpen | 0:5325ec2b5b02 | 30 | |
MikamiUitOpen | 0:5325ec2b5b02 | 31 | int main() |
MikamiUitOpen | 0:5325ec2b5b02 | 32 | { |
MikamiUitOpen | 1:54515e9b1796 | 33 | printf("\r\n端末エミュレータでも使用可能\r\n"); |
MikamiUitOpen | 1:54515e9b1796 | 34 | rxTx_.EchobackEnable(); // エコーバックを有効にする |
MikamiUitOpen | 0:5325ec2b5b02 | 35 | |
MikamiUitOpen | 0:5325ec2b5b02 | 36 | // 以下の割り込み優先順位の設定を忘れないこと |
MikamiUitOpen | 0:5325ec2b5b02 | 37 | NVIC_SetPriority(ADC_IRQn, 0); // ADC 終了割り込み:最優先 |
MikamiUitOpen | 0:5325ec2b5b02 | 38 | NVIC_SetPriority(USART2_IRQn, 1); // USART2 割り込み:次に優先 |
MikamiUitOpen | 0:5325ec2b5b02 | 39 | |
MikamiUitOpen | 0:5325ec2b5b02 | 40 | float volume = 0.5f; // 音量を決める変数 |
MikamiUitOpen | 0:5325ec2b5b02 | 41 | bool sw = true; |
MikamiUitOpen | 0:5325ec2b5b02 | 42 | |
MikamiUitOpen | 0:5325ec2b5b02 | 43 | myAdDa_.Start(FS_); // 標本化を開始する |
MikamiUitOpen | 0:5325ec2b5b02 | 44 | while (true) |
MikamiUitOpen | 0:5325ec2b5b02 | 45 | { |
MikamiUitOpen | 0:5325ec2b5b02 | 46 | //------------------------------------------------------------ |
MikamiUitOpen | 0:5325ec2b5b02 | 47 | // ここにディジタルフィルタ等の処理を記述する |
MikamiUitOpen | 0:5325ec2b5b02 | 48 | float xn = myAdDa_.Input(); // 入力 |
MikamiUitOpen | 0:5325ec2b5b02 | 49 | float yn = sw ? volume*xn : 0; |
MikamiUitOpen | 0:5325ec2b5b02 | 50 | myAdDa_.Output(yn); // 出力 |
MikamiUitOpen | 0:5325ec2b5b02 | 51 | //------------------------------------------------------------ |
MikamiUitOpen | 0:5325ec2b5b02 | 52 | |
MikamiUitOpen | 0:5325ec2b5b02 | 53 | //------------------------------------------------------------ |
MikamiUitOpen | 0:5325ec2b5b02 | 54 | // PC からの指令に対応する処理 |
MikamiUitOpen | 0:5325ec2b5b02 | 55 | if (rxTx_.IsEol()) // 受信バッファのデータが有効になった場合の処理 |
MikamiUitOpen | 0:5325ec2b5b02 | 56 | { |
MikamiUitOpen | 0:5325ec2b5b02 | 57 | string str = rxTx_.GetBuffer(); |
MikamiUitOpen | 0:5325ec2b5b02 | 58 | if (str.find("ENQ") != string::npos) |
MikamiUitOpen | 0:5325ec2b5b02 | 59 | rxTx_.Tx("ACK"); // PC からの "ENQ" に対して "ACK" を送信する |
MikamiUitOpen | 0:5325ec2b5b02 | 60 | else // "ENQ" 以外の処理 |
MikamiUitOpen | 0:5325ec2b5b02 | 61 | { |
MikamiUitOpen | 0:5325ec2b5b02 | 62 | if (isalpha(str[0])) // 先頭が A ~ Z, a ~ z の場合 |
MikamiUitOpen | 0:5325ec2b5b02 | 63 | { |
MikamiUitOpen | 0:5325ec2b5b02 | 64 | if (str.find("ON") != string::npos) sw = true; |
MikamiUitOpen | 0:5325ec2b5b02 | 65 | if (str.find("OFF") != string::npos) sw = false; |
MikamiUitOpen | 0:5325ec2b5b02 | 66 | } |
MikamiUitOpen | 0:5325ec2b5b02 | 67 | else // 先頭が A ~ Z, a ~ z 以外の場合 |
MikamiUitOpen | 0:5325ec2b5b02 | 68 | // float 型のデータとみなして数値化する |
MikamiUitOpen | 0:5325ec2b5b02 | 69 | volume = atof(str.c_str()); |
MikamiUitOpen | 0:5325ec2b5b02 | 70 | } |
MikamiUitOpen | 0:5325ec2b5b02 | 71 | } |
MikamiUitOpen | 0:5325ec2b5b02 | 72 | // PC からの指令に対応する処理はここまで |
MikamiUitOpen | 0:5325ec2b5b02 | 73 | //------------------------------------------------------------ |
MikamiUitOpen | 0:5325ec2b5b02 | 74 | } |
MikamiUitOpen | 0:5325ec2b5b02 | 75 | } |