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

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

Committer:
MikamiUitOpen
Date:
Sun Oct 07 11:37:07 2018 +0000
Revision:
4:3087a0841304
Parent:
3:42f9127d578d
Child:
5:5f98dddab84b
5

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