PC から,リアルタイム信号処理を行っている Nucleo-F446 を制御する例.
Dependencies: mbed SerialTxRxIntr F446_AD_DA_Multirate
main.cpp@14:2f1af14e6c0d, 2021-04-12 (annotated)
- Committer:
- MikamiUitOpen
- Date:
- Mon Apr 12 11:52:59 2021 +0000
- Revision:
- 14:2f1af14e6c0d
- Parent:
- 13:bcaee883b812
15
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 | 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 ¶m); // 受信バッファのデータが有効になった場合の処理 |
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 ¶m) |
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 | } |