Example programs of AD and DA using classes in UITDSP_ADDA for ST Nucleo F401RE. UITDSP_ADDA に含まれるクラスを使った AD および DA のためのプログラムの例.ST Nucleo F401 用.
Dependencies: UITDSP_ADDA mbed
main.cpp
- Committer:
- MikamiUitOpen
- Date:
- 2015-07-25
- Revision:
- 5:019c0f09adf3
- Parent:
- 4:3c6b3d9e5415
File content as of revision 5:019c0f09adf3:
//------------------------------------------------------------------------------ // "UITDSP_ADDA" に含まれるライブラリの使用例 // // アナログ入力 // A0: ライン // A1: マイク // A2: 可変抵抗器 // // 2015/07/25, Copyright (c) 2015 MIKAMI, Naoki //------------------------------------------------------------------------------ #include "ADC_BuiltIn.hpp" // かならず必要 // 以下の "#define" 文を一つだけ有効にし,他はコメントとすること #define POLLING_1_CHANNEL //#define POLLING_SW_CHANNEL //#define INTERRUPT_1_CHANNEL //#define INTERRUPT_2_CHANNELS //#define POLLING_DA_2_CHANNELS using namespace Mikami; // かならず必要 //------------------------------------------------------------------------------ // 基本的な使い方:ポーリング,1チャンネル #ifdef POLLING_1_CHANNEL #include "DAC_MCP4922.hpp" // DAC MCP4922 用 const int FS_ = 10000; // 標本化周波数: 10 kHz ADC_BuiltIn adc_(A0, FS_); // A0 からの入力を使うように設定 DAC_MCP4922 myDac_; // DAC を使うための設定 int main() { printf("\r\nPOLLING_1_CHANNEL\r\n"); myDac_.ScfClockTim3(420000); // 出力の LPF の遮断周波数を 4.2 kHz に設定 while (true) { float xn = adc_.Read(); // A0 からの入力信号を読み込む //----------------------------------------------- // この部分に信号処理のプログラムを記述する float yn = xn; // 処理を行わず,そのまま出力する //----------------------------------------------- myDac_.Write(yn); // DAC へ出力する } } #endif // POLLING_1_CHANNEL //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // ポーリングで入力の切り替えを行う場合 #ifdef POLLING_SW_CHANNEL #include "DAC_MCP4922.hpp" const int FS_ = 10000; // 標本化周波数: 10 kHz ADC_BuiltIn adc_(A0, FS_, A1); // ADC の A0, A1 を使うための設定 DAC_MCP4921 myDac_; // DAC を使うための設定 DigitalIn sw_(D2, PullDown); int main() { printf("\r\nPOLLING_SW_CHANNEL\r\n"); myDac_.ScfClockTim3(420000); // 出力の LPF の遮断周波数を 4.2 kHz に設定する int swBefore = 0; while (true) { float xn = adc_.Read(); // A0 または A1 からの入力信号を読み込む //----------------------------------------------- float yn = xn; //----------------------------------------------- myDac_.Write(yn); // DAC へ出力する int swNow = sw_.read(); if (swNow != swBefore) { if (swNow == 0) adc_.Select1stChannel(); // 入力: ライン else adc_.Select2ndChannel(); // 入力: マイク swBefore = swNow; } } } #endif // POLLING_SW_CHANNEL //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // ADC の EOC 割り込みを使う場合,入力:1チャンネル #ifdef INTERRUPT_1_CHANNEL #include "ADC_Interrupt.hpp" // ADC 変換終了割り込みを使う場合 #include "DAC_MCP4922.hpp" const int FS_ = 10000; // 標本化周波数: 10 kHz ADC_Intr adc_(A0, FS_); // ADC の A0 を使うための設定 DAC_MCP4922 myDac_; // DAC を使うための設定 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン void AdcIsr() { float xn = adc_.Read(); // A0 からの入力信号を読み込む myDac_.Write(xn); // DAC へ出力する } int main() { printf("\r\nINTERRUPT_1_CHANNEL\r\n"); myDac_.ScfClockTim3(420000); // 出力の LPF の遮断周波数を 4.2 kHz に設定する // ADC 変換終了割り込みに対する割り込みサービス・ルーチンを割り当てる adc_.SetIntrVec(AdcIsr); // Assign ISR for ADC interrupt while (true) {} } #endif // INTERRUPT_1_CHANNEL //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // ADC の EOC 割り込みを使う場合で,2チャンネル使う場合 // A0 から読み込んだ信号の振幅を,A2 に接続されている半固定抵抗器で, // コントロールして出力する #ifdef INTERRUPT_2_CHANNELS #include "ADC_Interrupt.hpp" // ADC 変換終了割り込みを使う場合 #include "DAC_MCP4922.hpp" const int FS_ = 10000; // 標本化周波数: 10 kHz ADC_Intr adc_(A0, FS_, A2); // ADC の A0, A2 を使うための設定 DAC_MCP4922 myDac_; // DAC を使うための設定 uint16_t vr_ = 0; // A2 から読み込んだ現在の値 uint16_t vr1_ = 0; // A2 から,一つ前に読み込んだ値 float vol_ = 1.0f; // 出力の振幅の倍率 // ADC 変換終了割り込みに対する割り込みサービス・ルーチン void AdcIsr() { float xn = adc_.Read(); // A0 からの入力信号を読み込む adc_.Select2ndChannel(); // 入力チャンネルとして A2 を選択する adc_.SoftStart(); // AD 変換を開始する(ADC 変換終割り込みは禁止する) float yn = vol_*xn; // 出力信号の振幅を半固定抵抗器の値でコントロールする myDac_.Write(yn); // DAC へ出力する // 半固定抵抗器の値を A2 から読み込む vr_ = adc_.ReadWait_u16(); adc_.Select1stChannel(); // 入力チャンネルとして A0 を選択する adc_.ClearPending_EnableIRQ(); // 保留中の割り込みをクリアする } int main() { printf("\r\nINTERRUPT_2_CHANNELS\r\n"); myDac_.ScfClockTim3(420000); // 出力の LPF の遮断周波数を 4.2 kHz に設定する // ADC 変換終了割り込みに対する割り込みサービス・ルーチンを割り当てる adc_.SetIntrVec(AdcIsr); while (true) { if (abs(vr_ - vr1_) > 10) { vol_ = ((float)vr_)/4095.0f; vr1_ = vr_; } wait(0.1f); } } #endif // INTERRUPT_2_CHANNEL //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ // DAC を2チャンネル出力で使う場合, 入力:ポーリング,1チャンネル #ifdef POLLING_DA_2_CHANNELS #include "DAC_MCP4922Dual.hpp" const int FS_ = 10000; // 標本化周波数: 10 kHz ADC_BuiltIn adc_(A0, FS_); // ADC の A0 を使うための設定 DAC_MCP4922Dual myDac_; // DAC の2つのチャンネルを使うための設定 int main() { printf("\r\nPOLLING_DA_2_CHANNELS\r\n"); while (true) { float xn = adc_.Read(); // A0 からの入力信号を読み込む //----------------------------------------------- float yn = xn; //----------------------------------------------- myDac_.Write(yn, -yn); // DAC の2つのチャンネルへ出力する } } #endif // POLLING_DA_2_CHANNEL //------------------------------------------------------------------------------