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

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

Committer:
MikamiUitOpen
Date:
Mon Oct 08 07:44:11 2018 +0000
Revision:
5:5f98dddab84b
Parent:
4:3087a0841304
Child:
6:52578f592334
6

Who changed what in which revision?

UserRevisionLine numberNew 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 4:3087a0841304 9 // 音量調整あり/なしは PC からの指令により ACTIVE/THROUGH の切り替えが可能
MikamiUitOpen 0:5325ec2b5b02 10 //
MikamiUitOpen 5:5f98dddab84b 11 // PC 側にデータを送る際のフォーマット
MikamiUitOpen 5:5f98dddab84b 12 // 先頭の1文字で送る内容を区別する
MikamiUitOpen 5:5f98dddab84b 13 // L: ラベルに表示する文字列
MikamiUitOpen 5:5f98dddab84b 14 // S: スライダ(TrackBar)のツマミの位置
MikamiUitOpen 5:5f98dddab84b 15 // M: ステータス・バーに表示する文字列
MikamiUitOpen 5:5f98dddab84b 16 //
MikamiUitOpen 0:5325ec2b5b02 17 // PC 側のプログラム
MikamiUitOpen 0:5325ec2b5b02 18 // F446_AD_DA_Ctrl
MikamiUitOpen 0:5325ec2b5b02 19 // 端末エミュレータでも使用可能
MikamiUitOpen 0:5325ec2b5b02 20 //
MikamiUitOpen 5:5f98dddab84b 21 // 2018/10/08, Copyright (c) 2018 MIKAMI, Naoki
MikamiUitOpen 0:5325ec2b5b02 22 //----------------------------------------------------------------------
MikamiUitOpen 0:5325ec2b5b02 23
MikamiUitOpen 0:5325ec2b5b02 24 #include "F446_Multirate.hpp"
MikamiUitOpen 0:5325ec2b5b02 25 #include "SerialRxTxIntr.hpp"
MikamiUitOpen 4:3087a0841304 26 #include <cctype> // isalpha() で使用
MikamiUitOpen 0:5325ec2b5b02 27 #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため
MikamiUitOpen 0:5325ec2b5b02 28
MikamiUitOpen 0:5325ec2b5b02 29 using namespace Mikami;
MikamiUitOpen 0:5325ec2b5b02 30
MikamiUitOpen 0:5325ec2b5b02 31 const int FS_ = 10000; // 入力の標本化周波数: 10 kHz
MikamiUitOpen 0:5325ec2b5b02 32 F446_Multirate myAdDa_; // 出力標本化周波数を4倍にするオブジェクト
MikamiUitOpen 0:5325ec2b5b02 33 SerialRxTxIntr rxTx_; // Serial クラスの受送信割込み用オブジェクト
MikamiUitOpen 0:5325ec2b5b02 34
MikamiUitOpen 4:3087a0841304 35 // パラメータの値を送信(必要に応じて sprintf() の内容を変えること)
MikamiUitOpen 4:3087a0841304 36 void SendParm(float parm)
MikamiUitOpen 4:3087a0841304 37 {
MikamiUitOpen 4:3087a0841304 38 char buf[32];
MikamiUitOpen 5:5f98dddab84b 39 sprintf(buf, "L音量: %3d %%\n", (int)(parm*100));
MikamiUitOpen 4:3087a0841304 40 rxTx_.Tx(buf); // label1 に表示する文字列を送信
MikamiUitOpen 4:3087a0841304 41 }
MikamiUitOpen 4:3087a0841304 42
MikamiUitOpen 0:5325ec2b5b02 43 int main()
MikamiUitOpen 0:5325ec2b5b02 44 {
MikamiUitOpen 1:54515e9b1796 45 printf("\r\n端末エミュレータでも使用可能\r\n");
MikamiUitOpen 3:42f9127d578d 46 printf("端末エミュレータから数値を入力する場合は 0 ~ 65535 の\r\n");
MikamiUitOpen 3:42f9127d578d 47 printf("範囲の数値を入力してください\r\n");
MikamiUitOpen 1:54515e9b1796 48 rxTx_.EchobackEnable(); // エコーバックを有効にする
MikamiUitOpen 0:5325ec2b5b02 49
MikamiUitOpen 0:5325ec2b5b02 50 // 以下の割り込み優先順位の設定を忘れないこと
MikamiUitOpen 0:5325ec2b5b02 51 NVIC_SetPriority(ADC_IRQn, 0); // ADC 終了割り込み:最優先
MikamiUitOpen 0:5325ec2b5b02 52 NVIC_SetPriority(USART2_IRQn, 1); // USART2 割り込み:次に優先
MikamiUitOpen 0:5325ec2b5b02 53
MikamiUitOpen 4:3087a0841304 54 float volume = 0.4f; // 音量を決める変数(初期値)
MikamiUitOpen 0:5325ec2b5b02 55 bool sw = true;
MikamiUitOpen 0:5325ec2b5b02 56
MikamiUitOpen 0:5325ec2b5b02 57 myAdDa_.Start(FS_); // 標本化を開始する
MikamiUitOpen 0:5325ec2b5b02 58 while (true)
MikamiUitOpen 0:5325ec2b5b02 59 {
MikamiUitOpen 0:5325ec2b5b02 60 //------------------------------------------------------------
MikamiUitOpen 0:5325ec2b5b02 61 // ここにディジタルフィルタ等の処理を記述する
MikamiUitOpen 0:5325ec2b5b02 62 float xn = myAdDa_.Input(); // 入力
MikamiUitOpen 3:42f9127d578d 63 float yn = sw ? volume*xn : xn;
MikamiUitOpen 0:5325ec2b5b02 64 myAdDa_.Output(yn); // 出力
MikamiUitOpen 0:5325ec2b5b02 65 //------------------------------------------------------------
MikamiUitOpen 0:5325ec2b5b02 66
MikamiUitOpen 0:5325ec2b5b02 67 //------------------------------------------------------------
MikamiUitOpen 0:5325ec2b5b02 68 // PC からの指令に対応する処理
MikamiUitOpen 0:5325ec2b5b02 69 if (rxTx_.IsEol()) // 受信バッファのデータが有効になった場合の処理
MikamiUitOpen 0:5325ec2b5b02 70 {
MikamiUitOpen 0:5325ec2b5b02 71 string str = rxTx_.GetBuffer();
MikamiUitOpen 3:42f9127d578d 72 if (str == "ENQ")
MikamiUitOpen 3:42f9127d578d 73 {
MikamiUitOpen 4:3087a0841304 74 rxTx_.Tx("ACK\n"); // PC からの "ENQ" に対して "ACK" を送信する
MikamiUitOpen 4:3087a0841304 75 SendParm(volume); // 最初に label1 に表示する文字列を送信
MikamiUitOpen 4:3087a0841304 76
MikamiUitOpen 3:42f9127d578d 77 char buf[16];
MikamiUitOpen 4:3087a0841304 78 sprintf(buf, "S%5d\n", (uint32_t)(65535*volume));
MikamiUitOpen 4:3087a0841304 79 rxTx_.Tx(buf); // スライダ(TrackBar)の位置を送信
MikamiUitOpen 5:5f98dddab84b 80
MikamiUitOpen 5:5f98dddab84b 81 rxTx_.Tx("M入力信号をそのまま出力\n");
MikamiUitOpen 3:42f9127d578d 82 }
MikamiUitOpen 0:5325ec2b5b02 83 else // "ENQ" 以外の処理
MikamiUitOpen 0:5325ec2b5b02 84 {
MikamiUitOpen 0:5325ec2b5b02 85 if (isalpha(str[0])) // 先頭が A ~ Z, a ~ z の場合
MikamiUitOpen 0:5325ec2b5b02 86 {
MikamiUitOpen 3:42f9127d578d 87 // 大文字に変換する
MikamiUitOpen 3:42f9127d578d 88 for (int n=0; n<str.size(); n++)
MikamiUitOpen 3:42f9127d578d 89 str[n] = toupper(str[n]);
MikamiUitOpen 3:42f9127d578d 90
MikamiUitOpen 3:42f9127d578d 91 if (str == "ACTIVE") sw = true;
MikamiUitOpen 3:42f9127d578d 92 if (str == "THROUGH") sw = false;
MikamiUitOpen 0:5325ec2b5b02 93 }
MikamiUitOpen 0:5325ec2b5b02 94 else // 先頭が A ~ Z, a ~ z 以外の場合
MikamiUitOpen 3:42f9127d578d 95 {
MikamiUitOpen 0:5325ec2b5b02 96 // float 型のデータとみなして数値化する
MikamiUitOpen 4:3087a0841304 97 // 送信されたデータを基にパラメータを変更する
MikamiUitOpen 3:42f9127d578d 98 volume = atoi(str.c_str())/65535.0f;
MikamiUitOpen 4:3087a0841304 99
MikamiUitOpen 4:3087a0841304 100 // パラメータの値を送信
MikamiUitOpen 4:3087a0841304 101 SendParm(volume);
MikamiUitOpen 3:42f9127d578d 102 }
MikamiUitOpen 0:5325ec2b5b02 103 }
MikamiUitOpen 0:5325ec2b5b02 104 }
MikamiUitOpen 0:5325ec2b5b02 105 // PC からの指令に対応する処理はここまで
MikamiUitOpen 0:5325ec2b5b02 106 //------------------------------------------------------------
MikamiUitOpen 0:5325ec2b5b02 107 }
MikamiUitOpen 0:5325ec2b5b02 108 }
MikamiUitOpen 3:42f9127d578d 109
MikamiUitOpen 5:5f98dddab84b 110