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

Dependencies:   mbed SerialTxRxIntr F446_AD_DA_Multirate

Committer:
MikamiUitOpen
Date:
Mon Apr 12 11:52:59 2021 +0000
Revision:
14:2f1af14e6c0d
Parent:
13:bcaee883b812
15

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 8:0f3c8d40f2b5 7 // 倍率は PC からの指令で変更する
MikamiUitOpen 8:0f3c8d40f2b5 8 // PC からの指令: 0 ~ 5000(0.0 ~ 1.0 倍に対応)
MikamiUitOpen 8:0f3c8d40f2b5 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 14:2f1af14e6c0d 20 // 2020/04/12, Copyright (c) 2020 MIKAMI, Naoki
MikamiUitOpen 0:5325ec2b5b02 21 //----------------------------------------------------------------------
MikamiUitOpen 0:5325ec2b5b02 22
MikamiUitOpen 0:5325ec2b5b02 23 #include "F446_Multirate.hpp"
MikamiUitOpen 0:5325ec2b5b02 24 #include "SerialRxTxIntr.hpp"
MikamiUitOpen 4:3087a0841304 25 #include <cctype> // isalpha() で使用
MikamiUitOpen 0:5325ec2b5b02 26 #pragma diag_suppress 870 // マルチバイト文字使用の警告抑制のため
MikamiUitOpen 0:5325ec2b5b02 27
MikamiUitOpen 0:5325ec2b5b02 28 using namespace Mikami;
MikamiUitOpen 13:bcaee883b812 29
MikamiUitOpen 13:bcaee883b812 30 const int FS_ = 10000; // 入力の標本化周波数: 10 kHz
MikamiUitOpen 13:bcaee883b812 31 F446_Multirate myAdDa_; // 出力標本化周波数を4倍にするオブジェクト
MikamiUitOpen 13:bcaee883b812 32 SerialRxTxIntr rxTx_(32, 115200); // Serial クラスの受送信割込み用オブジェクト
MikamiUitOpen 13:bcaee883b812 33 // ボーレート:115,200 baud
MikamiUitOpen 0:5325ec2b5b02 34
MikamiUitOpen 8:0f3c8d40f2b5 35 void SendParm(float param); // パラメータの値を送信
MikamiUitOpen 8:0f3c8d40f2b5 36 void Respond(bool &sw, float &param); // 受信バッファのデータが有効になった場合の処理
MikamiUitOpen 4:3087a0841304 37
MikamiUitOpen 0:5325ec2b5b02 38 int main()
MikamiUitOpen 0:5325ec2b5b02 39 {
MikamiUitOpen 0:5325ec2b5b02 40 // 以下の割り込み優先順位の設定を忘れないこと
MikamiUitOpen 0:5325ec2b5b02 41 NVIC_SetPriority(ADC_IRQn, 0); // ADC 終了割り込み:最優先
MikamiUitOpen 0:5325ec2b5b02 42 NVIC_SetPriority(USART2_IRQn, 1); // USART2 割り込み:次に優先
MikamiUitOpen 13:bcaee883b812 43
MikamiUitOpen 4:3087a0841304 44 float volume = 0.4f; // 音量を決める変数(初期値)
MikamiUitOpen 0:5325ec2b5b02 45 bool sw = true;
MikamiUitOpen 0:5325ec2b5b02 46
MikamiUitOpen 14:2f1af14e6c0d 47 myAdDa_.Start(FS_, A1); // 標本化を開始する,入力:A1
MikamiUitOpen 0:5325ec2b5b02 48 while (true)
MikamiUitOpen 0:5325ec2b5b02 49 {
MikamiUitOpen 0:5325ec2b5b02 50 //------------------------------------------------------------
MikamiUitOpen 0:5325ec2b5b02 51 // ここにディジタルフィルタ等の処理を記述する
MikamiUitOpen 0:5325ec2b5b02 52 float xn = myAdDa_.Input(); // 入力
MikamiUitOpen 3:42f9127d578d 53 float yn = sw ? volume*xn : xn;
MikamiUitOpen 0:5325ec2b5b02 54 myAdDa_.Output(yn); // 出力
MikamiUitOpen 0:5325ec2b5b02 55 //------------------------------------------------------------
MikamiUitOpen 0:5325ec2b5b02 56
MikamiUitOpen 8:0f3c8d40f2b5 57 Respond(sw, volume); // PC からの指令に対応する処理
MikamiUitOpen 0:5325ec2b5b02 58 }
MikamiUitOpen 0:5325ec2b5b02 59 }
MikamiUitOpen 3:42f9127d578d 60
MikamiUitOpen 8:0f3c8d40f2b5 61 // 受信バッファのデータが有効になった場合の処理
MikamiUitOpen 8:0f3c8d40f2b5 62 // 必要に応じて param の計算方法を変更すること
MikamiUitOpen 8:0f3c8d40f2b5 63 void Respond(bool &sw, float &param)
MikamiUitOpen 8:0f3c8d40f2b5 64 {
MikamiUitOpen 8:0f3c8d40f2b5 65 if (!rxTx_.IsEol()) return; // 受信バッファのデータが有効ではない場合は処理を行わない
MikamiUitOpen 5:5f98dddab84b 66
MikamiUitOpen 8:0f3c8d40f2b5 67 string str = rxTx_.GetBuffer();
MikamiUitOpen 8:0f3c8d40f2b5 68 if (str == "ENQ")
MikamiUitOpen 8:0f3c8d40f2b5 69 {
MikamiUitOpen 13:bcaee883b812 70 rxTx_.TxString("ACK\n"); // PC からの "ENQ" に対して "ACK" を送信する
MikamiUitOpen 13:bcaee883b812 71 SendParm(param); // 最初に Label に表示する文字列を送信
MikamiUitOpen 8:0f3c8d40f2b5 72
MikamiUitOpen 8:0f3c8d40f2b5 73 char buf[16];
MikamiUitOpen 8:0f3c8d40f2b5 74 sprintf(buf, "S%5d\n", (uint32_t)(5000*param));
MikamiUitOpen 13:bcaee883b812 75 rxTx_.TxString(buf); // 起動時のスライダ(TrackBar)の位置を送信
MikamiUitOpen 8:0f3c8d40f2b5 76
MikamiUitOpen 13:bcaee883b812 77 rxTx_.TxString("M入力信号をそのまま出力します.\n");
MikamiUitOpen 8:0f3c8d40f2b5 78 }
MikamiUitOpen 8:0f3c8d40f2b5 79 else // "ENQ" 以外の処理
MikamiUitOpen 8:0f3c8d40f2b5 80 {
MikamiUitOpen 8:0f3c8d40f2b5 81 if (isalpha(str[0])) // 先頭が A ~ Z, a ~ z の場合
MikamiUitOpen 8:0f3c8d40f2b5 82 {
MikamiUitOpen 8:0f3c8d40f2b5 83 if (str == "ACTIVE") sw = true;
MikamiUitOpen 8:0f3c8d40f2b5 84 if (str == "THROUGH") sw = false;
MikamiUitOpen 8:0f3c8d40f2b5 85 }
MikamiUitOpen 8:0f3c8d40f2b5 86 else // 先頭が A ~ Z, a ~ z 以外の場合
MikamiUitOpen 8:0f3c8d40f2b5 87 {
MikamiUitOpen 8:0f3c8d40f2b5 88 // PC から送信されるデータの範囲: 0 ~ 5000
MikamiUitOpen 8:0f3c8d40f2b5 89 // param の値に変換する,0 <= param <= 1
MikamiUitOpen 8:0f3c8d40f2b5 90 param = atoi(str.c_str())/5000.0f;
MikamiUitOpen 8:0f3c8d40f2b5 91
MikamiUitOpen 8:0f3c8d40f2b5 92 // PC の Label に表示する文字列を送信
MikamiUitOpen 8:0f3c8d40f2b5 93 SendParm(param);
MikamiUitOpen 8:0f3c8d40f2b5 94 }
MikamiUitOpen 8:0f3c8d40f2b5 95 }
MikamiUitOpen 8:0f3c8d40f2b5 96 }
MikamiUitOpen 8:0f3c8d40f2b5 97
MikamiUitOpen 8:0f3c8d40f2b5 98 // パラメータの値を送信(必要に応じて sprintf() の内容を変えること)
MikamiUitOpen 8:0f3c8d40f2b5 99 void SendParm(float param)
MikamiUitOpen 8:0f3c8d40f2b5 100 {
MikamiUitOpen 8:0f3c8d40f2b5 101 char buf[32];
MikamiUitOpen 8:0f3c8d40f2b5 102 // Tera Term を使わない場合は,"\r" は無くても構わない
MikamiUitOpen 8:0f3c8d40f2b5 103 sprintf(buf, "L音量: %3d %%\r\n", (int)(param*100));
MikamiUitOpen 13:bcaee883b812 104 rxTx_.TxString(buf); // label1 に表示する文字列を送信
MikamiUitOpen 13:bcaee883b812 105 }